{"version":3,"file":"default/js/productDetail.js","mappings":";;;;;;;;;;AAAA;AACa;;;AAGb;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,iBAAiB;;AAEjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,iBAAiB;;AAEjB;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA,cAAc;AACd;AACA;AACA,SAAS;AACT,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;;;;;;;;;;;;AC/DA;AACa;;AAEb;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,QAAQ;AACpB;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB,cAAc,sBAAsB;AACpC;;AAEA;AACA;AACA;AACA,WAAW,yBAAyB;AACpC,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,WAAW,UAAU;AACrB,WAAW,SAAS;AACpB;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT,MAAM;AACN;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,SAAS;AACvB,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB;AACA;;AAEA;AACA;AACA,WAAW,mBAAmB;AAC9B,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,8CAA8C,WAAW,EAAE,mBAAmB;AAC9E;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA,cAAc,qDAAqD;;AAEnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA,YAAY,QAAQ;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA,YAAY,QAAQ;AACpB;AACA;AACA;;AAEA;AACA;;AAEA,aAAa;AACb;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,UAAU;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;;AAEA;AACA;AACA;AACA,WAAW,kBAAkB;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,qCAAqC;AACrC,+CAA+C;AAC/C;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,iBAAiB;AACjB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,iBAAiB;AACjB;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;;;;;;;;;;;;ACx5Ba;AACb,WAAW,mBAAO,CAAC,wFAAQ;;AAE3B;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,6CAA6C,mCAAmC;;AAEhF;AACA,6CAA6C,wCAAwC;;AAErF;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;;AAEL;AACA;;;;;;;;;;;;ACnJa;;AAEb,WAAW,mBAAO,CAAC,wFAAQ;AAC3B,aAAa,mBAAO,CAAC,4FAAU;;AAE/B,+BAA+B,kBAAkB;;AAEjD;;;;;;;;;;;;ACPa;;AAEb,mBAAO,CAAC,qDAAO;;AAEf,oBAAoB,mBAAO,CAAC,2GAAsB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,gEAAgE;;AAEhE;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;;AAEA;AACA,SAAS;AACT;AACA;;;;;;;;;;;ACvGA;AACA;AACA;;AAEA;AACA,4CAA4C,qBAAqB;AACjE;;AAEA;AACA;AACA;AACA;;;;;;;;;;;;ACXa;;AAEb;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AClCa;AACb,kBAAkB,mBAAO,CAAC,6GAAqB;;AAE/C;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,QAAQ;AACpB;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;;AAEA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;;AAEA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,WAAW,OAAO;AAClB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB;;AAEA;AACA;AACA;AACA,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB,cAAc,sBAAsB;AACpC;;AAEA;AACA;AACA;AACA,WAAW,yBAAyB;AACpC,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,UAAU;AACrB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,UAAU;AACrB,WAAW,UAAU;AACrB,WAAW,SAAS;AACpB;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT,MAAM;AACN;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,SAAS;AACvB,cAAc,QAAQ;AACtB,cAAc,QAAQ;AACtB;AACA;;AAEA;AACA;AACA,WAAW,mBAAmB;AAC9B,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA,cAAc,qDAAqD;;AAEnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,0CAA0C;AAChE;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA,YAAY,QAAQ;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA,YAAY,QAAQ;AACpB;AACA;AACA;;AAEA;AACA;;AAEA,aAAa;AACb;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY,UAAU;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,YAAY,QAAQ;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;;AAET;AACA;;AAEA;AACA;AACA;AACA,WAAW,kBAAkB;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,iBAAiB;AACjB;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;;AAEA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB,sBAAsB;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA,iBAAiB;AACjB;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;;;;;;;;;;;;AC/0BA;AACa;;AAEb;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,SAAS;;AAET;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;;AAET;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,aAAa;AACxB,aAAa,SAAS;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;;AAEtB,2DAA2D;;AAE3D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB,aAAa;AACb,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;;;;;;;;;;;;ACvQa;;AAEb;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;;;;;;;;;;ACZa;;AAEb,WAAW,mBAAO,CAAC,uGAAmB;;AAEtC;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA,SAAS;AACT,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;;AAEA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;;;;;;;;;;;;ACjFa;;AAEb,mBAAmB,mBAAO,CAAC,iIAAgC;;AAE3D;AACA;AACA,WAAW,aAAa;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,aAAa;AACxB;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA,uDAAuD,sBAAsB;AAC7E;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA,WAAW,aAAa;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA,iBAAiB;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa;;AAEb;AACA;AACA,aAAa;;AAEb;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;;AAEjB,uDAAuD;AACvD;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,SAAS;AACT,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;;;;;;;;;ACpRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,oBAAoB,6BAA6B,4BAA4B,sDAAsD,SAAS,sMAAsM,wBAAwB,cAAc,gBAAgB,cAAc,sHAAsH,kIAAkI,kCAAkC,cAAc,+BAA+B,OAAO,kHAAkH,cAAc,MAAM,6GAA6G,mEAAmE,GAAG,qBAAqB,mCAAmC,mCAAmC,wBAAwB,yIAAyI,eAAe,iCAAiC,WAAW,mBAAmB,EAAE,iBAAiB,QAAQ,qNAAqN,iBAAiB,SAAS,eAAe,eAAe,cAAc,kCAAkC,sSAAsS,iBAAiB,SAAS,eAAe,4EAA4E,iBAAiB,mLAAmL,cAAc,qEAAqE,eAAe,yCAAyC,gBAAgB,yBAAyB,2PAA2P,iBAAiB,oDAAoD,sDAAsD,0EAA0E,yBAAyB,UAAU,iCAAiC,qCAAqC,MAAM,sCAAsC,MAAM,wCAAwC,MAAM,+CAA+C,oBAAoB,8JAA8J,0BAA0B,QAAQ,uOAAuO,2BAA2B,+VAA+V,QAAQ,QAAQ,6IAA6I,gDAAgD,2EAA2E,8BAA8B,4HAA4H,UAAU,uFAAuF,sCAAsC,4DAA4D,mIAAmI,iCAAiC,qHAAqH,0CAA0C,yJAAyJ,8CAA8C,MAAM,oCAAoC,MAAM,qCAAqC,MAAM,sCAAsC,MAAM,wCAAwC,MAAM,+CAA+C,gYAAgY,wCAAwC,0HAA0H,2BAA2B,6QAA6Q,wCAAwC,sNAAsN,wCAAwC,UAAU,wCAAwC,SAAS,2BAA2B,qIAAqI,sEAAsE,cAAc,SAAS,+MAA+M,0CAA0C,MAAM,4CAA4C,eAAe,EAAE,MAAM,iCAAiC,+HAA+H,UAAU,SAAS,UAAU,SAAS,UAAU,6BAA6B,UAAU,iEAAiE,+EAA+E,MAAM,wEAAwE,MAAM,yEAAyE,MAAM,6CAA6C,MAAM,8CAA8C,OAAO,aAAa,2BAA2B,6GAA6G,8MAA8M,8BAA8B,SAAS,UAAU,SAAS,UAAU,4CAA4C,UAAU,oEAAoE,UAAU,4JAA4J,2CAA2C,WAAW,kNAAkN,sGAAsG,EAAE,2BAA2B,kCAAkC,gBAAgB,mKAAmK,iBAAiB,SAAS,eAAe,2BAA2B,8BAA8B,wBAAwB,+BAA+B,0BAA0B,gCAAgC,yBAAyB,8BAA8B,2BAA2B,6CAA6C,0BAA0B,0BAA0B,mBAAmB,GAAG,6BAA6B,8CAA8C,2BAA2B,0BAA0B,4BAA4B,4BAA4B,uBAAuB,sBAAsB,2WAA2W,oEAAoE,kCAAkC,yBAAyB,gBAAgB,2BAA2B,wKAAwK,KAAK,QAAQ,yBAAyB,6BAA6B,YAAY,mBAAmB,QAAQ,KAAK,mBAAmB,OAAO,iCAAiC,0BAA0B,iBAAiB,cAAc,4NAA4N,8FAA8F,uDAAuD,WAAW,GAAG,yDAAyD,qKAAqK,kNAAkN,cAAc,wFAAwF,QAAQ,kBAAkB,iCAAiC,8BAA8B,sBAAsB,wBAAwB,8DAA8D,eAAe,+CAA+C,iCAAiC,8DAA8D,eAAe,kEAAkE,EAAE,2BAA2B,SAAS,8DAA8D,eAAe,+CAA+C,EAAE,0EAA0E,uBAAuB,6hBAA6hB;;;;;;UCPzmZ;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;;;;;;ACtBA;;AAEa;;AAEb,uBAAuB,mBAAO,CAAC,uFAAW;;AAE1C;AACA,mBAAmB,mBAAO,CAAC,sGAAmB;AAC9C,mBAAmB,mBAAO,CAAC,0GAAqB;AAChD,mBAAmB,mBAAO,CAAC,sJAAkD;AAC7E,mBAAmB,mBAAO,CAAC,sIAA0C;AACrE,mBAAmB,mBAAO,CAAC,kHAAyB;AACpD,CAAC","sources":["webpack://sfra-startup-kit/./cartridges/app_ballantynes/cartridge/client/default/js/components/swatchHide.js","webpack://sfra-startup-kit/./cartridges/app_ballantynes/cartridge/client/default/js/product/base.js","webpack://sfra-startup-kit/./cartridges/app_ballantynes/cartridge/client/default/js/product/detail.js","webpack://sfra-startup-kit/./cartridges/app_ballantynes/cartridge/client/default/js/product/details.js","webpack://sfra-startup-kit/./cartridges/app_ballantynes/cartridge/client/default/js/product/initXZoom.js","webpack://sfra-startup-kit/./cartridges/app_ballantynes/cartridge/client/default/js/utils/breakpoints.js","webpack://sfra-startup-kit/./cartridges/app_storefront_base/cartridge/client/default/js/components/focus.js","webpack://sfra-startup-kit/./cartridges/app_storefront_base/cartridge/client/default/js/product/base.js","webpack://sfra-startup-kit/./cartridges/app_storefront_base/cartridge/client/default/js/storeLocator/storeLocator.js","webpack://sfra-startup-kit/./cartridges/app_storefront_base/cartridge/client/default/js/util.js","webpack://sfra-startup-kit/./cartridges/plugin_giftregistry/cartridge/client/default/js/product/giftRegistry.js","webpack://sfra-startup-kit/./cartridges/plugin_instorepickup/cartridge/client/default/js/product/pdpInstoreInventory.js","webpack://sfra-startup-kit/./node_modules/xzoom/dist/xzoom.min.js","webpack://sfra-startup-kit/webpack/bootstrap","webpack://sfra-startup-kit/./cartridges/app_ballantynes/cartridge/client/default/js/productDetail.js"],"sourcesContent":["/* eslint-disable no-undef */\n\"use strict\";\n\n\n// Call the function to set up the hover effect\n$(document).ready(function () {\n    checkPdpSwatchImages();\n});\n\nfunction checkPdpSwatchImages() {\n    // Select all PDP tiles that contain swatches\n    const pdpTiles = document.querySelectorAll(\".pdp-attributes\");\n\n    pdpTiles.forEach(tile => {\n        // Select all swatches within the current tile\n        const swatches = tile.querySelectorAll(\".color-attribute\");\n\n        swatches.forEach(swatch => {\n            const img = swatch.querySelector(\"img\");\n            if (img) {\n                // Add an event listener for the error event\n                img.addEventListener(\"error\", function () {\n                    checkImageStatus(img.src, function (is404) {\n                        if (is404) {\n                            swatch.classList.add(\"d-none\");\n                        }\n                    });\n                });\n\n                // Check if the image is already broken after it has loaded\n                img.addEventListener(\"load\", function () {\n                    if (!img.complete || img.naturalWidth === 0) {\n                        checkImageStatus(img.src, function (is404) {\n                            if (is404) {\n                                swatch.classList.add(\"d-none\");\n                            }\n                        });\n                    }\n                });\n\n                // If the image is already loaded and broken, hide the swatch\n                if (img.complete && img.naturalWidth === 0) {\n                    checkImageStatus(img.src, function (is404) {\n                        if (is404) {\n                            swatch.classList.add(\"d-none\");\n                        }\n                    });\n                }\n            } else {\n                swatch.classList.add(\"d-none\");\n            }\n        });\n    });\n}\n\nfunction checkImageStatus(url, callback) {\n    fetch(url)\n        .then(response => {\n            callback(response.status === 404);\n        })\n        .catch(() => {\n            callback(true);\n        });\n}\n","/* eslint-disable no-undef */\n\"use strict\";\n\n/**\n * Retrieves the relevant pid value\n * @param {jquery} $el - DOM container for a given add to cart button\n * @return {string} - value to be used when adding product to cart\n */\nfunction getPidValue($el) {\n    var pid;\n\n    if ($(\"#quickViewModal\").hasClass(\"show\") && !$(\".product-set\").length) {\n        pid = $($el).closest(\".modal-content\").find(\".product-quickview\").data(\"pid\");\n    } else if ($(\".product-set-detail\").length || $(\".product-set\").length) {\n        pid = $($el).closest(\".product-detail\").find(\".product-id\").text() || $($el).data(\"pid\");\n    } else {\n        pid = $(\".product-detail:not(\\\".bundle-item\\\")\").data(\"pid\");\n    }\n\n    return pid;\n}\n\n/**\n * Retrieve contextual quantity selector\n * @param {jquery} $el - DOM container for the relevant quantity\n * @return {jquery} - quantity selector DOM container\n */\nfunction getQuantitySelector($el) {\n    var quantitySelected;\n    if ($el && $(\".set-items\").length) {\n        quantitySelected = $($el).closest(\".product-detail\").find(\".quantity-select\");\n    } else if ($el && $(\".product-bundle\").length) {\n        var quantitySelectedModal = $($el).closest(\".modal-footer\").find(\".quantity-select\");\n        var quantitySelectedPDP = $($el).closest(\".bundle-footer\").find(\".quantity-select\");\n        if (quantitySelectedModal.val() === undefined) {\n            quantitySelected = quantitySelectedPDP;\n        } else {\n            quantitySelected = quantitySelectedModal;\n        }\n    } else {\n        quantitySelected = $(\".quantity-select\");\n    }\n    return quantitySelected;\n}\n\n/**\n * Retrieves the value associated with the Quantity pull-down menu\n * @param {jquery} $el - DOM container for the relevant quantity\n * @return {string} - value found in the quantity input\n */\nfunction getQuantitySelected($el) {\n    return getQuantitySelector($el).val();\n}\n\n/**\n * Process the attribute values for an attribute that has image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n *     selected.  If there is no variant that corresponds to a specific combination of attribute\n *     values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n * @param {Object} msgs - object containing resource messages\n */\nfunction processSwatchValues(attr, $productContainer, msgs) {\n    attr.values.forEach(function (attrValue) {\n        var $attrValue = $productContainer.find(\"[data-attr=\\\"\" + attr.id + \"\\\"] [data-attr-value=\\\"\" +\n            attrValue.value + \"\\\"]\");\n        var $swatchButton = $attrValue.parent();\n\n        if (attrValue.selected) {\n            $attrValue.addClass(\"selected\");\n            $attrValue.siblings(\".selected-assistive-text\").text(msgs.assistiveSelectedText);\n        } else {\n            $attrValue.removeClass(\"selected\");\n            $attrValue.siblings(\".selected-assistive-text\").empty();\n        }\n\n        if (attrValue.url) {\n            $swatchButton.attr(\"data-url\", attrValue.url);\n        } else {\n            $swatchButton.removeAttr(\"data-url\");\n        }\n\n        // Disable if not selectable\n        $attrValue.removeClass(\"selectable unselectable\");\n\n        $attrValue.addClass(attrValue.selectable ? \"selectable\" : \"unselectable\");\n    });\n}\n\n/**\n * Process attribute values associated with an attribute that does not have image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n *     selected.  If there is no variant that corresponds to a specific combination of attribute\n *     values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction processNonSwatchValues(attr, $productContainer) {\n    var $attr = \"[data-attr=\\\"\" + attr.id + \"\\\"]\";\n    var $defaultOption = $productContainer.find($attr + \" .select-\" + attr.id + \" option:first\");\n    $defaultOption.attr(\"value\", attr.resetUrl);\n\n    attr.values.forEach(function (attrValue) {\n        var $attrValue = $productContainer\n            .find($attr + \" [data-attr-value=\\\"\" + attrValue.value + \"\\\"]\");\n        $attrValue.attr(\"value\", attrValue.url)\n            .removeAttr(\"disabled\");\n\n        if (!attrValue.selectable) {\n            $attrValue.attr(\"disabled\", true);\n        }\n    });\n}\n\n/**\n * Routes the handling of attribute processing depending on whether the attribute has image\n *     swatches or not\n *\n * @param {Object} attrs - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {jQuery} $productContainer - DOM element for a given product\n * @param {Object} msgs - object containing resource messages\n */\nfunction updateAttrs(attrs, $productContainer, msgs) {\n    // Currently, the only attribute type that has image swatches is Color.\n    var attrsWithSwatches = [\"color\"];\n\n    attrs.forEach(function (attr) {\n        if (attrsWithSwatches.indexOf(attr.id) > -1) {\n            processSwatchValues(attr, $productContainer, msgs);\n        } else {\n            processNonSwatchValues(attr, $productContainer);\n        }\n    });\n}\n\n/**\n * Updates the availability status in the Product Detail Page\n *\n * @param {Object} response - Ajax response object after an\n *                            attribute value has been [de]selected\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction updateAvailability(response, $productContainer) {\n    var availabilityValue = \"\";\n    var availabilityMessages = response.product.availability.messages;\n    if (!response.product.readyToOrder) {\n        availabilityValue = \"<li><div>\" + response.resources.info_selectforstock + \"</div></li>\";\n    } else {\n        availabilityMessages.forEach(function (message) {\n            availabilityValue += \"<li><div>\" + message + \"</div></li>\";\n        });\n    }\n\n    $($productContainer).trigger(\"product:updateAvailability\", {\n        product: response.product,\n        $productContainer: $productContainer,\n        message: availabilityValue,\n        resources: response.resources\n    });\n}\n\n/**\n * Generates html for product attributes section\n *\n * @param {array} attributes - list of attributes\n * @return {string} - Compiled HTML\n */\nfunction getAttributesHtml(attributes) {\n    if (!attributes) {\n        return \"\";\n    }\n\n    var html = \"\";\n\n    attributes.forEach(function (attributeGroup) {\n        if (attributeGroup.ID === \"mainAttributes\") {\n            attributeGroup.attributes.forEach(function (attribute) {\n                html += \"<div class=\\\"attribute-values\\\">\" + attribute.label + \": \"\n                    + attribute.value + \"</div>\";\n            });\n        }\n    });\n\n    return html;\n}\n\n/**\n * @typedef UpdatedOptionValue\n * @type Object\n * @property {string} id - Option value ID for look up\n * @property {string} url - Updated option value selection URL\n */\n\n/**\n * @typedef OptionSelectionResponse\n * @type Object\n * @property {string} priceHtml - Updated price HTML code\n * @property {Object} options - Updated Options\n * @property {string} options.id - Option ID\n * @property {UpdatedOptionValue[]} options.values - Option values\n */\n\n/**\n * Updates DOM using post-option selection Ajax response\n *\n * @param {OptionSelectionResponse} optionsHtml - Ajax response optionsHtml from selecting a product option\n * @param {jQuery} $productContainer - DOM element for current product\n */\nfunction updateOptions(optionsHtml, $productContainer) {\n// Update options\n    $productContainer.find(\".product-options\").empty().html(optionsHtml);\n}\n\n/**\n * Dynamically creates Bootstrap carousel from response containing images\n * @param {Object[]} imgs - Array of large product images,along with related information\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction createCarousel(imgs, $productContainer) {\n    var carousel = $productContainer.find(\".carousel\");\n    $(carousel).carousel(\"dispose\");\n    var carouselId = $(carousel).attr(\"id\");\n    $(carousel).empty().append(\"<ol class=\\\"carousel-indicators\\\"></ol><div class=\\\"carousel-inner\\\" role=\\\"listbox\\\"></div><a class=\\\"carousel-control-prev\\\" href=\\\"#\" + carouselId + \"\\\" role=\\\"button\\\" data-slide=\\\"prev\\\"><span class=\\\"fa icon-prev\\\" aria-hidden=\\\"true\\\"></span><span class=\\\"sr-only\\\">\" + $(carousel).data(\"prev\") + \"</span></a><a class=\\\"carousel-control-next\\\" href=\\\"#\" + carouselId + \"\\\" role=\\\"button\\\" data-slide=\\\"next\\\"><span class=\\\"fa icon-next\\\" aria-hidden=\\\"true\\\"></span><span class=\\\"sr-only\\\">\" + $(carousel).data(\"next\") + \"</span></a>\");\n    for (var i = 0; i < imgs.length; i++) {\n        $(\"<div class=\\\"carousel-item\\\"><img src=\\\"\" + imgs[i].url + \"\\\" class=\\\"d-block img-fluid\\\" alt=\\\"\" + imgs[i].alt + \" image number \" + parseInt(imgs[i].index, 10) + \"\\\" title=\\\"\" + imgs[i].title + \"\\\" itemprop=\\\"image\\\" /></div>\").appendTo($(carousel).find(\".carousel-inner\"));\n        $(\"<li data-target=\\\"#\" + carouselId + \"\\\" data-slide-to=\\\"\" + i + \"\\\" class=\\\"\\\"></li>\").appendTo($(carousel).find(\".carousel-indicators\"));\n    }\n    $($(carousel).find(\".carousel-item\")).first().addClass(\"active\");\n    $($(carousel).find(\".carousel-indicators > li\")).first().addClass(\"active\");\n    if (imgs.length === 1) {\n        $($(carousel).find(\".carousel-indicators, a[class^=\\\"carousel-control-\\\"]\")).detach();\n    }\n    $(carousel).carousel();\n    $($(carousel).find(\".carousel-indicators\")).attr(\"aria-hidden\", true);\n}\n\n/**\n * Parses JSON from Ajax call made whenever an attribute value is [de]selected\n * @param {Object} response - response from Ajax call\n * @param {Object} response.product - Product object\n * @param {string} response.product.id - Product ID\n * @param {Object[]} response.product.variationAttributes - Product attributes\n * @param {Object[]} response.product.images - Product images\n * @param {boolean} response.product.hasRequiredAttrsSelected - Flag as to whether all required\n *     attributes have been selected.  Used partially to\n *     determine whether the Add to Cart button can be enabled\n * @param {jQuery} $productContainer - DOM element for a given product.\n */\nfunction handleVariantResponse(response, $productContainer) {\n    var isChoiceOfBonusProducts =\n        $productContainer.parents(\".bonus-selection\").length > 0;\n    var isVaraint;\n    if (response.product.variationAttributes) {\n        updateAttrs(response.product.variationAttributes, $productContainer, response.resources);\n        isVaraint = response.product.productType === \"variant\";\n        if (isChoiceOfBonusProducts && isVaraint) {\n            $productContainer.parent(\".bonus-product-item\")\n                .data(\"pid\", response.product.id);\n\n            $productContainer.parent(\".bonus-product-item\")\n                .data(\"ready-to-order\", response.product.readyToOrder);\n        }\n    }\n\n    // Update primary images\n    var primaryImageUrls = response.product.images.large;\n    createCarousel(primaryImageUrls, $productContainer);\n\n    // Update pricing\n    if (!isChoiceOfBonusProducts) {\n        var $priceSelector = $(\".prices .price\", $productContainer).length\n            ? $(\".prices .price\", $productContainer)\n            : $(\".prices .price\");\n        $priceSelector.replaceWith(response.product.price.html);\n    }\n\n    // Update promotions\n    $productContainer.find(\".promotions\").empty().html(response.product.promotionsHtml);\n\n    updateAvailability(response, $productContainer);\n\n    if (isChoiceOfBonusProducts) {\n        var $selectButton = $productContainer.find(\".select-bonus-product\");\n        $selectButton.trigger(\"bonusproduct:updateSelectButton\", {\n            product: response.product, $productContainer: $productContainer\n        });\n    } else {\n        // Enable \"Add to Cart\" button if all required attributes have been selected\n        $(\"button.add-to-cart, button.add-to-cart-global, button.update-cart-product-global\").trigger(\"product:updateAddToCart\", {\n            product: response.product, $productContainer: $productContainer\n        }).trigger(\"product:statusUpdate\", response.product);\n    }\n\n    // Update attributes\n    $productContainer.find(\".main-attributes\").empty()\n        .html(getAttributesHtml(response.product.attributes));\n}\n\n/**\n * @typespec UpdatedQuantity\n * @type Object\n * @property {boolean} selected - Whether the quantity has been selected\n * @property {string} value - The number of products to purchase\n * @property {string} url - Compiled URL that specifies variation attributes, product ID, options,\n *     etc.\n */\n\n/**\n * Updates the quantity DOM elements post Ajax call\n * @param {UpdatedQuantity[]} quantities -\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction updateQuantities(quantities, $productContainer) {\n    if ($productContainer.parent(\".bonus-product-item\").length <= 0) {\n        var selectedQuantity = quantities.find(function (quantity) {\n            return quantity.selected;\n        });\n        var optionsHtml = \"<option value=\\\"\" + selectedQuantity.value + \"\\\"  data-url=\\\"\" + selectedQuantity.url + \"\\\" selected>\" + selectedQuantity.value + \"</option>\";\n        getQuantitySelector($productContainer).empty().html(optionsHtml);\n    }\n}\n\nfunction updateLabel(data) {\n    const colorLabel = document.getElementById(\"colorLabel\");\n    const labelText = colorLabel.getAttribute(\"data-label-text\");\n    const variationAttributes = data.product.variationAttributes;\n\n    for (const attribute of variationAttributes) {\n        if (attribute.attributeId === \"color\") {\n            $(\".color-attribute\").removeClass(\"selected\");\n            for (const value of attribute.values) {\n                if (value.selected) {\n                    colorLabel.innerHTML = `${labelText} ${value.displayValue}`;\n                    $(\"img[data-attr-value=\\\"\" + value.id + \"\\\"]\").parent().addClass(\"selected\");\n                    return; // Exit the function once the label is updated\n                }\n            }\n        }\n    }\n}\n\n/**\n * updates the product view when a product attribute is selected or deselected or when\n *         changing quantity\n * @param {string} selectedValueUrl - the Url for the selected variation value\n * @param {jQuery} $productContainer - DOM element for current product\n */\nfunction attributeSelect(selectedValueUrl, $productContainer) {\n    if (selectedValueUrl) {\n        $(\"body\").trigger(\"product:beforeAttributeSelect\",\n            { url: selectedValueUrl, container: $productContainer });\n\n        $.ajax({\n            url: selectedValueUrl,\n            method: \"GET\",\n            success: function (data) {\n                handleVariantResponse(data, $productContainer);\n                updateOptions(data.product.optionsHtml, $productContainer);\n                updateQuantities(data.product.quantities, $productContainer);\n                $(\"body\").trigger(\"product:afterAttributeSelect\",\n                    { data: data, container: $productContainer });\n                $.spinner().stop();\n                // Update the label with the selected value\n                updateLabel(data);\n            },\n            error: function () {\n                $.spinner().stop();\n            }\n        });\n    }\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @return {string} - The provided URL to use when adding a product to the cart\n */\nfunction getAddToCartUrl() {\n    return $(\".add-to-cart-url\").val();\n}\n\n/**\n * Parses the html for a modal window\n * @param {string} html - representing the body and footer of the modal window\n *\n * @return {Object} - Object with properties body and footer.\n */\nfunction parseHtml(html) {\n    var $html = $(\"<div>\").append($.parseHTML(html));\n\n    var body = $html.find(\".choice-of-bonus-product\");\n    var footer = $html.find(\".modal-footer\").children();\n\n    return { body: body, footer: footer };\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @param {Object} data - data object used to fill in dynamic portions of the html\n */\nfunction chooseBonusProducts(data) {\n    var bonusUrl;\n    if (data.bonusChoiceRuleBased) {\n        bonusUrl = data.showProductsUrlRuleBased;\n    } else {\n        bonusUrl = data.showProductsUrlListBased;\n    }\n\n    var htmlString = \"<div class=\\\"bonus-selection\\\" \"\n        + \"data-total-qty=\\\"\" + data.maxBonusItems + \"\\\"\"\n        + \"data-UUID=\\\"\" + data.uuid + \"\\\"\"\n        + \"data-pliUUID=\\\"\" + data.pliUUID + \"\\\"\"\n        + \"data-addToCartUrl=\\\"\" + data.addToCartUrl + \"\\\"\"\n        + \"data-pageStart=\\\"0\\\"\"\n        + \"data-pageSize=\\\"\" + data.pageSize + \"\\\"\"\n        + \"data-moreURL=\\\"\" + data.showProductsUrlRuleBased + \"\\\"\"\n        + \"data-bonusChoiceRuleBased=\\\"\" + data.bonusChoiceRuleBased + \"\\\">\"\n        + \"<!-- Modal content-->\"\n        + \"<div class=\\\"content\\\">\"\n        + \"<div class=\\\"header\\\">\"\n        + \"    <span class=\\\"\\\">\" + data.labels.selectprods + \"</span>\"\n        + \"    <button type=\\\"button\\\" class=\\\"close pull-right bonus-close-button\\\">\"\n        + \"        <i class=\\\"icon-close icon-small\\\" aria-hidden=\\\"true\\\"></i>\"\n        + \"    </button>\"\n        + \"</div>\"\n        + \"<div class=\\\"body\\\"></div>\"\n        + \"<div class=\\\"footer\\\"></div>\"\n        + \"</div>\"\n        + \"</div>\";\n    $(\".uuid-\" + data.pliUUID + \" .bonus-selection\").replaceWith(htmlString);\n    var $bonusSelection = $(\".uuid-\" + data.pliUUID + \" .bonus-selection\");\n\n    $.ajax({\n        url: bonusUrl,\n        method: \"GET\",\n        dataType: \"json\",\n        success: function (response) {\n            var parsedHtml = parseHtml(response.renderedTemplate);\n            $(\".uuid-\" + data.pliUUID + \" .bundled-line-item\").hide();\n            $(\".uuid-\" + data.pliUUID + \" .bonus-product-button\").hide();\n            $bonusSelection.find(\".body\").html(parsedHtml.body);\n            $bonusSelection.find(\".footer\").html(parsedHtml.footer);\n            updateSelectButtonStatus();\n            $.spinner().stop();\n        },\n        error: function () {\n            $.spinner().stop();\n        }\n    });\n}\n\n/**\n * Updates the Mini-Cart quantity value after the customer has pressed the \"Add to Cart\" button\n * @param {string} response - ajax response from clicking the add to cart button\n */\nfunction handlePostCartAdd(response) {\n    $(\".minicart\").trigger(\"count:update\", response);\n    var messageType = response.error ? \"alert-danger\" : \"alert-success\";\n    // show add to cart toast\n    if (response.newBonusDiscountLineItem\n        && Object.keys(response.newBonusDiscountLineItem).length !== 0) {\n        chooseBonusProducts(response.newBonusDiscountLineItem);\n    } else {\n        if ($(\".add-to-cart-messages\").length === 0) {\n            $(\"body\").append(\n                \"<div class=\\\"add-to-cart-messages\\\"></div>\"\n            );\n        }\n\n        $(\".add-to-cart-messages\").append(\n            \"<div class=\\\"alert \" + messageType + \" add-to-basket-alert text-center\\\" role=\\\"alert\\\">\"\n            + response.message\n            + \"</div>\"\n        );\n\n        setTimeout(function () {\n            $(\".add-to-basket-alert\").remove();\n        }, 5000);\n    }\n}\n\n/**\n * Retrieves the bundle product item ID's for the Controller to replace bundle master product\n * items with their selected variants\n *\n * @return {string[]} - List of selected bundle product item ID's\n */\nfunction getChildProducts() {\n    var childProducts = [];\n    $(\".bundle-item\").each(function () {\n        childProducts.push({\n            pid: $(this).find(\".product-id\").text(),\n            quantity: parseInt($(this).find(\"label.quantity\").data(\"quantity\"), 10)\n        });\n    });\n\n    return childProducts.length ? JSON.stringify(childProducts) : [];\n}\n\n/**\n * Retrieve product options\n *\n * @param {jQuery} $productContainer - DOM element for current product\n * @return {string} - Product options and their selected values\n */\nfunction getOptions($productContainer) {\n    var options = $productContainer\n        .find(\".product-option\")\n        .map(function () {\n            var $elOption = $(this).find(\".options-select\");\n            var urlValue = $elOption.val();\n            var selectedValueId = $elOption.find(\"option[value=\\\"\" + urlValue + \"\\\"]\")\n                .data(\"value-id\");\n            return {\n                optionId: $(this).data(\"option-id\"),\n                selectedValueId: selectedValueId\n            };\n        }).toArray();\n\n    return JSON.stringify(options);\n}\n\n/**\n * Makes a call to the server to report the event of adding an item to the cart\n *\n * @param {string | boolean} url - a string representing the end point to hit so that the event can be recorded, or false\n */\nfunction miniCartReportingUrl(url) {\n    if (url) {\n        $.ajax({\n            url: url,\n            method: \"GET\",\n            success: function () {\n                // reporting urls hit on the server\n            },\n            error: function () {\n                // no reporting urls hit on the server\n            }\n        });\n    }\n}\n\nfunction updateSelectButtonStatus() {\n    var $selected = $(\".bonus-selection .selected-bonus-products .selected-pid\");\n    var count = 0;\n    if ($selected.length) {\n        $(\"button.select-bonus-product\").removeClass(\"d-none\");\n        $(\"button.selected-bonus-product\").addClass(\"d-none\");\n\n        $selected.each(function () {\n            count += parseInt($(this).data(\"qty\"), 10);\n            let pid = $(this).data(\"pid\");\n            $(\"button.select-bonus-product[data-pid=\\\"\" + pid + \"\\\"]\").addClass(\"d-none\");\n            $(\"button.selected-bonus-product[data-pid=\\\"\" +pid + \"\\\"]\").removeClass(\"d-none\");\n        });\n    }\n    var maxPids = $(\".bonus-selection\").data(\"total-qty\");\n\n    if (count >= maxPids) {\n        $(\"button.select-bonus-product:not([data-ignore])\").attr(\"disabled\", \"disabled\");\n    } else {\n        $(\"button.select-bonus-product:not([data-ignore])\").removeAttr(\"disabled\");\n    }\n}\n\nsetTimeout(function () {\n    var colorDiv = $(\"div[data-attr=\\\"color\\\"]\");\n    var pdpAttributesDiv = colorDiv.find(\".pdp-attributes\");\n    var selectableButton = pdpAttributesDiv.find(\"button.color-attribute .selectable\").first().parent();\n\n    if (selectableButton.length > 0) {\n        pdpAttributesDiv.find(\"button.color-attribute\").removeClass(\"selected\");\n        selectableButton[0].click(); // Trigger the click event\n        selectableButton.addClass(\"selected\"); // Add the class to the jQuery object\n    }\n}, 10);\n\nmodule.exports = {\n    attributeSelect: attributeSelect,\n    methods: {\n        editBonusProducts: function (data) {\n            chooseBonusProducts(data);\n        }\n    },\n\n    focusChooseBonusProductModal: function () {\n        $(\"body\").on(\"shown.bs.modal\", \"#chooseBonusProductModal\", function () {\n            $(\"#chooseBonusProductModal\").siblings().attr(\"aria-hidden\", \"true\");\n            $(\"#chooseBonusProductModal .close\").focus();\n        });\n    },\n\n    onClosingChooseBonusProductModal: function () {\n        $(\"body\").on(\"hidden.bs.modal\", \"#chooseBonusProductModal\", function () {\n            $(\"#chooseBonusProductModal\").siblings().attr(\"aria-hidden\", \"false\");\n        });\n    },\n\n    trapChooseBonusProductModalFocus: function () {\n        $(\"body\").on(\"keydown\", \"#chooseBonusProductModal\", function (e) {\n            var focusParams = {\n                event: e,\n                containerSelector: \"#chooseBonusProductModal\",\n                firstElementSelector: \".close\",\n                lastElementSelector: \".add-bonus-products\"\n            };\n            focusHelper.setTabNextFocus(focusParams);\n        });\n    },\n\n    colorAttribute: function () {\n        $(document).on(\"click\", \"[data-attr=\\\"color\\\"] button\", function (e) {\n            e.preventDefault();\n\n            if ($(this).attr(\"disabled\")) {\n                return;\n            }\n            var $productContainer = $(this).closest(\".set-item\");\n            if (!$productContainer.length) {\n                $productContainer = $(this).closest(\".product-detail\");\n            }\n\n            attributeSelect($(this).attr(\"data-url\"), $productContainer);\n        });\n    },\n\n    selectAttribute: function () {\n        $(document).on(\"change\", \"select[class*=\\\"select-\\\"], .options-select\", function (e) {\n            e.preventDefault();\n\n            var $productContainer = $(this).closest(\".set-item\");\n            if (!$productContainer.length) {\n                $productContainer = $(this).closest(\".product-detail\");\n            }\n            attributeSelect(e.currentTarget.value, $productContainer);\n        });\n    },\n\n    availability: function () {\n        $(document).on(\"change\", \".quantity-select\", function (e) {\n            e.preventDefault();\n\n            var $productContainer = $(this).closest(\".product-detail\");\n            if (!$productContainer.length) {\n                $productContainer = $(this).closest(\".modal-content\").find(\".product-quickview\");\n            }\n\n            if ($(\".bundle-items\", $productContainer).length === 0) {\n                attributeSelect($(e.currentTarget).find(\"option:selected\").data(\"url\"),\n                    $productContainer);\n            }\n        });\n    },\n\n    addToCart: function () {\n        $(document).on(\"click\", \"button.add-to-cart, button.add-to-cart-global\", function () {\n            var addToCartUrl;\n            var pid;\n            var pidsObj;\n            var setPids;\n\n            $(\"body\").trigger(\"product:beforeAddToCart\", this);\n\n            if ($(\".set-items\").length && $(this).hasClass(\"add-to-cart-global\")) {\n                setPids = [];\n\n                $(\".product-detail\").each(function () {\n                    if (!$(this).hasClass(\"product-set-detail\")) {\n                        setPids.push({\n                            pid: $(this).data(\"pid\"),\n                            qty: $(this).find(\".quantity-select\").val(),\n                            options: getOptions($(this))\n                        });\n                    }\n                });\n                pidsObj = JSON.stringify(setPids);\n            }\n\n            pid = getPidValue($(this));\n\n            var $productContainer = $(this).closest(\".product-detail\");\n            if (!$productContainer.length) {\n                $productContainer = $(this).closest(\".quick-view-dialog\").find(\".product-detail\");\n            }\n\n            addToCartUrl = getAddToCartUrl();\n\n            var form = {\n                pid: pid,\n                pidsObj: pidsObj,\n                childProducts: getChildProducts(),\n                quantity: getQuantitySelected($(this))\n            };\n\n            if (!$(\".bundle-item\").length) {\n                form.options = getOptions($productContainer);\n            }\n\n            $(this).trigger(\"updateAddToCartFormData\", form);\n            if (addToCartUrl) {\n                $.ajax({\n                    url: addToCartUrl,\n                    method: \"POST\",\n                    data: form,\n                    success: function (data) {\n                        handlePostCartAdd(data);\n                        $(\"body\").trigger(\"product:afterAddToCart\", data);\n                        $.spinner().stop();\n                        miniCartReportingUrl(data.reportingURL);\n                    },\n                    error: function () {\n                        $.spinner().stop();\n                    }\n                });\n            }\n        });\n    },\n    selectBonusProduct: function () {\n        $(document).on(\"click\", \".select-bonus-product\", function () {\n            var $choiceOfBonusProduct = $(this).parents(\".choice-of-bonus-product\");\n            var pid = $(this).data(\"pid\");\n            var maxPids = $(\".bonus-selection\").data(\"total-qty\");\n            var submittedQty = parseInt($choiceOfBonusProduct.find(\".bonus-quantity-select\").val(), 10);\n            var totalQty = 0;\n            $.each($(\".bonus-selection .selected-bonus-products .selected-pid\"), function () {\n                totalQty += $(this).data(\"qty\");\n            });\n            totalQty += submittedQty;\n            var optionID = $choiceOfBonusProduct.find(\".product-option\").data(\"option-id\");\n            var valueId = $choiceOfBonusProduct.find(\".options-select option:selected\").data(\"valueId\");\n            if (totalQty <= maxPids) {\n                var selectedBonusProductHtml = \"\"\n                + \"<div class=\\\"selected-pid row\\\" \"\n                + \"data-pid=\\\"\" + pid + \"\\\"\"\n                + \"data-qty=\\\"\" + submittedQty + \"\\\"\"\n                + \"data-optionID=\\\"\" + (optionID || \"\") + \"\\\"\"\n                + \"data-option-selected-value=\\\"\" + (valueId || \"\") + \"\\\"\"\n                + \">\"\n                + \"<div class=\\\"col-sm-11 col-9 bonus-product-name\\\" >\"\n                + $choiceOfBonusProduct.find(\".product-name\").html()\n                + \"</div>\"\n                + \"<div class=\\\"col-1\\\"><i class=\\\"fa fa-times\\\" aria-hidden=\\\"true\\\"></i></div>\"\n                + \"</div>\"\n                ;\n                $(\".bonus-selection .selected-bonus-products\").append(selectedBonusProductHtml);\n                $(\".pre-cart-products\").html(totalQty);\n                $(\".selected-bonus-products .bonus-summary\").removeClass(\"alert-danger\");\n            } else {\n                $(\".selected-bonus-products .bonus-summary\").addClass(\"alert-danger\");\n            }\n            updateSelectButtonStatus();\n        });\n    },\n    removeBonusProduct: function () {\n        $(document).on(\"click\", \".selected-bonus-product\", function () {\n            var $selected = $(\".bonus-selection .selected-bonus-products .selected-pid\");\n            var count = 0;\n            if ($selected.length) {\n                $selected.each(function (index) {\n                    var $item = $($selected[index]);\n                    if ($item.data(\"pid\") === $(this).data(\"pid\")) {\n                        $item.remove();\n                        return;\n                    }\n                    count += parseInt($item.data(\"qty\"), 10);\n                });\n            }\n\n            $(\".pre-cart-products\").html(count);\n            $(\".selected-bonus-products .bonus-summary\").removeClass(\"alert-danger\");\n            $(this).addClass(\"d-none\");\n            $(this).siblings(\".select-bonus-product\").removeClass(\"d-none\");\n            updateSelectButtonStatus();\n        });\n    },\n    enableBonusProductSelection: function () {\n        $(\"body\").on(\"bonusproduct:updateSelectButton\", function (e, response) {\n            $(\"button.select-bonus-product\", response.$productContainer).attr(\"disabled\",\n                (!response.product.readyToOrder || !response.product.available));\n            var pid = response.product.id;\n            $(\"button.select-bonus-product\", response.$productContainer).data(\"pid\", pid);\n        });\n\n        $(document).on(\"change\", \".bonus-quantity-select\", function () {\n            var qty = parseInt($(this).val(), 10);\n            var $parent = $(this).parents(\".bonus-product-item\");\n            var pid = $parent.data(\"pid\");\n            var $selected = $(\".bonus-selection .selected-bonus-products .selected-pid\");\n            var count = 0;\n            if ($selected.length) {\n                $selected.each(function () {\n                    if ($selected.data(\"pid\") !== pid) {\n                        count += parseInt($(this).data(\"qty\"), 10);\n                    }\n                });\n            }\n            var maxPids = $(\".bonus-selection\").data(\"total-qty\");\n\n            if (qty + count <= maxPids) {\n                $parent.find(\"button.select-bonus-product:not([data-ignore])\").removeAttr(\"disabled\");\n            } else {\n                $parent.find(\"button.select-bonus-product:not([data-ignore])\").attr(\"disabled\", \"disabled\");\n            }\n        });\n    },\n    showMoreBonusProducts: function () {\n        $(document).on(\"click\", \".show-more-bonus-products\", function () {\n            var url = $(this).data(\"url\");\n            $(\".modal-content\").spinner().start();\n            $.ajax({\n                url: url,\n                method: \"GET\",\n                success: function (html) {\n                    var parsedHtml = parseHtml(html);\n                    $(\".modal-body\").append(parsedHtml.body);\n                    $(\".show-more-bonus-products:first\").remove();\n                    $(\".modal-content\").spinner().stop();\n                },\n                error: function () {\n                    $(\".modal-content\").spinner().stop();\n                }\n            });\n        });\n    },\n    addBonusProductsToCart: function () {\n        $(document).on(\"click\", \".add-bonus-products\", function () {\n            var $readyToOrderBonusProducts = $(\".bonus-selection .selected-pid\");\n            var queryString = \"?pids=\";\n            var url = $(\".bonus-selection\").data(\"addtocarturl\");\n            var pidsObject = {\n                bonusProducts: []\n            };\n\n            $.each($readyToOrderBonusProducts, function () {\n                var qtyOption =\n                    parseInt($(this)\n                        .data(\"qty\"), 10);\n\n                var option = null;\n                if (qtyOption > 0) {\n                    if ($(this).data(\"optionid\") && $(this).data(\"option-selected-value\")) {\n                        option = {};\n                        option.optionId = $(this).data(\"optionid\");\n                        option.productId = $(this).data(\"pid\");\n                        option.selectedValueId = $(this).data(\"option-selected-value\");\n                    }\n                    pidsObject.bonusProducts.push({\n                        pid: $(this).data(\"pid\"),\n                        qty: qtyOption,\n                        options: [option]\n                    });\n                    pidsObject.totalQty = parseInt($(\".pre-cart-products\").html(), 10);\n                }\n            });\n            queryString += JSON.stringify(pidsObject);\n            queryString = queryString + \"&uuid=\" + $(\".bonus-selection\").data(\"uuid\");\n            queryString = queryString + \"&pliuuid=\" + $(\".bonus-selection\").data(\"pliuuid\");\n            $.spinner().start();\n            $.ajax({\n                url: url + queryString,\n                method: \"POST\",\n                success: function (data) {\n                    $.spinner().stop();\n                    if (data.error) {\n                        if ($(\".add-to-cart-messages\").length === 0) {\n                            $(\"body\").append(\"<div class=\\\"add-to-cart-messages\\\"></div>\");\n                        }\n                        $(\".add-to-cart-messages\").append(\n                            \"<div class=\\\"alert alert-danger add-to-basket-alert text-center\\\"\"\n                            + \" role=\\\"alert\\\">\"\n                            + data.errorMessage + \"</div>\"\n                        );\n                        setTimeout(function () {\n                            $(\".add-to-basket-alert\").remove();\n                        }, 3000);\n                    } else {\n                        $(\".configure-bonus-product-attributes\").html(data);\n                        $(\".bonus-products-step2\").removeClass(\"hidden-xl-down\");\n                        $(\".bonus-selection\").empty();\n\n                        if ($(\".add-to-cart-messages\").length === 0) {\n                            $(\"body\").append(\"<div class=\\\"add-to-cart-messages\\\"></div>\");\n                        }\n                        $(\".minicart-quantity\").html(data.totalQty);\n                        $(\".add-to-cart-messages\").append(\n                            \"<div class=\\\"alert alert-success add-to-basket-alert text-center\\\"\"\n                            + \" role=\\\"alert\\\">\"\n                            + data.msgSuccess + \"</div>\"\n                        );\n                        setTimeout(function () {\n                            $(\".add-to-basket-alert\").remove();\n                            if ($(\".cart-page\").length) {\n                                location.reload();\n                            }\n                        }, 1500);\n                    }\n                },\n                error: function () {\n                    $.spinner().stop();\n                }\n            });\n        });\n    },\n\n    getPidValue: getPidValue,\n    getQuantitySelected: getQuantitySelected,\n    miniCartReportingUrl: miniCartReportingUrl\n};\n","\"use strict\";\nvar base = require(\"./base\");\n\n/**\n * Enable/disable UI elements\n * @param {boolean} enableOrDisable - true or false\n */\nfunction updateAddToCartEnableDisableOtherElements(enableOrDisable) {\n    $(\"button.add-to-cart-global\").attr(\"disabled\", enableOrDisable);\n}\n\nmodule.exports = {\n    methods: {\n        updateAddToCartEnableDisableOtherElements: updateAddToCartEnableDisableOtherElements\n    },\n\n    availability: base.availability,\n\n    addToCart: base.addToCart,\n\n    updateAttributesAndDetails: function () {\n        $(\"body\").on(\"product:statusUpdate\", function (e, data) {\n            var $productContainer = $(\".product-detail[data-pid=\\\"\" + data.id + \"\\\"]\");\n\n            $productContainer.find(\".description-and-detail .product-attributes\")\n                .empty()\n                .html(data.attributesHtml);\n\n            if (data.shortDescription) {\n                $productContainer.find(\".description-and-detail .description\")\n                    .removeClass(\"hidden-xl-down\");\n                $productContainer.find(\".description-and-detail .description .content\")\n                    .empty()\n                    .html(data.shortDescription);\n            } else {\n                $productContainer.find(\".description-and-detail .description\")\n                    .addClass(\"hidden-xl-down\");\n            }\n\n            if (data.longDescription) {\n                $productContainer.find(\".description-and-detail .details\")\n                    .removeClass(\"hidden-xl-down\");\n                $productContainer.find(\".description-and-detail .details .content\")\n                    .empty()\n                    .html(data.longDescription);\n            } else {\n                $productContainer.find(\".description-and-detail .details\")\n                    .addClass(\"hidden-xl-down\");\n            }\n        });\n    },\n\n    showSpinner: function () {\n        $(\"body\").on(\"product:beforeAddToCart product:beforeAttributeSelect\", function () {\n            $.spinner().start();\n        });\n    },\n    updateAttribute: function () {\n        $(\"body\").on(\"product:afterAttributeSelect\", function (e, response) {\n            if ($(\".product-detail>.bundle-items\").length || $(\".product-set-detail\").eq(0)) {\n                response.container.data(\"pid\", response.data.product.id);\n                response.container.find(\".product-id\").text(response.data.product.id);\n            } else {\n                $(\".product-id\").text(response.data.product.id);\n                $(\".product-detail:not(\\\".bundle-item\\\")\").data(\"pid\", response.data.product.id);\n            }\n        });\n    },\n    updateAddToCart: function () {\n        $(\"body\").on(\"product:updateAddToCart\", function (e, response) {\n            // update local add to cart (for sets)\n            $(\"button.add-to-cart\", response.$productContainer).attr(\"disabled\",\n                (!response.product.readyToOrder || !response.product.available));\n\n            var enable = $(\".product-availability\").toArray().every(function (item) {\n                return $(item).data(\"available\") && $(item).data(\"ready-to-order\");\n            });\n            module.exports.methods.updateAddToCartEnableDisableOtherElements(!enable);\n        });\n    },\n    updateAvailability: function () {\n        $(\"body\").on(\"product:updateAvailability\", function (e, response) {\n            $(\"div.availability\", response.$productContainer)\n                .data(\"ready-to-order\", response.product.readyToOrder)\n                .data(\"available\", response.product.available);\n\n            $(\".availability-msg\", response.$productContainer)\n                .empty().html(response.message);\n\n            if ($(\".global-availability\").length) {\n                var allAvailable = $(\".product-availability\").toArray()\n                    .every(function (item) { return $(item).data(\"available\"); });\n\n                var allReady = $(\".product-availability\").toArray()\n                    .every(function (item) { return $(item).data(\"ready-to-order\"); });\n\n                $(\".global-availability\")\n                    .data(\"ready-to-order\", allReady)\n                    .data(\"available\", allAvailable);\n\n                $(\".global-availability .availability-msg\").empty()\n                    .html(allReady ? response.message : response.resources.info_selectforstock);\n            }\n        });\n    },\n    sizeChart: function () {\n        $(\".size-chart a\").on(\"click\", function (e) {\n            e.preventDefault();\n            var url = $(this).attr(\"href\");\n            var $prodSizeChart = $(this).closest(\".size-chart\").find(\".size-chart-collapsible\");\n            if ($prodSizeChart.is(\":empty\")) {\n                $.ajax({\n                    url: url,\n                    type: \"get\",\n                    dataType: \"json\",\n                    success: function (data) {\n                        $prodSizeChart.append(data.content);\n                    }\n                });\n            }\n            $prodSizeChart.toggleClass(\"active\");\n        });\n\n        var $sizeChart = $(\".size-chart-collapsible\");\n        $(\"body\").on(\"click touchstart\", function (e) {\n            if ($(\".size-chart\").has(e.target).length <= 0) {\n                $sizeChart.removeClass(\"active\");\n            }\n        });\n    },\n    copyProductLink: function () {\n        $(\"body\").on(\"click\", \"#fa-link\", function () {\n            event.preventDefault();\n            var $temp = $(\"<input>\");\n            $(\"body\").append($temp);\n            $temp.val($(\"#shareUrl\").val()).select();\n            document.execCommand(\"copy\");\n            $temp.remove();\n            $(\".copy-link-message\").attr(\"role\", \"alert\");\n            $(\".copy-link-message\").removeClass(\"d-none\");\n            setTimeout(function () {\n                $(\".copy-link-message\").addClass(\"d-none\");\n            }, 3000);\n        });\n    },\n\n    focusChooseBonusProductModal: base.focusChooseBonusProductModal()\n};\n","\"use strict\";\n\nvar base = require(\"./base\");\nvar detail = require(\"./detail\");\n\nvar exportDetails = $.extend({}, base, detail, {});\n\nmodule.exports = exportDetails;\n","\"use strict\";\n\nrequire(\"xzoom\");\n\nconst breakpoints = require(\"../utils/breakpoints\");\nvar xzoomOptions = {\n    position: \"lens\",\n    lens: \"transparent\",\n    lensShape: \"circle\",\n    defaultScale: \"-1\",\n    zoomWidth: 400,\n    zoomHeight: 400\n};\n\n/**\n * Initialize zoom functionality\n *\n * @param {Object} item - item with image inside\n */\nfunction initializeXZoom(item) {\n    var image = item.find(\".active .img-fluid\");\n    var xoriginalURL = image.attr(\"src\");\n\n    image.addClass(\"xzoom\").attr(\"xoriginal\", xoriginalURL);\n    image.parent().addClass(\"xzoom-wrapper\");\n\n    if (!breakpoints.isLargeBreakpoint()) {\n        xzoomOptions.position = \"right\";\n    }\n\n    image.xzoom(xzoomOptions);\n\n    // set each instance\n    var instance = image.data(\"xzoom\");\n\n    instance.eventclick = function (element) {\n        if (!breakpoints.isLargeBreakpoint() && $(\".xzoom-preview .xzoom-close\").length === 0) {\n            var $zoomPreview = $(element).find(\".xzoom-preview\");\n\n            // get the dimensions of the wrapper\n            var zoomPreviewWidth = $zoomPreview.width();\n            var zoomPreviewHeight = $zoomPreview.height();\n\n            // get the dimensions of the scroll\n            var zoomPreviewScrollWidth = $zoomPreview.get(0).scrollWidth;\n            var zoomPreviewScrollHeight =$zoomPreview.get(0).scrollHeight;\n\n            // calculate the middle of the scroll\n            var zoomPreviewScrollLeft = (zoomPreviewScrollWidth - zoomPreviewWidth) / 2;\n            var zoomPreviewScrollRight = (zoomPreviewScrollHeight - zoomPreviewHeight) / 2;\n\n            // position the scroll to the middle vertically and horizontally\n            $zoomPreview.scrollLeft(zoomPreviewScrollLeft).scrollTop(zoomPreviewScrollRight);\n\n            // append the close button\n            $(element).append(\"<span class='xzoom-close'>&times;</span>\");\n\n            // add action to the close button\n            $(element).on(\"click\", \".xzoom-close\", function () {\n                instance.closezoom();\n            });\n        }\n    };\n\n    instance.eventscroll = function (element) {\n        element.off('mousewheel DOMMouseScroll');\n    };\n}\n\n/**\n * Zoom functionality for image carousel\n *\n * @param {Object} carousel - image carousel\n */\nfunction zoomCarouselImage(carousel) {\n    initializeXZoom(carousel);\n\n    carousel.on(\"slide.bs.carousel\", function () {\n        $(this).find(\".active .img-fluid\").attr(\"xoriginal\", \"\");\n    });\n\n    carousel.on(\"slid.bs.carousel\", function () {\n        initializeXZoom($(this));\n    });\n}\n\nmodule.exports = {\n    xZoomInit: function () {\n        var $carousel = $(\".primary-images .carousel\");\n\n        $carousel.each(function () {\n            var $item = $(this);\n\n            zoomCarouselImage($item);\n        });\n    },\n    onVariationUpdate: function () {\n        $(\"body\").on(\"product:afterAttributeSelect\", function (e, response) {\n            var $carousel = response.container;\n\n            zoomCarouselImage($carousel);\n        });\n    }\n};\n","const breakpointDefs = {\n    large: 1200\n};\n\nfunction isLargeBreakpoint() {\n    return window.matchMedia(`(min-width: ${breakpointDefs.large}px)`).matches;\n}\n\nmodule.exports = {\n    breakpointDefs,\n    isLargeBreakpoint\n};\n","'use strict';\n\nmodule.exports = {\n    setTabNextFocus: function (focusParams) {\n        var KEYCODE_TAB = 9;\n        var isTabPressed = (focusParams.event.key === 'Tab' || focusParams.event.keyCode === KEYCODE_TAB);\n\n        if (!isTabPressed) {\n            return;\n        }\n\n        var firstFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.firstElementSelector);\n        var lastFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.lastElementSelector);\n\n        if ($(focusParams.containerSelector + ' ' + focusParams.lastElementSelector).is(':disabled')) {\n            lastFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.nextToLastElementSelector);\n            if ($('.product-quickview.product-set').length > 0) {\n                var linkElements = $(focusParams.containerSelector + ' a#fa-link.share-icons');\n                lastFocusableEl = linkElements[linkElements.length - 1];\n            }\n        }\n\n        if (focusParams.event.shiftKey) /* shift + tab */ {\n            if ($(':focus').is(firstFocusableEl)) {\n                lastFocusableEl.focus();\n                focusParams.event.preventDefault();\n            }\n        } else /* tab */ {\n            if ($(':focus').is(lastFocusableEl)) { // eslint-disable-line\n                firstFocusableEl.focus();\n                focusParams.event.preventDefault();\n            }\n        }\n    }\n};\n","'use strict';\nvar focusHelper = require('../components/focus');\n\n/**\n * Retrieves the relevant pid value\n * @param {jquery} $el - DOM container for a given add to cart button\n * @return {string} - value to be used when adding product to cart\n */\nfunction getPidValue($el) {\n    var pid;\n\n    if ($('#quickViewModal').hasClass('show') && !$('.product-set').length) {\n        pid = $($el).closest('.modal-content').find('.product-quickview').data('pid');\n    } else if ($('.product-set-detail').length || $('.product-set').length) {\n        pid = $($el).closest('.product-detail').find('.product-id').text();\n    } else {\n        pid = $('.product-detail:not(\".bundle-item\")').data('pid');\n    }\n\n    return pid;\n}\n\n/**\n * Retrieve contextual quantity selector\n * @param {jquery} $el - DOM container for the relevant quantity\n * @return {jquery} - quantity selector DOM container\n */\nfunction getQuantitySelector($el) {\n    var quantitySelected;\n    if ($el && $('.set-items').length) {\n        quantitySelected = $($el).closest('.product-detail').find('.quantity-select');\n    } else if ($el && $('.product-bundle').length) {\n        var quantitySelectedModal = $($el).closest('.modal-footer').find('.quantity-select');\n        var quantitySelectedPDP = $($el).closest('.bundle-footer').find('.quantity-select');\n        if (quantitySelectedModal.val() === undefined) {\n            quantitySelected = quantitySelectedPDP;\n        } else {\n            quantitySelected = quantitySelectedModal;\n        }\n    } else {\n        quantitySelected = $('.quantity-select');\n    }\n    return quantitySelected;\n}\n\n/**\n * Retrieves the value associated with the Quantity pull-down menu\n * @param {jquery} $el - DOM container for the relevant quantity\n * @return {string} - value found in the quantity input\n */\nfunction getQuantitySelected($el) {\n    return getQuantitySelector($el).val();\n}\n\n/**\n * Process the attribute values for an attribute that has image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n *     selected.  If there is no variant that corresponds to a specific combination of attribute\n *     values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n * @param {Object} msgs - object containing resource messages\n */\nfunction processSwatchValues(attr, $productContainer, msgs) {\n    attr.values.forEach(function (attrValue) {\n        var $attrValue = $productContainer.find('[data-attr=\"' + attr.id + '\"] [data-attr-value=\"' +\n            attrValue.value + '\"]');\n        var $swatchButton = $attrValue.parent();\n\n        if (attrValue.selected) {\n            $attrValue.addClass('selected');\n            $attrValue.siblings('.selected-assistive-text').text(msgs.assistiveSelectedText);\n        } else {\n            $attrValue.removeClass('selected');\n            $attrValue.siblings('.selected-assistive-text').empty();\n        }\n\n        if (attrValue.url) {\n            $swatchButton.attr('data-url', attrValue.url);\n        } else {\n            $swatchButton.removeAttr('data-url');\n        }\n\n        // Disable if not selectable\n        $attrValue.removeClass('selectable unselectable');\n\n        $attrValue.addClass(attrValue.selectable ? 'selectable' : 'unselectable');\n    });\n}\n\n/**\n * Process attribute values associated with an attribute that does not have image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n *     selected.  If there is no variant that corresponds to a specific combination of attribute\n *     values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction processNonSwatchValues(attr, $productContainer) {\n    var $attr = '[data-attr=\"' + attr.id + '\"]';\n    var $defaultOption = $productContainer.find($attr + ' .select-' + attr.id + ' option:first');\n    $defaultOption.attr('value', attr.resetUrl);\n\n    attr.values.forEach(function (attrValue) {\n        var $attrValue = $productContainer\n            .find($attr + ' [data-attr-value=\"' + attrValue.value + '\"]');\n        $attrValue.attr('value', attrValue.url)\n            .removeAttr('disabled');\n\n        if (!attrValue.selectable) {\n            $attrValue.attr('disabled', true);\n        }\n    });\n}\n\n/**\n * Routes the handling of attribute processing depending on whether the attribute has image\n *     swatches or not\n *\n * @param {Object} attrs - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {jQuery} $productContainer - DOM element for a given product\n * @param {Object} msgs - object containing resource messages\n */\nfunction updateAttrs(attrs, $productContainer, msgs) {\n    // Currently, the only attribute type that has image swatches is Color.\n    var attrsWithSwatches = ['color'];\n\n    attrs.forEach(function (attr) {\n        if (attrsWithSwatches.indexOf(attr.id) > -1) {\n            processSwatchValues(attr, $productContainer, msgs);\n        } else {\n            processNonSwatchValues(attr, $productContainer);\n        }\n    });\n}\n\n/**\n * Updates the availability status in the Product Detail Page\n *\n * @param {Object} response - Ajax response object after an\n *                            attribute value has been [de]selected\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction updateAvailability(response, $productContainer) {\n    var availabilityValue = '';\n    var availabilityMessages = response.product.availability.messages;\n    if (!response.product.readyToOrder) {\n        availabilityValue = '<li><div>' + response.resources.info_selectforstock + '</div></li>';\n    } else {\n        availabilityMessages.forEach(function (message) {\n            availabilityValue += '<li><div>' + message + '</div></li>';\n        });\n    }\n\n    $($productContainer).trigger('product:updateAvailability', {\n        product: response.product,\n        $productContainer: $productContainer,\n        message: availabilityValue,\n        resources: response.resources\n    });\n}\n\n/**\n * Generates html for product attributes section\n *\n * @param {array} attributes - list of attributes\n * @return {string} - Compiled HTML\n */\nfunction getAttributesHtml(attributes) {\n    if (!attributes) {\n        return '';\n    }\n\n    var html = '';\n\n    attributes.forEach(function (attributeGroup) {\n        if (attributeGroup.ID === 'mainAttributes') {\n            attributeGroup.attributes.forEach(function (attribute) {\n                html += '<div class=\"attribute-values\">' + attribute.label + ': '\n                    + attribute.value + '</div>';\n            });\n        }\n    });\n\n    return html;\n}\n\n/**\n * @typedef UpdatedOptionValue\n * @type Object\n * @property {string} id - Option value ID for look up\n * @property {string} url - Updated option value selection URL\n */\n\n/**\n * @typedef OptionSelectionResponse\n * @type Object\n * @property {string} priceHtml - Updated price HTML code\n * @property {Object} options - Updated Options\n * @property {string} options.id - Option ID\n * @property {UpdatedOptionValue[]} options.values - Option values\n */\n\n/**\n * Updates DOM using post-option selection Ajax response\n *\n * @param {OptionSelectionResponse} optionsHtml - Ajax response optionsHtml from selecting a product option\n * @param {jQuery} $productContainer - DOM element for current product\n */\nfunction updateOptions(optionsHtml, $productContainer) {\n\t// Update options\n    $productContainer.find('.product-options').empty().html(optionsHtml);\n}\n\n/**\n * Dynamically creates Bootstrap carousel from response containing images\n * @param {Object[]} imgs - Array of large product images,along with related information\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction createCarousel(imgs, $productContainer) {\n    var carousel = $productContainer.find('.carousel');\n    $(carousel).carousel('dispose');\n    var carouselId = $(carousel).attr('id');\n    $(carousel).empty().append('<ol class=\"carousel-indicators\"></ol><div class=\"carousel-inner\" role=\"listbox\"></div><a class=\"carousel-control-prev\" href=\"#' + carouselId + '\" role=\"button\" data-slide=\"prev\"><span class=\"fa icon-prev\" aria-hidden=\"true\"></span><span class=\"sr-only\">' + $(carousel).data('prev') + '</span></a><a class=\"carousel-control-next\" href=\"#' + carouselId + '\" role=\"button\" data-slide=\"next\"><span class=\"fa icon-next\" aria-hidden=\"true\"></span><span class=\"sr-only\">' + $(carousel).data('next') + '</span></a>');\n    for (var i = 0; i < imgs.length; i++) {\n        $('<div class=\"carousel-item\"><img src=\"' + imgs[i].url + '\" class=\"d-block img-fluid\" alt=\"' + imgs[i].alt + ' image number ' + parseInt(imgs[i].index, 10) + '\" title=\"' + imgs[i].title + '\" itemprop=\"image\" /></div>').appendTo($(carousel).find('.carousel-inner'));\n        $('<li data-target=\"#' + carouselId + '\" data-slide-to=\"' + i + '\" class=\"\"></li>').appendTo($(carousel).find('.carousel-indicators'));\n    }\n    $($(carousel).find('.carousel-item')).first().addClass('active');\n    $($(carousel).find('.carousel-indicators > li')).first().addClass('active');\n    if (imgs.length === 1) {\n        $($(carousel).find('.carousel-indicators, a[class^=\"carousel-control-\"]')).detach();\n    }\n    $(carousel).carousel();\n    $($(carousel).find('.carousel-indicators')).attr('aria-hidden', true);\n}\n\n/**\n * Parses JSON from Ajax call made whenever an attribute value is [de]selected\n * @param {Object} response - response from Ajax call\n * @param {Object} response.product - Product object\n * @param {string} response.product.id - Product ID\n * @param {Object[]} response.product.variationAttributes - Product attributes\n * @param {Object[]} response.product.images - Product images\n * @param {boolean} response.product.hasRequiredAttrsSelected - Flag as to whether all required\n *     attributes have been selected.  Used partially to\n *     determine whether the Add to Cart button can be enabled\n * @param {jQuery} $productContainer - DOM element for a given product.\n */\nfunction handleVariantResponse(response, $productContainer) {\n    var isChoiceOfBonusProducts =\n        $productContainer.parents('.choose-bonus-product-dialog').length > 0;\n    var isVaraint;\n    if (response.product.variationAttributes) {\n        updateAttrs(response.product.variationAttributes, $productContainer, response.resources);\n        isVaraint = response.product.productType === 'variant';\n        if (isChoiceOfBonusProducts && isVaraint) {\n            $productContainer.parent('.bonus-product-item')\n                .data('pid', response.product.id);\n\n            $productContainer.parent('.bonus-product-item')\n                .data('ready-to-order', response.product.readyToOrder);\n        }\n    }\n\n    // Update primary images\n    var primaryImageUrls = response.product.images.large;\n    createCarousel(primaryImageUrls, $productContainer);\n\n    // Update pricing\n    if (!isChoiceOfBonusProducts) {\n        var $priceSelector = $('.prices .price', $productContainer).length\n            ? $('.prices .price', $productContainer)\n            : $('.prices .price');\n        $priceSelector.replaceWith(response.product.price.html);\n    }\n\n    // Update promotions\n    $productContainer.find('.promotions').empty().html(response.product.promotionsHtml);\n\n    updateAvailability(response, $productContainer);\n\n    if (isChoiceOfBonusProducts) {\n        var $selectButton = $productContainer.find('.select-bonus-product');\n        $selectButton.trigger('bonusproduct:updateSelectButton', {\n            product: response.product, $productContainer: $productContainer\n        });\n    } else {\n        // Enable \"Add to Cart\" button if all required attributes have been selected\n        $('button.add-to-cart, button.add-to-cart-global, button.update-cart-product-global').trigger('product:updateAddToCart', {\n            product: response.product, $productContainer: $productContainer\n        }).trigger('product:statusUpdate', response.product);\n    }\n\n    // Update attributes\n    $productContainer.find('.main-attributes').empty()\n        .html(getAttributesHtml(response.product.attributes));\n}\n\n/**\n * @typespec UpdatedQuantity\n * @type Object\n * @property {boolean} selected - Whether the quantity has been selected\n * @property {string} value - The number of products to purchase\n * @property {string} url - Compiled URL that specifies variation attributes, product ID, options,\n *     etc.\n */\n\n/**\n * Updates the quantity DOM elements post Ajax call\n * @param {UpdatedQuantity[]} quantities -\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction updateQuantities(quantities, $productContainer) {\n    if ($productContainer.parent('.bonus-product-item').length <= 0) {\n        var optionsHtml = quantities.map(function (quantity) {\n            var selected = quantity.selected ? ' selected ' : '';\n            return '<option value=\"' + quantity.value + '\"  data-url=\"' + quantity.url + '\"' +\n                selected + '>' + quantity.value + '</option>';\n        }).join('');\n        getQuantitySelector($productContainer).empty().html(optionsHtml);\n    }\n}\n\n/**\n * updates the product view when a product attribute is selected or deselected or when\n *         changing quantity\n * @param {string} selectedValueUrl - the Url for the selected variation value\n * @param {jQuery} $productContainer - DOM element for current product\n */\nfunction attributeSelect(selectedValueUrl, $productContainer) {\n    if (selectedValueUrl) {\n        $('body').trigger('product:beforeAttributeSelect',\n            { url: selectedValueUrl, container: $productContainer });\n\n        $.ajax({\n            url: selectedValueUrl,\n            method: 'GET',\n            success: function (data) {\n                handleVariantResponse(data, $productContainer);\n                updateOptions(data.product.optionsHtml, $productContainer);\n                updateQuantities(data.product.quantities, $productContainer);\n                $('body').trigger('product:afterAttributeSelect',\n                    { data: data, container: $productContainer });\n                $.spinner().stop();\n            },\n            error: function () {\n                $.spinner().stop();\n            }\n        });\n    }\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @return {string} - The provided URL to use when adding a product to the cart\n */\nfunction getAddToCartUrl() {\n    return $('.add-to-cart-url').val();\n}\n\n/**\n * Parses the html for a modal window\n * @param {string} html - representing the body and footer of the modal window\n *\n * @return {Object} - Object with properties body and footer.\n */\nfunction parseHtml(html) {\n    var $html = $('<div>').append($.parseHTML(html));\n\n    var body = $html.find('.choice-of-bonus-product');\n    var footer = $html.find('.modal-footer').children();\n\n    return { body: body, footer: footer };\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @param {Object} data - data object used to fill in dynamic portions of the html\n */\nfunction chooseBonusProducts(data) {\n    $('.modal-body').spinner().start();\n\n    if ($('#chooseBonusProductModal').length !== 0) {\n        $('#chooseBonusProductModal').remove();\n    }\n    var bonusUrl;\n    if (data.bonusChoiceRuleBased) {\n        bonusUrl = data.showProductsUrlRuleBased;\n    } else {\n        bonusUrl = data.showProductsUrlListBased;\n    }\n\n    var htmlString = '<!-- Modal -->'\n        + '<div class=\"modal fade\" id=\"chooseBonusProductModal\" tabindex=\"-1\" role=\"dialog\">'\n        + '<span class=\"enter-message sr-only\" ></span>'\n        + '<div class=\"modal-dialog choose-bonus-product-dialog\" '\n        + 'data-total-qty=\"' + data.maxBonusItems + '\"'\n        + 'data-UUID=\"' + data.uuid + '\"'\n        + 'data-pliUUID=\"' + data.pliUUID + '\"'\n        + 'data-addToCartUrl=\"' + data.addToCartUrl + '\"'\n        + 'data-pageStart=\"0\"'\n        + 'data-pageSize=\"' + data.pageSize + '\"'\n        + 'data-moreURL=\"' + data.showProductsUrlRuleBased + '\"'\n        + 'data-bonusChoiceRuleBased=\"' + data.bonusChoiceRuleBased + '\">'\n        + '<!-- Modal content-->'\n        + '<div class=\"modal-content\">'\n        + '<div class=\"modal-header\">'\n        + '    <span class=\"\">' + data.labels.selectprods + '</span>'\n        + '    <button type=\"button\" class=\"close pull-right\" data-dismiss=\"modal\">'\n        + '        <span aria-hidden=\"true\">&times;</span>'\n        + '        <span class=\"sr-only\"> </span>'\n        + '    </button>'\n        + '</div>'\n        + '<div class=\"modal-body\"></div>'\n        + '<div class=\"modal-footer\"></div>'\n        + '</div>'\n        + '</div>'\n        + '</div>';\n    $('body').append(htmlString);\n    $('.modal-body').spinner().start();\n\n    $.ajax({\n        url: bonusUrl,\n        method: 'GET',\n        dataType: 'json',\n        success: function (response) {\n            var parsedHtml = parseHtml(response.renderedTemplate);\n            $('#chooseBonusProductModal .modal-body').empty();\n            $('#chooseBonusProductModal .enter-message').text(response.enterDialogMessage);\n            $('#chooseBonusProductModal .modal-header .close .sr-only').text(response.closeButtonText);\n            $('#chooseBonusProductModal .modal-body').html(parsedHtml.body);\n            $('#chooseBonusProductModal .modal-footer').html(parsedHtml.footer);\n            $('#chooseBonusProductModal').modal('show');\n            $.spinner().stop();\n        },\n        error: function () {\n            $.spinner().stop();\n        }\n    });\n}\n\n/**\n * Updates the Mini-Cart quantity value after the customer has pressed the \"Add to Cart\" button\n * @param {string} response - ajax response from clicking the add to cart button\n */\nfunction handlePostCartAdd(response) {\n    $('.minicart').trigger('count:update', response);\n    var messageType = response.error ? 'alert-danger' : 'alert-success';\n    // show add to cart toast\n    if (response.newBonusDiscountLineItem\n        && Object.keys(response.newBonusDiscountLineItem).length !== 0) {\n        chooseBonusProducts(response.newBonusDiscountLineItem);\n    } else {\n        if ($('.add-to-cart-messages').length === 0) {\n            $('body').append(\n                '<div class=\"add-to-cart-messages\"></div>'\n            );\n        }\n\n        $('.add-to-cart-messages').append(\n            '<div class=\"alert ' + messageType + ' add-to-basket-alert text-center\" role=\"alert\">'\n            + response.message\n            + '</div>'\n        );\n\n        setTimeout(function () {\n            $('.add-to-basket-alert').remove();\n        }, 5000);\n    }\n}\n\n/**\n * Retrieves the bundle product item ID's for the Controller to replace bundle master product\n * items with their selected variants\n *\n * @return {string[]} - List of selected bundle product item ID's\n */\nfunction getChildProducts() {\n    var childProducts = [];\n    $('.bundle-item').each(function () {\n        childProducts.push({\n            pid: $(this).find('.product-id').text(),\n            quantity: parseInt($(this).find('label.quantity').data('quantity'), 10)\n        });\n    });\n\n    return childProducts.length ? JSON.stringify(childProducts) : [];\n}\n\n/**\n * Retrieve product options\n *\n * @param {jQuery} $productContainer - DOM element for current product\n * @return {string} - Product options and their selected values\n */\nfunction getOptions($productContainer) {\n    var options = $productContainer\n        .find('.product-option')\n        .map(function () {\n            var $elOption = $(this).find('.options-select');\n            var urlValue = $elOption.val();\n            var selectedValueId = $elOption.find('option[value=\"' + urlValue + '\"]')\n                .data('value-id');\n            return {\n                optionId: $(this).data('option-id'),\n                selectedValueId: selectedValueId\n            };\n        }).toArray();\n\n    return JSON.stringify(options);\n}\n\n/**\n * Makes a call to the server to report the event of adding an item to the cart\n *\n * @param {string | boolean} url - a string representing the end point to hit so that the event can be recorded, or false\n */\nfunction miniCartReportingUrl(url) {\n    if (url) {\n        $.ajax({\n            url: url,\n            method: 'GET',\n            success: function () {\n                // reporting urls hit on the server\n            },\n            error: function () {\n                // no reporting urls hit on the server\n            }\n        });\n    }\n}\n\nmodule.exports = {\n    attributeSelect: attributeSelect,\n    methods: {\n        editBonusProducts: function (data) {\n            chooseBonusProducts(data);\n        }\n    },\n\n    focusChooseBonusProductModal: function () {\n        $('body').on('shown.bs.modal', '#chooseBonusProductModal', function () {\n            $('#chooseBonusProductModal').siblings().attr('aria-hidden', 'true');\n            $('#chooseBonusProductModal .close').focus();\n        });\n    },\n\n    onClosingChooseBonusProductModal: function () {\n        $('body').on('hidden.bs.modal', '#chooseBonusProductModal', function () {\n            $('#chooseBonusProductModal').siblings().attr('aria-hidden', 'false');\n        });\n    },\n\n    trapChooseBonusProductModalFocus: function () {\n        $('body').on('keydown', '#chooseBonusProductModal', function (e) {\n            var focusParams = {\n                event: e,\n                containerSelector: '#chooseBonusProductModal',\n                firstElementSelector: '.close',\n                lastElementSelector: '.add-bonus-products'\n            };\n            focusHelper.setTabNextFocus(focusParams);\n        });\n    },\n\n    colorAttribute: function () {\n        $(document).on('click', '[data-attr=\"color\"] button', function (e) {\n            e.preventDefault();\n\n            if ($(this).attr('disabled')) {\n                return;\n            }\n            var $productContainer = $(this).closest('.set-item');\n            if (!$productContainer.length) {\n                $productContainer = $(this).closest('.product-detail');\n            }\n\n            attributeSelect($(this).attr('data-url'), $productContainer);\n        });\n    },\n\n    selectAttribute: function () {\n        $(document).on('change', 'select[class*=\"select-\"], .options-select', function (e) {\n            e.preventDefault();\n\n            var $productContainer = $(this).closest('.set-item');\n            if (!$productContainer.length) {\n                $productContainer = $(this).closest('.product-detail');\n            }\n            attributeSelect(e.currentTarget.value, $productContainer);\n        });\n    },\n\n    availability: function () {\n        $(document).on('change', '.quantity-select', function (e) {\n            e.preventDefault();\n\n            var $productContainer = $(this).closest('.product-detail');\n            if (!$productContainer.length) {\n                $productContainer = $(this).closest('.modal-content').find('.product-quickview');\n            }\n\n            if ($('.bundle-items', $productContainer).length === 0) {\n                attributeSelect($(e.currentTarget).find('option:selected').data('url'),\n                    $productContainer);\n            }\n        });\n    },\n\n    addToCart: function () {\n        $(document).on('click', 'button.add-to-cart, button.add-to-cart-global', function () {\n            var addToCartUrl;\n            var pid;\n            var pidsObj;\n            var setPids;\n\n            $('body').trigger('product:beforeAddToCart', this);\n\n            if ($('.set-items').length && $(this).hasClass('add-to-cart-global')) {\n                setPids = [];\n\n                $('.product-detail').each(function () {\n                    if (!$(this).hasClass('product-set-detail')) {\n                        setPids.push({\n                            pid: $(this).find('.product-id').text(),\n                            qty: $(this).find('.quantity-select').val(),\n                            options: getOptions($(this))\n                        });\n                    }\n                });\n                pidsObj = JSON.stringify(setPids);\n            }\n\n            pid = getPidValue($(this));\n\n            var $productContainer = $(this).closest('.product-detail');\n            if (!$productContainer.length) {\n                $productContainer = $(this).closest('.quick-view-dialog').find('.product-detail');\n            }\n\n            addToCartUrl = getAddToCartUrl();\n\n            var form = {\n                pid: pid,\n                pidsObj: pidsObj,\n                childProducts: getChildProducts(),\n                quantity: getQuantitySelected($(this))\n            };\n\n            if (!$('.bundle-item').length) {\n                form.options = getOptions($productContainer);\n            }\n\n            $(this).trigger('updateAddToCartFormData', form);\n            if (addToCartUrl) {\n                $.ajax({\n                    url: addToCartUrl,\n                    method: 'POST',\n                    data: form,\n                    success: function (data) {\n                        handlePostCartAdd(data);\n                        $('body').trigger('product:afterAddToCart', data);\n                        $.spinner().stop();\n                        miniCartReportingUrl(data.reportingURL);\n                    },\n                    error: function () {\n                        $.spinner().stop();\n                    }\n                });\n            }\n        });\n    },\n    selectBonusProduct: function () {\n        $(document).on('click', '.select-bonus-product', function () {\n            var $choiceOfBonusProduct = $(this).parents('.choice-of-bonus-product');\n            var pid = $(this).data('pid');\n            var maxPids = $('.choose-bonus-product-dialog').data('total-qty');\n            var submittedQty = parseInt($choiceOfBonusProduct.find('.bonus-quantity-select').val(), 10);\n            var totalQty = 0;\n            $.each($('#chooseBonusProductModal .selected-bonus-products .selected-pid'), function () {\n                totalQty += $(this).data('qty');\n            });\n            totalQty += submittedQty;\n            var optionID = $choiceOfBonusProduct.find('.product-option').data('option-id');\n            var valueId = $choiceOfBonusProduct.find('.options-select option:selected').data('valueId');\n            if (totalQty <= maxPids) {\n                var selectedBonusProductHtml = ''\n                + '<div class=\"selected-pid row\" '\n                + 'data-pid=\"' + pid + '\"'\n                + 'data-qty=\"' + submittedQty + '\"'\n                + 'data-optionID=\"' + (optionID || '') + '\"'\n                + 'data-option-selected-value=\"' + (valueId || '') + '\"'\n                + '>'\n                + '<div class=\"col-sm-11 col-9 bonus-product-name\" >'\n                + $choiceOfBonusProduct.find('.product-name').html()\n                + '</div>'\n                + '<div class=\"col-1\"><i class=\"fa fa-times\" aria-hidden=\"true\"></i></div>'\n                + '</div>'\n                ;\n                $('#chooseBonusProductModal .selected-bonus-products').append(selectedBonusProductHtml);\n                $('.pre-cart-products').html(totalQty);\n                $('.selected-bonus-products .bonus-summary').removeClass('alert-danger');\n            } else {\n                $('.selected-bonus-products .bonus-summary').addClass('alert-danger');\n            }\n        });\n    },\n    removeBonusProduct: function () {\n        $(document).on('click', '.selected-pid', function () {\n            $(this).remove();\n            var $selected = $('#chooseBonusProductModal .selected-bonus-products .selected-pid');\n            var count = 0;\n            if ($selected.length) {\n                $selected.each(function () {\n                    count += parseInt($(this).data('qty'), 10);\n                });\n            }\n\n            $('.pre-cart-products').html(count);\n            $('.selected-bonus-products .bonus-summary').removeClass('alert-danger');\n        });\n    },\n    enableBonusProductSelection: function () {\n        $('body').on('bonusproduct:updateSelectButton', function (e, response) {\n            $('button.select-bonus-product', response.$productContainer).attr('disabled',\n                (!response.product.readyToOrder || !response.product.available));\n            var pid = response.product.id;\n            $('button.select-bonus-product', response.$productContainer).data('pid', pid);\n        });\n    },\n    showMoreBonusProducts: function () {\n        $(document).on('click', '.show-more-bonus-products', function () {\n            var url = $(this).data('url');\n            $('.modal-content').spinner().start();\n            $.ajax({\n                url: url,\n                method: 'GET',\n                success: function (html) {\n                    var parsedHtml = parseHtml(html);\n                    $('.modal-body').append(parsedHtml.body);\n                    $('.show-more-bonus-products:first').remove();\n                    $('.modal-content').spinner().stop();\n                },\n                error: function () {\n                    $('.modal-content').spinner().stop();\n                }\n            });\n        });\n    },\n    addBonusProductsToCart: function () {\n        $(document).on('click', '.add-bonus-products', function () {\n            var $readyToOrderBonusProducts = $('.choose-bonus-product-dialog .selected-pid');\n            var queryString = '?pids=';\n            var url = $('.choose-bonus-product-dialog').data('addtocarturl');\n            var pidsObject = {\n                bonusProducts: []\n            };\n\n            $.each($readyToOrderBonusProducts, function () {\n                var qtyOption =\n                    parseInt($(this)\n                        .data('qty'), 10);\n\n                var option = null;\n                if (qtyOption > 0) {\n                    if ($(this).data('optionid') && $(this).data('option-selected-value')) {\n                        option = {};\n                        option.optionId = $(this).data('optionid');\n                        option.productId = $(this).data('pid');\n                        option.selectedValueId = $(this).data('option-selected-value');\n                    }\n                    pidsObject.bonusProducts.push({\n                        pid: $(this).data('pid'),\n                        qty: qtyOption,\n                        options: [option]\n                    });\n                    pidsObject.totalQty = parseInt($('.pre-cart-products').html(), 10);\n                }\n            });\n            queryString += JSON.stringify(pidsObject);\n            queryString = queryString + '&uuid=' + $('.choose-bonus-product-dialog').data('uuid');\n            queryString = queryString + '&pliuuid=' + $('.choose-bonus-product-dialog').data('pliuuid');\n            $.spinner().start();\n            $.ajax({\n                url: url + queryString,\n                method: 'POST',\n                success: function (data) {\n                    $.spinner().stop();\n                    if (data.error) {\n                        $('#chooseBonusProductModal').modal('hide');\n                        if ($('.add-to-cart-messages').length === 0) {\n                            $('body').append('<div class=\"add-to-cart-messages\"></div>');\n                        }\n                        $('.add-to-cart-messages').append(\n                            '<div class=\"alert alert-danger add-to-basket-alert text-center\"'\n                            + ' role=\"alert\">'\n                            + data.errorMessage + '</div>'\n                        );\n                        setTimeout(function () {\n                            $('.add-to-basket-alert').remove();\n                        }, 3000);\n                    } else {\n                        $('.configure-bonus-product-attributes').html(data);\n                        $('.bonus-products-step2').removeClass('hidden-xl-down');\n                        $('#chooseBonusProductModal').modal('hide');\n\n                        if ($('.add-to-cart-messages').length === 0) {\n                            $('body').append('<div class=\"add-to-cart-messages\"></div>');\n                        }\n                        $('.minicart-quantity').html(data.totalQty);\n                        $('.add-to-cart-messages').append(\n                            '<div class=\"alert alert-success add-to-basket-alert text-center\"'\n                            + ' role=\"alert\">'\n                            + data.msgSuccess + '</div>'\n                        );\n                        setTimeout(function () {\n                            $('.add-to-basket-alert').remove();\n                            if ($('.cart-page').length) {\n                                location.reload();\n                            }\n                        }, 1500);\n                    }\n                },\n                error: function () {\n                    $.spinner().stop();\n                }\n            });\n        });\n    },\n\n    getPidValue: getPidValue,\n    getQuantitySelected: getQuantitySelected,\n    miniCartReportingUrl: miniCartReportingUrl\n};\n","/* globals google */\n'use strict';\n\n/**\n * appends params to a url\n * @param {string} url - Original url\n * @param {Object} params - Parameters to append\n * @returns {string} result url with appended parameters\n */\nfunction appendToUrl(url, params) {\n    var newUrl = url;\n    newUrl += (newUrl.indexOf('?') !== -1 ? '&' : '?') + Object.keys(params).map(function (key) {\n        return key + '=' + encodeURIComponent(params[key]);\n    }).join('&');\n\n    return newUrl;\n}\n\n/**\n * Uses google maps api to render a map\n */\nfunction maps() {\n    var map;\n    var infowindow = new google.maps.InfoWindow();\n\n    // Init U.S. Map in the center of the viewport\n    var latlng = new google.maps.LatLng(37.09024, -95.712891);\n    var mapOptions = {\n        scrollwheel: false,\n        zoom: 4,\n        center: latlng\n    };\n\n    map = new google.maps.Map($('.map-canvas')[0], mapOptions);\n    var mapdiv = $('.map-canvas').attr('data-locations');\n\n    mapdiv = JSON.parse(mapdiv);\n\n    var bounds = new google.maps.LatLngBounds();\n\n    // Customized google map marker icon with svg format\n    var markerImg = {\n        path: 'M13.5,30.1460153 L16.8554555,25.5 L20.0024287,25.5 C23.039087,25.5 25.5,' +\n            '23.0388955 25.5,20.0024287 L25.5,5.99757128 C25.5,2.96091298 23.0388955,0.5 ' +\n            '20.0024287,0.5 L5.99757128,0.5 C2.96091298,0.5 0.5,2.96110446 0.5,5.99757128 ' +\n            'L0.5,20.0024287 C0.5,23.039087 2.96110446,25.5 5.99757128,25.5 L10.1445445,' +\n            '25.5 L13.5,30.1460153 Z',\n        fillColor: '#0070d2',\n        fillOpacity: 1,\n        scale: 1.1,\n        strokeColor: 'white',\n        strokeWeight: 1,\n        anchor: new google.maps.Point(13, 30),\n        labelOrigin: new google.maps.Point(12, 12)\n    };\n\n    Object.keys(mapdiv).forEach(function (key) {\n        var item = mapdiv[key];\n        var lable = parseInt(key, 10) + 1;\n        var storeLocation = new google.maps.LatLng(item.latitude, item.longitude);\n        var marker = new google.maps.Marker({\n            position: storeLocation,\n            map: map,\n            title: item.name,\n            icon: markerImg,\n            label: { text: lable.toString(), color: 'white', fontSize: '16px' }\n        });\n\n        marker.addListener('click', function () {\n            infowindow.setOptions({\n                content: item.infoWindowHtml\n            });\n            infowindow.open(map, marker);\n        });\n\n        // Create a minimum bound based on a set of storeLocations\n        bounds.extend(marker.position);\n    });\n    // Fit the all the store marks in the center of a minimum bounds when any store has been found.\n    if (mapdiv && mapdiv.length !== 0) {\n        map.fitBounds(bounds);\n    }\n}\n\n/**\n * Renders the results of the search and updates the map\n * @param {Object} data - Response from the server\n */\nfunction updateStoresResults(data) {\n    var $resultsDiv = $('.results');\n    var $mapDiv = $('.map-canvas');\n    var hasResults = data.stores.length > 0;\n\n    if (!hasResults) {\n        $('.store-locator-no-results').show();\n    } else {\n        $('.store-locator-no-results').hide();\n    }\n\n    $resultsDiv.empty()\n        .data('has-results', hasResults)\n        .data('radius', data.radius)\n        .data('search-key', data.searchKey);\n\n    $mapDiv.attr('data-locations', data.locations);\n\n    if ($mapDiv.data('has-google-api')) {\n        maps();\n    } else {\n        $('.store-locator-no-apiKey').show();\n    }\n\n    if (data.storesResultsHtml) {\n        $resultsDiv.append(data.storesResultsHtml);\n    }\n}\n\n/**\n * Search for stores with new zip code\n * @param {HTMLElement} element - the target html element\n * @returns {boolean} false to prevent default event\n */\nfunction search(element) {\n    var dialog = element.closest('.in-store-inventory-dialog');\n    var spinner = dialog.length ? dialog.spinner() : $.spinner();\n    spinner.start();\n    var $form = element.closest('.store-locator');\n    var radius = $('.results').data('radius');\n    var url = $form.attr('action');\n    var urlParams = { radius: radius };\n\n    var payload = $form.is('form') ? $form.serialize() : { postalCode: $form.find('[name=\"postalCode\"]').val() };\n\n    url = appendToUrl(url, urlParams);\n\n    $.ajax({\n        url: url,\n        type: $form.attr('method'),\n        data: payload,\n        dataType: 'json',\n        success: function (data) {\n            spinner.stop();\n            updateStoresResults(data);\n            $('.select-store').prop('disabled', true);\n        }\n    });\n    return false;\n}\n\nmodule.exports = {\n    init: function () {\n        if ($('.map-canvas').data('has-google-api')) {\n            maps();\n        } else {\n            $('.store-locator-no-apiKey').show();\n        }\n\n        if (!$('.results').data('has-results')) {\n            $('.store-locator-no-results').show();\n        }\n    },\n\n    detectLocation: function () {\n        // clicking on detect location.\n        $('.detect-location').on('click', function () {\n            $.spinner().start();\n            if (!navigator.geolocation) {\n                $.spinner().stop();\n                return;\n            }\n\n            navigator.geolocation.getCurrentPosition(function (position) {\n                var $detectLocationButton = $('.detect-location');\n                var url = $detectLocationButton.data('action');\n                var radius = $('.results').data('radius');\n                var urlParams = {\n                    radius: radius,\n                    lat: position.coords.latitude,\n                    long: position.coords.longitude\n                };\n\n                url = appendToUrl(url, urlParams);\n                $.ajax({\n                    url: url,\n                    type: 'get',\n                    dataType: 'json',\n                    success: function (data) {\n                        $.spinner().stop();\n                        updateStoresResults(data);\n                        $('.select-store').prop('disabled', true);\n                    }\n                });\n            });\n        });\n    },\n\n    search: function () {\n        $('.store-locator-container form.store-locator').submit(function (e) {\n            e.preventDefault();\n            search($(this));\n        });\n        $('.store-locator-container .btn-storelocator-search[type=\"button\"]').click(function (e) {\n            e.preventDefault();\n            search($(this));\n        });\n    },\n\n    changeRadius: function () {\n        $('.store-locator-container .radius').change(function () {\n            var radius = $(this).val();\n            var searchKeys = $('.results').data('search-key');\n            var url = $(this).data('action-url');\n            var urlParams = {};\n\n            if (searchKeys.postalCode) {\n                urlParams = {\n                    radius: radius,\n                    postalCode: searchKeys.postalCode\n                };\n            } else if (searchKeys.lat && searchKeys.long) {\n                urlParams = {\n                    radius: radius,\n                    lat: searchKeys.lat,\n                    long: searchKeys.long\n                };\n            }\n\n            url = appendToUrl(url, urlParams);\n            var dialog = $(this).closest('.in-store-inventory-dialog');\n            var spinner = dialog.length ? dialog.spinner() : $.spinner();\n            spinner.start();\n            $.ajax({\n                url: url,\n                type: 'get',\n                dataType: 'json',\n                success: function (data) {\n                    spinner.stop();\n                    updateStoresResults(data);\n                    $('.select-store').prop('disabled', true);\n                }\n            });\n        });\n    },\n    selectStore: function () {\n        $('.store-locator-container').on('click', '.select-store', (function (e) {\n            e.preventDefault();\n            var selectedStore = $(':checked', '.results-card .results');\n            var data = {\n                storeID: selectedStore.val(),\n                searchRadius: $('#radius').val(),\n                searchPostalCode: $('.results').data('search-key').postalCode,\n                storeDetailsHtml: selectedStore.siblings('label').find('.store-details').html(),\n                event: e\n            };\n\n            $('body').trigger('store:selected', data);\n        }));\n    },\n    updateSelectStoreButton: function () {\n        $('body').on('change', '.select-store-input', (function () {\n            $('.select-store').prop('disabled', false);\n        }));\n    }\n};\n","'use strict';\n\nmodule.exports = function (include) {\n    if (typeof include === 'function') {\n        include();\n    } else if (typeof include === 'object') {\n        Object.keys(include).forEach(function (key) {\n            if (typeof include[key] === 'function') {\n                include[key]();\n            }\n        });\n    }\n};\n","\"use strict\";\n\nvar base = require(\"base/product/base\");\n\n/**\n * Displays the message returned in the response\n * @param {string} data - data returned from the server's ajax call\n */\nfunction displayMessage(data) {\n    var status;\n    if (!data.error) {\n        status = \"alert-success\";\n    } else {\n        status = \"alert-danger\";\n    }\n\n    if ($(\".add-to-registry-message\").length === 0) {\n        $(\"body\").append(\"<div class=\\\"add-to-registry-message\\\" role=\\\"alert\\\"></div>\");\n    }\n    $(\".add-to-registry-message\").append(\n        \"<div class=\\\"add-to-registry-alert text-center \" + status + \"\\\">\" + data.msg + \"</div>\"\n    );\n\n    setTimeout(function () {\n        $(\".add-to-registry-message\").remove();\n    }, 5000);\n}\n\nmodule.exports = {\n    updateAddToRegistry: function () {\n        $(\"body\").on(\"product:updateAddToCart\", function (e, response) {\n            $(\"button.add-to-gift-registry\", response.$productContainer).attr(\n                \"disabled\",\n                (!response.product.readyToOrder || !response.product.available)\n            );\n        });\n    },\n\n    updateGiftRegistryURLQuantity: function () {\n        $(\"body\").on(\"product:afterAttributeSelect\", function (e, response) {\n            $(\".add-to-gift-registry\", response.container).data(\"href\", response.data.product.giftRegistryLink);\n        });\n    },\n\n    addToGiftRegistry: function () {\n        $(\".add-to-gift-registry\").on(\"click\", function (e) {\n            e.preventDefault();\n            var element = $(this);\n            var url = element.data(\"href\");\n\n            $.spinner().start();\n\n            var args = {\n                pid: base.getPidValue($(this)),\n                qty: base.getQuantitySelected($(this)),\n                prodSetPid: $(\".product-set-detail\").data(\"pid\") || \"\"\n            };\n\n            var encodedArgs = encodeURIComponent(JSON.stringify(args));\n\n            $.ajax({\n                url: url,\n                type: \"get\",\n                data: { args: encodedArgs },\n                dataType: \"json\",\n                success: function (data) {\n                    if (data.redirectUrl) {\n                        window.location.href = data.redirectUrl;\n                    } else {\n                        displayMessage(data, element);\n                    }\n\n                    $.spinner().stop();\n                },\n                error: function (err) {\n                    $.spinner().stop();\n                    window.location.href = err.responseJSON.redirectUrl;\n                }\n            });\n        });\n    }\n};\n","\"use strict\";\n\nvar storeLocator = require(\"base/storeLocator/storeLocator\");\n\n/**\n * Restores Quantity Selector to its original state.\n * @param {HTMLElement} $quantitySelect - The Quantity Select Element\n */\nfunction restoreQuantityOptions($quantitySelect) {\n    var originalHTML = $quantitySelect.data(\"originalHTML\");\n    if (originalHTML) {\n        $quantitySelect.html(originalHTML);\n    }\n}\n\n/**\n * Sets the data attribute of Quantity Selector to save its original state.\n * @param {HTMLElement} $quantitySelect - The Quantity Select Element\n */\nfunction setOriginalQuantitySelect($quantitySelect) {\n    if (!$quantitySelect.data(\"originalHTML\")) {\n        $quantitySelect.data(\"originalHTML\", $quantitySelect.html());\n    } // If it's already there, don't re-set it\n}\n\n/**\n * Updates the Quantity Selector based on the In Store Quantity.\n * @param {string} quantitySelector - Quantity Selector\n * @param {string} quantityOptionSelector - Quantity Option Selector\n * @param {number} productAtsValue - Inventory in the selected store\n */\nfunction updateQOptions(quantitySelector, quantityOptionSelector, productAtsValue) {\n    var selectedQuantity = $(quantitySelector).val();\n    restoreQuantityOptions($(quantitySelector));\n    for (var i = $(quantityOptionSelector).length - 1; i >= productAtsValue; i--) {\n        $(quantityOptionSelector).eq(i).remove();\n    }\n    $(quantitySelector + \" option[value=\\\"\" + selectedQuantity + \"\\\"]\").attr(\"selected\", \"selected\");\n}\n\n/**\n * Generates the modal window on the first call.\n */\nfunction getModalHtmlElement() {\n    if ($(\"#inStoreInventoryModal\").length !== 0) {\n        $(\"#inStoreInventoryModal\").remove();\n    }\n    var htmlString = \"<!-- Modal -->\"\n        + \"<div class=\\\"modal \\\" id=\\\"inStoreInventoryModal\\\" role=\\\"dialog\\\">\"\n        + \"<div class=\\\"modal-dialog in-store-inventory-dialog\\\">\"\n        + \"<!-- Modal content-->\"\n        + \"<div class=\\\"modal-content\\\">\"\n        + \"<div class=\\\"modal-header justify-content-end\\\">\"\n        + \"    <button type=\\\"button\\\" class=\\\"close pull-right\\\" data-dismiss=\\\"modal\\\" title=\\\"\"\n        +          $('.btn-get-in-store-inventory').data('modal-close-text') + '\">'    // eslint-disable-line\n        + \"        &times;\"\n        + \"    </button>\"\n        + \"</div>\"\n        + \"<div class=\\\"modal-body\\\"></div>\"\n        + \"<div class=\\\"modal-footer\\\"></div>\"\n        + \"</div>\"\n        + \"</div>\"\n        + \"</div>\";\n    $(\"body\").append(htmlString);\n    $(\"#inStoreInventoryModal\").modal(\"show\");\n}\n\n/**\n * Replaces the content in the modal window with find stores components and\n * the result store list.\n * @param {string} pid - The product ID to search for\n * @param {number} quantity - Number of products to search inventory for\n * @param {number} selectedPostalCode - The postal code to search for inventory\n * @param {number} selectedRadius - The radius to search for inventory\n */\nfunction fillModalElement(pid, quantity, selectedPostalCode, selectedRadius) {\n    var requestData = {\n        products: pid + \":\" + quantity\n    };\n\n    if (selectedRadius) {\n        requestData.radius = selectedRadius;\n    }\n\n    if (selectedPostalCode) {\n        requestData.postalCode = selectedPostalCode;\n    }\n\n    $(\"#inStoreInventoryModal\").spinner().start();\n    $.ajax({\n        url: $(\".btn-get-in-store-inventory\").data(\"action-url\"),\n        data: requestData,\n        method: \"GET\",\n        success: function (response) {\n            $(\".modal-body\").empty();\n            $(\".modal-body\").html(response.storesResultsHtml);\n            storeLocator.search();\n            storeLocator.changeRadius();\n            storeLocator.selectStore();\n            storeLocator.updateSelectStoreButton();\n\n            $(\".btn-storelocator-search\").attr(\"data-search-pid\", pid);\n\n            if (selectedRadius) {\n                $(\"#radius\").val(selectedRadius);\n            }\n\n            if (selectedPostalCode) {\n                $(\"#store-postal-code\").val(selectedPostalCode);\n            }\n\n            if (!$(\".results\").data(\"has-results\")) {\n                $(\".store-locator-no-results\").show();\n            }\n\n            $(\"#inStoreInventoryModal\").modal(\"show\");\n            $(\"#inStoreInventoryModal\").spinner().stop();\n        },\n        error: function () {\n            $(\"#inStoreInventoryModal\").spinner().stop();\n        }\n    });\n}\n\n/**\n * Remove the selected store.\n * @param {HTMLElement} $container - the target html element\n */\nfunction deselectStore($container) {\n    var storeElement = $($container).find(\".selected-store-with-inventory\");\n    $(storeElement).find(\".card-body\").empty();\n    $(storeElement).addClass(\"display-none\");\n    $($container).find(\".btn-get-in-store-inventory\").show();\n    $($container).find(\".quantity-select\").removeData(\"originalHTML\");\n}\n\n/**\n * Update quantity options. Only display quantity options that are available for the store.\n * @param {sring} searchPID - The product ID of the selected product.\n * @param {number} storeId - The store ID selected for in store pickup.\n */\nfunction updateQuantityOptions(searchPID, storeId) {\n    var selectorPrefix = \".product-detail[data-pid=\\\"\" + searchPID + \"\\\"]\";\n    var productIdSelector = selectorPrefix + \" .product-id\";\n    var quantitySelector = selectorPrefix + \" .quantity-select\";\n    var quantityOptionSelector = quantitySelector + \" option\";\n\n    setOriginalQuantitySelect($(quantitySelector));\n\n    var requestData = {\n        pid: $(productIdSelector).text(),\n        quantitySelected: $(quantitySelector).val(),\n        storeId: storeId\n    };\n\n    $.ajax({\n        url: $(\".btn-get-in-store-inventory\").data(\"ats-action-url\"),\n        data: requestData,\n        method: \"GET\",\n        success: function (response) {\n            // Update Quantity dropdown, Remove quantity greater than inventory\n            var productAtsValue = response.atsValue;\n            var availabilityValue = \"\";\n\n            var $productContainer = $(\".product-detail[data-pid=\\\"\" + searchPID + \"\\\"]\");\n\n            if (!response.product.readyToOrder) {\n                availabilityValue = \"<div>\" + response.resources.info_selectforstock + \"</div>\";\n            } else {\n                response.product.messages.forEach(function (message) {\n                    availabilityValue += \"<div>\" + message + \"</div>\";\n                });\n            }\n\n            $($productContainer).trigger(\"product:updateAvailability\", {\n                product: response.product,\n                $productContainer: $productContainer,\n                message: availabilityValue,\n                resources: response.resources\n            });\n\n            $(\"button.add-to-cart, button.add-to-cart-global, button.update-cart-product-global\").trigger(\"product:updateAddToCart\", {\n                product: response.product, $productContainer: $productContainer\n            });\n\n            updateQOptions(quantitySelector, quantityOptionSelector, productAtsValue);\n        }\n    });\n}\n\nmodule.exports = {\n    updateSelectStore: function () {\n        $(\"body\").on(\"product:updateAddToCart\", function (e, response) {\n            $(\".btn-get-in-store-inventory\", response.$productContainer).attr(\n                \"disabled\",\n                (!response.product.readyToOrder || !response.product.available\n                || !response.product.availableForInStorePickup)\n            );\n        });\n    },\n    removeSelectedStoreOnAttributeChange: function () {\n        $(\"body\").on(\"product:afterAttributeSelect\", function (e, response) {\n            response.container.attr(\"data-pid\", response.data.product.id);\n            deselectStore(response.container);\n        });\n    },\n    updateAddToCartFormData: function () {\n        $(\"body\").on(\"updateAddToCartFormData\", function (e, form) {\n            if (form.pidsObj) {\n                var pidsObj = JSON.parse(form.pidsObj);\n                pidsObj.forEach(function (product) {\n                    var storeElement = $(\".product-detail[data-pid=\\\"\"\n                        + product.pid\n                        + \"\\\"]\").find(\".store-name\");\n                    product.storeId = $(storeElement).length// eslint-disable-line no-param-reassign\n                        ? $(storeElement).attr(\"data-store-id\")\n                        : null;\n                });\n\n                form.pidsObj = JSON.stringify(pidsObj);// eslint-disable-line no-param-reassign\n            }\n\n            var storeElement = $(\".product-detail[data-pid=\\\"\"\n                + form.pid\n                + \"\\\"]\");\n\n            if ($(storeElement).length) {\n                form.storeId = $(storeElement).find('.store-name') // eslint-disable-line\n                    .attr(\"data-store-id\");\n            }\n        });\n    },\n    showInStoreInventory: function () {\n        $(\".btn-get-in-store-inventory\").on(\"click\", function (e) {\n            var pid = $(this).closest(\".product-detail\").attr(\"data-pid\");\n            var quantity = $(this).closest(\".product-detail\").find(\".quantity-select\").val();\n            getModalHtmlElement();\n            fillModalElement(pid, quantity);\n            e.stopPropagation();\n        });\n    },\n    removeStoreSelection: function () {\n        $(\"body\").on(\"click\", \"#remove-store-selection\", (function () {\n            deselectStore($(this).closest(\".product-detail\"));\n            $(document).trigger(\"store:afterRemoveStoreSelection\", $(this).closest(\".product-detail\").find(\".quantity-select\"));\n        }));\n    },\n    selectStoreWithInventory: function () {\n        $(\"body\").on(\"store:selected\", function (e, data) {\n            var searchPID = $(\".btn-storelocator-search\").attr(\"data-search-pid\");\n            var storeElement = $(\".product-detail[data-pid=\\\"\" + searchPID + \"\\\"]\");\n            $(storeElement).find(\".selected-store-with-inventory .card-body\").empty();\n            $(storeElement).find(\".selected-store-with-inventory .card-body\").append(data.storeDetailsHtml);\n            $(storeElement).find(\".store-name\").attr(\"data-store-id\", data.storeID);\n            $(storeElement).find(\".selected-store-with-inventory\").removeClass(\"display-none\");\n\n            var $changeStoreButton = $(storeElement).find(\".change-store\");\n            $($changeStoreButton).data(\"postal\", data.searchPostalCode);\n            $($changeStoreButton).data(\"radius\", data.searchRadius);\n\n            $(storeElement).find(\".btn-get-in-store-inventory\").hide();\n\n            updateQuantityOptions(searchPID, data.storeID);\n\n            $(\"#inStoreInventoryModal\").modal(\"hide\");\n            $(\"#inStoreInventoryModal\").remove();\n        });\n    },\n    changeStore: function () {\n        $(\"body\").on(\"click\", \".change-store\", (function () {\n            var pid = $(this).closest(\".product-detail\").attr(\"data-pid\");\n            var quantity = $(this).closest(\".product-detail\").find(\".quantity-select\").val();\n            getModalHtmlElement();\n            fillModalElement(pid, quantity, $(this).data(\"postal\"), $(this).data(\"radius\"));\n        }));\n    }\n};\n","/*!-----------------------------------------------------\n * xZoom v1.0.15\n * (c) 2013 by Azat Ahmedov & Elman Guseynov\n * https://github.com/payalord\n * https://dribbble.com/elmanvebs\n * Apache License 2.0\n *------------------------------------------------------*/\nfunction detect_old_ie(){if(/MSIE (\\d+\\.\\d+);/.test(navigator.userAgent)){var o=new Number(RegExp.$1);return!(9<=o)&&(8<=o||(7<=o||(6<=o||(5<=o||void 0))))}return!1}window.requestAnimFrame=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(o){window.setTimeout(o,20)},function(Ao){function n(s,o){this.xzoom=!0;var t,a,p,l,r,e,n,d,i,c,h,f,u,v,m,g,w,x,b,z,y,C,k,O,M,A,S,H,W,F,I,T,X,Y,R,q,E,L,D,Z,_,j,N,Q,$,B,G,J,K,P,U,V=this,oo={},to=(new Array,new Array),eo=0,io=0,so=0,no=0,ao=0,po=0,lo=0,ro=0,co=0,ho=0,fo=0,uo=0,vo=0,mo=detect_old_ie(),go=/MSIE (\\d+\\.\\d+);/.test(navigator.userAgent),wo=\"\";function xo(){var o=document.documentElement;return{left:(window.pageXOffset||o.scrollLeft)-(o.clientLeft||0),top:(window.pageYOffset||o.scrollTop)-(o.clientTop||0)}}function bo(){var o;\"circle\"==V.options.lensShape&&\"lens\"==V.options.position&&(o=((M=A=Math.max(M,A))+2*Math.max(F,W))/2,k.css({\"-moz-border-radius\":o,\"-webkit-border-radius\":o,\"border-radius\":o}))}function zo(o,t,e,i){\"lens\"==V.options.position?(C.css({top:-(t-n)*T+A/2,left:-(o-d)*I+M/2}),V.options.bg&&(k.css({\"background-image\":\"url(\"+C.attr(\"src\")+\")\",\"background-repeat\":\"no-repeat\",\"background-position\":-(o-d)*I+M/2+\"px \"+(-(t-n)*T+A/2)+\"px\"}),e&&i&&k.css({\"background-size\":e+\"px \"+i+\"px\"}))):C.css({top:-H*T,left:-S*I})}function yo(o,t){var e,i;1<(so=so<-1?-1:so)&&(so=1),X<Y?i=(e=l*(X-(X-1)*so))/R:e=(i=r*(Y-(Y-1)*so))*R,L?(no=o,ao=t,po=e,lo=i):(L||(ro=po=e,co=lo=i),M=l/(I=e/a),A=r/(T=i/p),bo(),ko(o,t),C.width(e),C.height(i),k.width(M),k.height(A),k.css({top:H-F,left:S-W}),O.css({top:-H,left:-S}),zo(o,t,e,i))}function Co(){var o=ho,t=fo,e=uo,i=vo,s=ro,n=co;o+=(no-o)/V.options.smoothLensMove,t+=(ao-t)/V.options.smoothLensMove,e+=(no-e)/V.options.smoothZoomMove,i+=(ao-i)/V.options.smoothZoomMove,s+=(po-s)/V.options.smoothScale,n+=(lo-n)/V.options.smoothScale,M=l/(I=s/a),A=r/(T=n/p),bo(),ko(o,t),C.width(s),C.height(n),k.width(M),k.height(A),k.css({top:H-F,left:S-W}),O.css({top:-H,left:-S}),ko(e,i),zo(o,t,s,n),ho=o,fo=t,uo=e,vo=i,ro=s,co=n,L&&requestAnimFrame(Co)}function ko(o,t){S=(o-=d)-M/2,H=(t-=n)-A/2,\"lens\"!=V.options.position&&V.options.lensCollision&&(S<0&&(S=0),M<=a&&a-M<S&&(S=a-M),a<M&&(S=a/2-M/2),H<0&&(H=0),A<=p&&p-A<H&&(H=p-A),p<A&&(H=p/2-A/2))}function Oo(){void 0!==m&&m.remove(),void 0!==w&&w.remove(),void 0!==N&&N.remove()}function Mo(o){var t=o.attr(\"title\"),o=o.attr(\"xtitle\");return o||t||\"\"}this.adaptive=function(){0!=B&&0!=G||(s.css(\"width\",\"\"),s.css(\"height\",\"\"),B=s.width(),G=s.height()),Oo(),Q=Ao(window).width(),$=Ao(window).height(),J=s.width(),K=s.height(),B<J&&(J=B),G<K&&(K=G),(Q<B||$<G?!0:!1)?s.width(\"100%\"):0!=B&&s.width(B),\"fullscreen\"!=P&&(!function(){var o=s.offset();l=\"auto\"==V.options.zoomWidth?J:V.options.zoomWidth;r=\"auto\"==V.options.zoomHeight?K:V.options.zoomHeight;\"#\"==V.options.position.substr(0,1)?oo=Ao(V.options.position):oo.length=0;if(0!=oo.length)return!0;switch(P){case\"lens\":case\"inside\":return!0;case\"top\":n=o.top,d=o.left,i=n-r,c=d;break;case\"left\":n=o.top,d=o.left,i=n,c=d-l;break;case\"bottom\":n=o.top,d=o.left,i=n+K,c=d;break;case\"right\":default:n=o.top,d=o.left,i=n,c=d+J}return!(Q<c+l||c<0)}()?V.options.position=V.options.mposition:V.options.position=P),V.options.lensReverse||(U=V.options.adaptiveReverse&&V.options.position==V.options.mposition)},this.xscroll=function(o){var t,e;u=o.pageX||o.originalEvent.pageX,v=o.pageY||o.originalEvent.pageY,o.preventDefault(),o.xscale?(so=o.xscale,yo(u,v)):(t=-o.originalEvent.detail||o.originalEvent.wheelDelta||o.xdelta,e=u,o=v,mo&&(e=D,o=Z),so+=t=0<t?-.05:.05,yo(e,o))},this.openzoom=function(o){switch(u=o.pageX,v=o.pageY,V.options.adaptive&&V.adaptive(),so=V.options.defaultScale,L=!1,m=Ao(\"<div></div>\"),\"\"!=V.options.sourceClass&&m.addClass(V.options.sourceClass),m.css(\"position\",\"absolute\"),x=Ao(\"<div></div>\"),\"\"!=V.options.loadingClass&&x.addClass(V.options.loadingClass),x.css(\"position\",\"absolute\"),g=Ao('<div style=\"position: absolute; top: 0; left: 0;\"></div>'),m.append(x),w=Ao(\"<div></div>\"),\"\"!=V.options.zoomClass&&\"fullscreen\"!=V.options.position&&w.addClass(V.options.zoomClass),w.css({position:\"absolute\",overflow:\"hidden\",opacity:1}),V.options.title&&\"\"!=wo&&(N=Ao(\"<div></div>\"),j=Ao(\"<div></div>\"),N.css({position:\"absolute\",opacity:1}),V.options.titleClass&&j.addClass(V.options.titleClass),j.html(\"<span>\"+wo+\"</span>\"),N.append(j),V.options.fadeIn&&N.css({opacity:0})),k=Ao(\"<div></div>\"),\"\"!=V.options.lensClass&&k.addClass(V.options.lensClass),k.css({position:\"absolute\",overflow:\"hidden\"}),V.options.lens&&(lenstint=Ao(\"<div></div>\"),lenstint.css({position:\"absolute\",background:V.options.lens,opacity:V.options.lensOpacity,width:\"100%\",height:\"100%\",top:0,left:0,\"z-index\":9999}),k.append(lenstint)),function(){switch(p=\"fullscreen\"==V.options.position?(a=Ao(window).width(),Ao(window).height()):(a=s.width(),s.height()),x.css({top:p/2-x.height()/2,left:a/2-x.width()/2}),(e=V.options.rootOutput||\"fullscreen\"==V.options.position?s.offset():s.position()).top=Math.round(e.top),e.left=Math.round(e.left),V.options.position){case\"fullscreen\":n=xo().top,d=xo().left,c=i=0;break;case\"inside\":n=e.top,d=e.left,c=i=0;break;case\"top\":n=e.top,d=e.left,i=n-r,c=d;break;case\"left\":n=e.top,d=e.left,i=n,c=d-l;break;case\"bottom\":n=e.top,d=e.left,i=n+p,c=d;break;case\"right\":default:n=e.top,d=e.left,i=n,c=d+a}n-=m.outerHeight()/2,d-=m.outerWidth()/2,\"#\"==V.options.position.substr(0,1)?oo=Ao(V.options.position):oo.length=0,0==oo.length&&\"inside\"!=V.options.position&&\"fullscreen\"!=V.options.position?(V.options.adaptive&&B&&G||(B=a,G=p),l=\"auto\"==V.options.zoomWidth?a:V.options.zoomWidth,r=\"auto\"==V.options.zoomHeight?p:V.options.zoomHeight,i+=V.options.Yoffset,c+=V.options.Xoffset,w.css({width:l+\"px\",height:r+\"px\",top:i,left:c}),\"lens\"!=V.options.position&&t.append(w)):\"inside\"==V.options.position||\"fullscreen\"==V.options.position?(l=a,r=p,w.css({width:l+\"px\",height:r+\"px\"}),m.append(w)):(l=oo.width(),r=oo.height(),V.options.rootOutput?(i=oo.offset().top,c=oo.offset().left,t.append(w)):(i=oo.position().top,c=oo.position().left,oo.parent().append(w)),i+=(oo.outerHeight()-r-w.outerHeight())/2,c+=(oo.outerWidth()-l-w.outerWidth())/2,w.css({width:l+\"px\",height:r+\"px\",top:i,left:c})),V.options.title&&\"\"!=wo&&(\"inside\"==V.options.position||\"lens\"==V.options.position||\"fullscreen\"==V.options.position?(h=i,f=c,m.append(N)):(h=i+(w.outerHeight()-r)/2,f=c+(w.outerWidth()-l)/2,t.append(N)),N.css({width:l+\"px\",height:r+\"px\",top:h,left:f})),m.css({width:a+\"px\",height:p+\"px\",top:n,left:d}),g.css({width:a+\"px\",height:p+\"px\"}),V.options.tint&&\"inside\"!=V.options.position&&\"fullscreen\"!=V.options.position?g.css(\"background-color\",V.options.tint):mo&&g.css({\"background-image\":\"url(\"+s.attr(\"src\")+\")\",\"background-color\":\"#fff\"}),y=new Image;var o=\"\";switch(go&&(o=\"?r=\"+(new Date).getTime()),y.src=s.attr(\"xoriginal\")+o,(C=Ao(y)).css(\"position\",\"absolute\"),(y=new Image).src=s.attr(\"src\"),(O=Ao(y)).css(\"position\",\"absolute\"),O.width(a),V.options.position){case\"fullscreen\":case\"inside\":w.append(C);break;case\"lens\":k.append(C),V.options.bg&&C.css({display:\"none\"});break;default:w.append(C),k.append(O)}}(),\"inside\"!=V.options.position&&\"fullscreen\"!=V.options.position?((V.options.tint||mo)&&m.append(g),V.options.fadeIn&&(g.css({opacity:0}),k.css({opacity:0}),w.css({opacity:0}))):V.options.fadeIn&&w.css({opacity:0}),t.append(m),V.eventmove(m),V.eventleave(m),V.options.position){case\"inside\":i-=(w.outerHeight()-w.height())/2,c-=(w.outerWidth()-w.width())/2;break;case\"top\":i-=w.outerHeight()-w.height(),c-=(w.outerWidth()-w.width())/2;break;case\"left\":i-=(w.outerHeight()-w.height())/2,c-=w.outerWidth()-w.width();break;case\"bottom\":c-=(w.outerWidth()-w.width())/2;break;case\"right\":i-=(w.outerHeight()-w.height())/2}w.css({top:i,left:c}),C.xon(\"load\",function(o){if(x.remove(),!V.options.openOnSmall&&(C.width()<l||C.height()<r))return V.closezoom(),o.preventDefault(),!1;V.options.scroll&&V.eventscroll(m),\"inside\"!=V.options.position&&\"fullscreen\"!=V.options.position?(m.append(k),V.options.fadeIn?(g.fadeTo(300,V.options.tintOpacity),k.fadeTo(300,1),w.fadeTo(300,1)):(g.css({opacity:V.options.tintOpacity}),k.css({opacity:1}),w.css({opacity:1}))):V.options.fadeIn?w.fadeTo(300,1):w.css({opacity:1}),V.options.title&&\"\"!=wo&&(V.options.fadeIn?N.fadeTo(300,1):N.css({opacity:1})),q=C.width(),E=C.height(),V.options.adaptive&&(a<B||p<G)&&(O.width(a),O.height(p),q*=a/B,E*=p/G,C.width(q),C.height(E)),ro=po=q,co=lo=E,R=q/E,X=q/l,Y=E/r;for(var t,e=[\"padding-\",\"border-\"],i=F=W=0;i<e.length;i++)t=parseFloat(k.css(e[i]+\"top-width\")),F+=t!=t?0:t,t=parseFloat(k.css(e[i]+\"bottom-width\")),F+=t!=t?0:t,t=parseFloat(k.css(e[i]+\"left-width\")),W+=t!=t?0:t,t=parseFloat(k.css(e[i]+\"right-width\")),W+=t!=t?0:t;F/=2,W/=2,uo=ho=no=u,vo=fo=ao=v,yo(u,v),V.options.smooth&&(L=!0,requestAnimFrame(Co)),V.eventclick(m)})},this.movezoom=function(o){u=o.pageX,v=o.pageY,mo&&(D=u,Z=v);var t=u-d,e=v-n;U&&(o.pageX-=2*(t-a/2),o.pageY-=2*(e-p/2)),(t<0||a<t||e<0||p<e)&&m.trigger(\"mouseleave\"),V.options.smooth?(no=o.pageX,ao=o.pageY):(bo(),ko(o.pageX,o.pageY),k.css({top:H-F,left:S-W}),O.css({top:-H,left:-S}),zo(o.pageX,o.pageY,0,0))},this.eventdefault=function(){V.eventopen=function(o){o.xon(\"mouseenter\",V.openzoom)},V.eventleave=function(o){o.xon(\"mouseleave\",V.closezoom)},V.eventmove=function(o){o.xon(\"mousemove\",V.movezoom)},V.eventscroll=function(o){o.xon(\"mousewheel DOMMouseScroll\",V.xscroll)},V.eventclick=function(o){o.xon(\"click\",function(o){s.trigger(\"click\")})}},this.eventunbind=function(){s.xoff(\"mouseenter\"),V.eventopen=function(o){},V.eventleave=function(o){},V.eventmove=function(o){},V.eventscroll=function(o){},V.eventclick=function(o){}},this.init=function(o){V.options=Ao.extend({},Ao.fn.xzoom.defaults,o),t=V.options.rootOutput?Ao(\"body\"):s.parent(),P=V.options.position,U=V.options.lensReverse&&\"inside\"==V.options.position,V.options.smoothZoomMove<1&&(V.options.smoothZoomMove=1),V.options.smoothLensMove<1&&(V.options.smoothLensMove=1),V.options.smoothScale<1&&(V.options.smoothScale=1),V.options.adaptive&&Ao(window).xon(\"load\",function(){B=s.width(),G=s.height(),V.adaptive(),Ao(window).resize(V.adaptive)}),V.eventdefault(),V.eventopen(s)},this.destroy=function(){V.eventunbind()},this.closezoom=function(){L=!1,V.options.fadeOut?(V.options.title&&\"\"!=wo&&N.fadeOut(299),\"inside\"==V.options.position&&\"fullscreen\"==V.options.position||w.fadeOut(299),m.fadeOut(300,function(){Oo()})):Oo()},this.gallery=function(){for(var o=new Array,t=0,e=io;e<to.length;e++)o[t]=to[e],t++;for(e=0;e<io;e++)o[t]=to[e],t++;return{index:io,ogallery:to,cgallery:o}},this.xappend=function(e){var i=e.parent();function o(o){Oo(),o.preventDefault(),V.options.activeClass&&(_.removeClass(V.options.activeClass),(_=e).addClass(V.options.activeClass)),io=Ao(this).data(\"xindex\"),V.options.fadeTrans&&((z=new Image).src=s.attr(\"src\"),(b=Ao(z)).css({position:\"absolute\",top:s.offset().top,left:s.offset().left,width:s.width(),height:s.height()}),Ao(document.body).append(b),b.fadeOut(200,function(){b.remove()}));var t=i.attr(\"href\"),o=e.attr(\"xpreview\")||e.attr(\"src\");wo=Mo(e),e.attr(\"title\")&&s.attr(\"title\",e.attr(\"title\")),s.attr(\"xoriginal\",t),s.removeAttr(\"style\"),s.attr(\"src\",o),V.options.adaptive&&(B=s.width(),G=s.height())}to[eo]=i.attr(\"href\"),i.data(\"xindex\",eo),0==eo&&V.options.activeClass&&(_=e).addClass(V.options.activeClass),0==eo&&V.options.title&&(wo=Mo(e)),eo++,V.options.hover&&i.xon(\"mouseenter\",i,o),i.xon(\"click\",i,o)},this.init(o)}Ao.fn.xon=Ao.fn.on||Ao.fn.bind,Ao.fn.xoff=Ao.fn.off||Ao.fn.bind,Ao.fn.xzoom=function(t){var e,i;if(this.selector){var o,s=this.selector.split(\",\");for(o in s)s[o]=Ao.trim(s[o]);this.each(function(o){if(1==s.length)if(0==o){if(void 0!==(e=Ao(this)).data(\"xzoom\"))return e.data(\"xzoom\");e.x=new n(e,t)}else void 0!==e.x&&(i=Ao(this),e.x.xappend(i));else if(Ao(this).is(s[0])&&0==o){if(void 0!==(e=Ao(this)).data(\"xzoom\"))return e.data(\"xzoom\");e.x=new n(e,t)}else void 0===e.x||Ao(this).is(s[0])||(i=Ao(this),e.x.xappend(i))})}else this.each(function(o){if(0==o){if(void 0!==(e=Ao(this)).data(\"xzoom\"))return e.data(\"xzoom\");e.x=new n(e,t)}else void 0!==e.x&&(i=Ao(this),e.x.xappend(i))});return void 0!==e&&(e.data(\"xzoom\",e.x),Ao(e).trigger(\"xzoom_ready\"),e.x)},Ao.fn.xzoom.defaults={position:\"right\",mposition:\"inside\",rootOutput:!0,Xoffset:0,Yoffset:0,fadeIn:!0,fadeTrans:!0,fadeOut:!1,smooth:!0,smoothZoomMove:3,smoothLensMove:1,smoothScale:6,defaultScale:0,scroll:!0,tint:!1,tintOpacity:.5,lens:!1,lensOpacity:.5,lensShape:\"box\",lensCollision:!0,lensReverse:!1,openOnSmall:!0,zoomWidth:\"auto\",zoomHeight:\"auto\",sourceClass:\"xzoom-source\",loadingClass:\"xzoom-loading\",lensClass:\"xzoom-lens\",zoomClass:\"xzoom-preview\",activeClass:\"xactive\",hover:!1,adaptive:!0,adaptiveReverse:!1,title:!1,titleClass:\"xzoom-caption\",bg:!1}}(jQuery);","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","/* eslint-env jquery */\n\n\"use strict\";\n\nconst processInclude = require(\"base/util\");\n\n$(document).ready(function () {\n    processInclude(require(\"./product/details\"));\n    processInclude(require(\"./product/initXZoom\"));\n    processInclude(require(\"plugin_instorepickup/product/pdpInstoreInventory\"));\n    processInclude(require(\"plugin_giftregistry/product/giftRegistry\"));\n    processInclude(require(\"./components/swatchHide\"));\n});\n"],"names":[],"sourceRoot":""}