{"version":3,"sources":["app.js","bootstrap.js","polyfill.js","controller/contact.js","controller/print.js","controller/root.js","directives/app-banner.js","directives/auto-size-img.js","directives/cart-item-preview.js","directives/categories.js","directives/client-nav-menu.js","directives/editable-input.js","directives/elastic.js","directives/image-preview.js","directives/loader.js","directives/map.js","directives/modal-crop.js","directives/modal-frame-flow.js","directives/modal-image.js","directives/pagination.js","directives/stripe-card.js","directives/template-preview.js","filters/distance.js","filters/floor.js","filters/money.js","filters/percent.js","filters/reverse.js","filters/trustedHtml.js","models/address.js","models/api.js","models/apiv2.js","models/base-model.js","models/image.js","models/line-item.js","models/location.js","models/order.js","models/price.js","models/print-service.js","models/product-image.js","models/product-tag.js","models/product.js","models/store.js","services/browser.js","services/cart-image-data.js","services/cart-image.js","services/cart-line-item-page.js","services/cart-line-item.js","services/cart-promo-product-image.js","services/cart-reorder-image.js","services/cart.js","services/config.js","services/crop-helpers.js","services/crop-rect-pos.js","services/debouncer.js","services/exception.js","services/fit-text.js","services/frame-helpers.js","services/gtm.js","services/image-uploader.js","services/locale.js","services/log.js","services/login.js","services/query.js","services/svg.js","services/thumbnailer.js","services/unique.js","services/us-states.js","services/utils.js"],"names":["window","app","angular","module","$window","$q","Promise","$delegate","onUrlChange","$provide","decorator","url","config","$compileProvider","TRANSPARENT_PIXEL","CONFIG","debug","selector","$","adjustCartSize","floor","parent","width","on","evt","preventDefault","href","currentTarget","find","attr","location","onerror","error","dataLayer","push","addEventListener","String","prototype","startsWith","searchString","position","controller","$scope","name","emailAddress","message","api","log","submitContact","printicular","clientName","contactLoading","data","$event","contactSuccess","contactError","contactMessage","then","response","mapErrors","cart","$rootScope","$interpolate","$sce","$timeout","CartLineItem","gtm","query","deliveryCountry","thanks","orderNumber","get","territories","filter","territory","locale","defaultDeliveryCountry","code","attributes","country_code","addressCountry","deliveryCountries","length","_iteratorNormalCompletion","_didIteratorError","_iteratorError","undefined","_step","_iterator","Symbol","iterator","next","done","value","err","defaultCountry","id","addressTerritoryId","files","displayUploadZone","$watch","verbose","uploadErrors","i","image","addImage","addLineItem","event","count","duplicateLineItem","lineItem","index","duplicate","product","extend","settings","updateSummary","summary","totalUnready","checkWaitingUpload","sendOrder","purchase","token","actionField","getOrderJson","order","revenue","affiliation","store","shipping","coupon","couponCode","lineItems","included","type","_loop","cartLineItem","lineItemKey","product_id","variant","gaProducts","gaProcessOrder","fulfillment","products","toString","category_name","unit_price","quantity","brand","retailer_id","transactionData","ecommerce","currencyCode","getCurrency","total","tax","freight_total","orderId","Math","round","Object","placingOrder","errors","errorMessage","join","paymentComplete","validate","onbeforeunload","scrollTop","totalPrice","stripe","createToken","card","result","orderValue","placeOrder","key","content","trustAsHtml","reload","$apply","applyCoupon","couponErrors","totalDiscount","shippingDiscount","dryRunErrors","removeCoupon","updateCustomer","abTest","browser","lat","lon","login","PrintService","time","US_STATES","cookie","match","showPromo","abSource","promises","productTags","storageSet","hasOwnProperty","printService","e","lang","LANG","Date","getTime","printServices","promo","enabled","from","to","promoContent","banner","concat","tags","findById","setPickupProducts","pickUpPrintServices","deliveryPrintService","setDeliveryProducts","all","$broadcast","reorder","this","open","document","keyCode","showImageModal","canEnlarge","modalImage","cropLineItem","canCrop","modalCrop","modalFrameFlow","_ref","$on","closeModal","setTimeout","offset","top","animate","gotoNext","nextSection","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","element","is","target","gotoPrevious","_iteratorNormalCompletion3","_didIteratorError3","_iteratorError3","_step3","_iterator3","previousSection","directive","template","link","scope","$templateCache","isMobile","isIos","isAndroid","android","disableAppleAppStoreMobileBanner","visible","brandName","appleAppStoreUrl","disableGooglePlayMobileBanner","googlePlayUrl","dismiss","install","restrict","resize","squareImageAutoCrop","getPrintServiceSettings","thumbnail","height","getProductSize","imageRatio","cropOrientation","productSize","productRatio","size","maxHeight","getPreviewHtml","$digest","previewImage","first","el","previewSvg","metaData","frame","getSrc","frameHelpers","render","cropHelpers","file","html","change","categories","cleanCategoryName","queryCategory","categoryName","queryCategoryName","category","selected","split","toggleCategory","replace","submit","loading","uid","Unique","inc","state","email","storageGet","apiv2","post","password","deviceId","deviceToken","loginToken","logout","model","editing","required","inputId","random","substr","style","initialHeight","rows","max","pElastic","thumbnailer","canvas","context","getContext","drawImageCover","Debouncer","MARKER_WIDTH","MARKER_HEIGHT","markers","bounds","infoWindow","minZoom","maxZoom","onBoundsChanged","onClickMarker","parseInt","boundsChangeEventDebouncer","maps","boundsChangeExternalDebouncer","google","lng","zoom","markerQueue","markerQueueInterval","processMarkerQueue","clearInterval","_markerQueue$pop","pop","latitude","longitude","iconUrl","Marker","LatLng","icon","getScaledIcon","map","getZoom","markerId","addListener","marker","InfoWindow","scale","scaledSize","Size","origin","Point","anchor","zoomToBox","latitude1","longitude1","latitude2","longitude2","LatLngBounds","points","point","getBounds","contains","getPosition","setVisible","keys","newMarkers","newMarker","setInterval","trigger","apply","_toConsumableArray","setZoom","zoomToFitPoints","fitBounds","setCenter","addMarker","setContent","close","svg","view","isCloseTo","x","y","resizing","movingOffset","cropRectPos","cropRect","aspect","cropRectDebug","cropRectGrid","cropOverlay","cropRectTl","cropRectTr","cropRectBl","cropRectBr","updateCropRect","transformEventPos","draggableRegion","getDraggableRegion","show","getAspectRect","css","transform","floatX","createSVGPoint","originalEvent","touches","fixedX","fixedY","clientY","floatY","matrixTransform","getScreenCTM","inverse","x1","y1","x2","y2","smallestSide","sqrt","pointDistance","endDrag","buttons","which","moving","closest","pointOffset","offsetY","hide","rotation","offsetX","src","productWidth","productHeight","cropWidth","cropHeight","rotate","processedSvg","removeAttr","resetPosition","arguments","remove","append","viewBox","togglePortrait","orientation","updateImage","toggleLandscape","transformOrigin","CropRectPos","ratio","clone","modal","frames","FRAME_FLOW_MODAL","mouseDown","mouseX","mouseY","wrapper","CTM","transformBox","getMousePosition","pageX","pageY","a","f","d","showProductsDraw","applyImageUpdates","getCurrentFrame","rotateFrame","defaults","reset","extractPhotoSvg","selectProduct","setProduct","isPortrait","getFrames","setImageUrl","setImage","load","getProducts","getAttribute","img","getPhotoDefaults","button","_getMousePosition","addFile","resized","totalItems","itemsPerPage","scrollTo","page","pages","offsetTop","min","startPage","lastPage","endPage","ceil","updatePages","prevPage","gotoPage","pageNumber","nextPage","elements","create","hidePostalCode","Stripe","language","fontFamily","fontSmoothing","base","color","fontSize","::placeholder","invalid","iconColor","mount","samplePhoto","addClass","svgImage","each","box","appendTo","territory_id","amount","meta","distance","currencySymbols","EUR","CRC","GBP","ILS","INR","JPY","KRW","NGN","PHP","PLN","PYG","THB","UAH","VND","ZAR","BRL","currency","currencySymbol","toFixed","showCurrencySuffix","percent","items","slice","reverse","factory","BaseModel","_BaseModel","Address","_classCallCheck","_possibleConstructorReturn","_getPrototypeOf","_inherits","_createClass","relationships","_get","call","$http","exception","Api","environment","apiUrl","method","_this","resolve","reject","clientId","Authorization","parameters","param","request","results","RegExp","exec","decodeURIComponent","report","majorError","ApiV2","headers","toLowerCase","constructor","toDashCase","relationship","related","createInstance","_this2","Array","isArray","v","isType","_ret","_typeof","modelData","includedData","instance","charAt","Image","Product","LineItem","formatName","findRelated","processedImage","parseFloat","Store","Location","_stores","findAllRelated","Order","address","subtotalDiscount","freight","freightDiscount","Price","_findById","_products","_asyncToGenerator","regeneratorRuntime","mark","_callee","printServiceId","requestOptions","_args","wrap","_context","prev","include","productTag","sent","mapModel","abrupt","stop","_x","ProductImage","meta_data","ProductTag","productTagName","tagName","tag","hasTags","pixel_width","pixel_height","metric","short_description","_prices","_productTags","_productImages","_printServiceSettings","print_service_id","_settings","printServiceSettings","productSettings","autoEnableProducts","minRes","sortOrder","description","_categorySettings","categorySettings","category_id","limit","productId","p","l","_i","_markerIcons","markerIcon","normalizedName","indexOf","storeMarkerIcon","storeAddress1","city","storeCity","postcode","storePostCode","part","productCodes","getPrintServiceProducts","printServiceProduct","product_code","breakpoints","xs","md","lg","validateSize","isIe11","MSInputMethodContext","test","navigator","userAgent","isSafari","isUnsupported","mediaBreakpointUp","innerWidth","mediaBreakpointDown","px","breakpoint","CartImage","_CartImage","CartImageData","upload","started","progress","isCanvas","getWidth","getHeight","CartLineItemPage","templates","alwaysShowLayouts","regions","elementData","input","_ref$product","_ref$quantity","_ref$settings","_previewSvg","getDefaultProduct","maxQuantity","changeQuantity","productName","getImageWidth","getProductMinWidth","getImageHeight","getProductMinHeight","threshold","productAspectRatio","abs","imageAspectRatio","canEdit","getImageId","productImages","openModal","isErrored","isReady","lineItemJson","vertical","duplicateImage","image_ids","image_id","prices","flow","getStoreProducts","getAvailableProducts","defaultExistingProduct","set","CartReorderImage","thumbnailUrl","imageId","imageUploader","Locale","updatingPrices","updateSummaryDebounce","validations","Cart","images","deliveryProducts","pickupProducts","phone","enableSms","addressLine1","addressPostCode","splice","fireEvent","resetDefaultProducts","storeName","storeId","sortProducts","why","hasNoProducts","confirm","defaultProduct","removeLineItem","sortCallback","collator","Intl","Collator","numeric","sort","aPrice","price","bPrice","b","aSortAttr","bSortAttr","compare","cancel","timer","updateSummaryBounced","bind","defer","promise","updatingSummary","nextId","totalReady","summaryRow","r","productPrice","totalUploadedPercent","validateLineItem","totalQuantity","resolveUpdateSummary","orderJson","serverSummaryRows","productData","fromJsonApi","serverSummaryRow","freight_discount","vendor_discount","subtotal_discount","lineItemErrors","getMaxTotalQuantity","maxTotalQuantity","maxTotalValue","getMaxTotalValue","categoryCounts","_iteratorNormalCompletion4","_didIteratorError4","_iteratorError4","_step4","_iterator4","productCurrencies","getProductCurrencies","getUserCurrency","userCurrency","retailerId","_iteratorNormalCompletion5","_didIteratorError5","_iteratorError5","_step5","_iterator5","_iteratorNormalCompletion6","_didIteratorError6","_iteratorError6","_step6","currencies","_iterator6","getMaxValueByFulfillmentType","pickupMaxTotalQuantity","deliveryMaxTotalQuantity","pickupMaxTotalValue","deliveryMaxTotalValue","pickupValue","deliveryValue","dryRun","validatePhoneNumber","validateEmail","addressCity","addressRegion","phoneNumber","cleanPhoneNumber","stripeToken","addressJson","auto_confirm","coupon_code","version","stripe_token","enable_sms","print_service","line_items","_this3","storeProduct","_this4","_iteratorNormalCompletion7","_didIteratorError7","_iteratorError7","_step7","_iterator7","_this5","getFileKey","mimeType","_this6","md5","Blob","_iteratorNormalCompletion8","_didIteratorError8","_iteratorError8","_step8","_iterator8","isLowRes","_this7","togglePickup","toggleDelivery","_iteratorNormalCompletion9","_didIteratorError9","_iteratorError9","_step9","checksum","_iterator9","Config","currentVersion","storageVersion","localStorage","localStoragePrefix","removeItem","setItem","getStorageKey","prefix","JSON","stringify","storageKey","item","getItem","parse","console","path","CROP_TEMPLATE","minSize","_class","delay","timeout","callback","HOSTNAME_REGEX","UUID_REGEX","DATETIME_REGEX","ISO_DATETIME_REGEX","DATE_REGEX","TIME_REGEX","ORDER_ID_REGEX","DEVICE_TOKEN_REGEX","SHA1_HASH_REGEX","MD5_HASH_REGEX","BEARER_TOKEN_REGEX","hostname","URL_REGEX","matches","utils","cleanString","action","msg","normalise","label","FitText","boundingBox","lines","align","maxFontSize","firstChild","removeChild","boundingBoxHeight","minFontSize","node","createElementNS","lineText","setAttribute","nodes","getComputedStyle","getBBox","wrapperBox","fixLineHeight","querySelectorAll","previousBox","coverImageThumbnail","windowHeight","preferOrientation","getOrientation","createFrameSvg","windowCenterX","windowCenterY","windowWidth","windowRatio","imageWidth","imageHeight","Gtm","Upload","ImageUploader","uploads","uploadingCount","s3Resource","gets3Resource","_register","_getHash","_upload2","startUpload","maxUploadCount","shift","_callee2","s3","hash","extension","_context2","startTime","applyExifRotation","t0","handleUploadError","t1","t2","convertedFileName","remoteLink","bucket","AWSAccessKeyId","accessKeyId","policy","signature","acl","Content-Type","filename","success","endTime","register","_x2","loaded","_callee3","_context3","reader","FileReader","onabort","onloadend","readyState","DONE","_x3","_callee4","imageUrl","_context4","device_token","external_url","_x4","_x5","countryToCurrency","AD","AE","AF","AG","AI","AM","AO","AR","AS","AT","AU","AW","AX","AZ","BA","BB","BD","BE","BF","BG","BH","BI","BJ","BL","BM","BN","BO","BQ","BR","BS","BT","BV","BW","BY","BZ","CA","CC","CD","CF","CG","CH","CI","CK","CL","CM","CN","CO","CR","CU","CV","CW","CX","CY","CZ","DE","DJ","DK","DM","DO","DZ","EC","EE","EG","EH","ER","ES","ET","FI","FJ","FK","FM","FO","FR","GA","GB","GD","GE","GF","GG","GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT","GU","GW","GY","HK","HM","HN","HR","HT","HU","ID","IE","IL","IM","IN","IO","IQ","IR","IS","IT","JE","JM","JO","JP","KE","KG","KH","KI","KM","KN","KP","KR","KW","KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT","LU","LV","LY","MA","MC","MD","ME","MF","MG","MH","MK","ML","MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV","MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI","NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF","PG","PH","PK","PL","PM","PN","PR","PS","PT","PW","PY","QA","RE","RO","RS","RU","RW","SA","SB","SC","SD","SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO","SR","SS","ST","SV","SX","SY","SZ","TC","TD","TF","TG","TH","TJ","TK","TL","TM","TN","TO","TR","TT","TV","TW","TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE","VG","VI","VN","VU","WF","WS","XK","YE","YT","ZA","ZM","ZW","countryCode","logger","Log","_len","messages","_key","_len2","_key2","_len3","details","_key3","title","body","Login","isLoggedIn","parseQueryString","obj","qPos","tokens","s","unescape","search","nodeName","setClipPath","setAttributeNS","clipPath","getViewBox","remember","n","entities","quot","lt","gt","scaron","yuml","circ","tilde","ensp","emsp","thinsp","zwnj","zwj","lrm","rlm","ndash","mdash","lsquo","rsquo","sbquo","ldquo","rdquo","bdquo","dagger","permil","lsaquo","rsaquo","euro","fnof","alpha","beta","gamma","delta","epsilon","zeta","eta","theta","iota","kappa","lambda","mu","nu","xi","omicron","pi","rho","sigma","tau","upsilon","phi","chi","psi","omega","sigmaf","thetasym","upsih","piv","bull","hellip","prime","oline","frasl","weierp","real","trade","alefsym","larr","uarr","rarr","darr","harr","crarr","forall","exist","empty","nabla","isin","notin","ni","prod","sum","minus","lowast","radic","prop","infin","ang","and","or","cap","cup","int","there4","sim","cong","asymp","ne","equiv","le","ge","sub","sup","nsub","sube","supe","oplus","otimes","perp","sdot","lceil","rceil","lfloor","rfloor","rang","loz","spades","clubs","hearts","diams","nbsp","iexcl","cent","pound","curren","yen","brvbar","sect","uml","copy","ordf","laquo","not","shy","reg","macr","deg","plusmn","sup2","sup3","acute","micro","para","middot","cedil","sup1","ordm","raquo","frac14","frac12","frac34","iquest","agrave","aacute","acirc","atilde","auml","aring","aelig","ccedil","egrave","eacute","ecirc","euml","igrave","iacute","icirc","iuml","eth","ntilde","ograve","oacute","ocirc","otilde","ouml","times","oslash","ugrave","uacute","ucirc","uuml","yacute","thorn","szlig","divide","convertHtmlEntitiesToXml","string","entity","entityName","templateSvg","cleanXml","xml","makeDataImageUrl","str","svgString","XMLSerializer","serializeToString","decoded","encodeURIComponent","base64","btoa","Thumbnailer","thumbnails","thumbnailCache","thumbnailingCount","startThumbnailing","readFile","loadImage","ready","errorInfo","onload","readAsDataURL","cx","cy","cw","ch","iw","ih","w","h","nw","nh","ar","drawImage","lastModified","cache","number","seperator","calc","indexOfSmallest","array"],"mappings":"aAAAA,OAAOC,IAAMC,QAAQC,OAAO,MAAO,CAC/B,iBAIAC,IAAAA,IAAAA,CAAO,UAAWC,KAAlB,SAAAD,EAAAC,GADJD,EAAAE,QAAAD,KAMQE,IAAAA,OAAAA,CAAAA,WAAUC,SAAcC,GAD5BA,EAASC,UAAU,WAAY,CAAC,YAAa,SAAUH,GAAvD,OAGIA,EAAAC,YAA4B,aAA5BD,EAAAI,IAAA,WACI,MAAO,IAJfJ,QAYHN,IAFDW,OAAA,CAAA,mBAAA,SAAAC,GAIAb,EAAOc,iBAAoBC,OAAAC,UAGPC,OAAAA,kBAAU,iFAG9BC,EAAA,QAAMC,QAAc,CAAAF,SAAdE,4BAAN,IAAMA,eAAiB,WAGrBnB,EAAAA,kBAAemB,MAAjB,GAAiBA,KAAjBC,MAAAF,EAAA,kBAAAG,SAAAC,QAAA,MAEAH,EAAAA,QAAAA,OAFiBA,gBACjBD,EAAEC,gBAKFD,iBAMCA,EAND,uBAAAK,GAAA,SAAA,SAAAC,GACIA,EAAIC,iBAEJ,IAAMC,EAAOR,EAAEM,EAAIG,eAAeC,KAAK,+BAA+BC,KAAK,QAE3E7B,OAAO8B,SAASJ,KAAOA;aC3C3B1B,OAAO+B,QAAU,SAASC,GACtBC,UAAUC,KAAK,CADZH,MAAP,kBACIE,QAAeD,KAIlBhC,OALDmC,iBAAA,sBAAA,SAAAH,GAQIC,UAAUC,KAAK,CADZC,MAAAA,kBACHF,QAAeD;aCRdI,OAAOC,UAAUC,aAClBF,OAAOC,UAAUC,WAAa,SAAUC,EAAcC,GAAhD,OADLJ,EAAOC,GAAUC,EACXD,KAAUC,QAAAA,EAAuBC,KAAcC;aCD1DvC,IAAIwC,WAAW,oBAAqB,CAChC,SADAA,SAWIC,MACIzC,MACA0C,SACAC,EACAC,EACIC,EALRC,GAOML,EAACM,eAAgB,CACZvB,IAAAA,EAAAA,IAAPwB,YAAAC,WACOC,KAAAA,GACPP,aAAoB,GACVC,QAAA,GACEO,KAAE,IADJV,EAAAM,cAAA,SAAAK,GAIFA,EAAA5B,iBACEiB,EAACS,gBAAP,EACML,EAACQ,KAAAA,UAAiB,CACnBF,KAAA,CACED,KAAAA,UACAI,WAAeb,EAAAc,kBAb9BC,MAAA,WAlBRf,EAAAS,gBAAA,EA4BgBT,EAAOY,eAAiB,wCAAlB,OACD,SAACI,GACNhB,EAAOS,gBAAiB,EACxBT,EAAOa,aAAe,mCAAqCR,EAAIY,UAAUD;aC/BzFzD,IAAIwC,WAAW,kBAAmB,CAC9B,eADAA,aA2BIzC,OAvBJ,SAyBI,WACI4D,MACH,OAvBL,eAyBId,SACIe,MACI,MACID,QACH,SAvBTE,EAwBQD,EACIE,EACHrB,EAtBTsB,EAgBiElB,EAAAc,EAAAK,EAZjErD,EAYiEsD,EAOzDnB,EAA+DoB,GAC3DnE,OAAIoE,MAAAA,EAEHD,EAAAE,SACJT,EAAAU,YAAA,GAXwDxB,EAAAyB,IAAA,eAAAd,MAAA,SAAAC,GAAAG,EAAAW,YAAAd,EAAAN,KAAAqB,QAAA,SAAAC,GAAA,GAAA9D,EAAA+D,OAAAC,wBAAAhE,EAAA+D,OAAAC,uBAAAC,MAAAH,EAAAI,WAAAC,eAAAnB,EAAAoB,eAAAN,IAAA9D,EAAA+D,OAAAM,oBAAArE,EAAA+D,OAAAM,kBAAAC,OAAA,OAAA,EAAA,IAAAC,GAAA,EAAAC,GAAA,EAAAC,OAAAC,EAAA,IAAA,IAAA,IAAAC,EAAAC,EAAA5E,EAAA+D,OAAAM,kBAAAQ,OAAAC,cAAAP,GAAAI,EAAAC,EAAAG,QAAAC,MAAAT,GAAA,EAAA,CAAA,GAAAI,EAAAM,MAAAhB,MAAAH,EAAAI,WAAAC,aAAA,OAAA,GAAA,MAAAe,GAAAV,GAAA,EAAAC,EAAAS,EAAA,QAAA,IAAAX,GAAA,MAAAK,EAAA,QAAAA,EAAA,SAAA,QAAA,GAAAJ,EAAA,MAAAC,GAYlD,OAAP,KAEEU,IAAAA,EAA2BlC,EAACW,YAAiB5C,MAAA8C,SAAAA,GAAS,OAAAA,EAAAsB,IAAApC,EAAAqC,sBAAIvB,IAAhEd,EAAAoB,eAAAe,MAfJrD,EAAAwD,MAAA,GAsBMxD,EAANyD,mBAAA,EAGMzD,EAAN0D,OAAc,SAAS,SAAAF,GACfG,EAAQA,QAAA,cAAqBnB,EAAjCA,QAEArB,EAAWyC,aAAe,GACrB,IAAQ,IAAIC,EAAGL,EAAAA,EAAMhB,EAAQqB,OAAKA,IAAA,CACxB,IAAOC,EAACC,EAASP,SAA5BA,EAAAK,IAEWC,GACFE,EAAYA,YAAIzC,IAAJA,EAAiB,CAAAL,KAAAA,EAAA4C,MAAAA,KACrCN,EAAAhB,QACJhB,EAAAhC,KAAA,CAIOyE,MAAO,YAFfC,MAAkBV,EAAAhB,YAKjBxC,EAAAmE,kBAAA,SAAAC,EAAAC,GAjBL,IAAAC,EAAA,IAAA/C,EAAA,CAAAL,KAAAA,EAAA4C,MAAAM,EAAAN,MAAAS,QAAAH,EAAAG,UAoBOJ,EAAAA,WACGG,EAAgB/C,SAAa/C,EAAAgG,OAAA,GAAAJ,EAAAK,WAA+BF,EAASH,UAASG,OAAAA,EAAAA,EAAAA,GAApFrD,EAAAwD,iBAGIJ,IAAAA,EAAqB,SAArBA,IACHpD,EAAAyD,QAAAC,aAAA,EAQGtD,EAASuD,EAAoB,KAbrCC,KAiDYC,EAAU,SAAAC,GACNC,IAAAA,EAAa/D,EAAAgE,cAAA,EAAAF,GACT1B,EAAItC,KAAAA,yCADKmE,GAAApE,MAAA,SAAAC,GAEToE,OAASpE,eAAcoB,KACvBiD,IAAAA,EAAarE,EAAkBsE,KAAMlD,GAClCpC,EAAEgB,cAAcoB,EACnBmD,EAAQ3D,YAAEA,EACV4D,EAAMlI,QAAOmI,UAAAA,GA5CZb,SAAAA,GAGhB,IAFGtD,IAASuD,EAAAA,GACTa,EAAA1E,EAAA2E,SAAA5D,QAAA,SAAA4D,GAAA,MAAA,cAAAA,EAAAC,QAF+BC,EAAA,SAGlChC,GAQG,IAAMO,EAAWsB,EAAU7B,GAPtBiC,EAAA5E,EAAAwE,UAAA7B,IAAA,KALbkC,EAAA3B,EAAAhC,WAAA4D,WAAA,KAAAF,EAAAA,EAAAG,QAAA,QAeQ,IAAKC,EAAWH,GAAc,CAPlB,IAAGxB,EAAjB4B,KAEcnF,EADhB,YAAAE,EAAAkF,YACyBT,EAAS5D,iBAAO4D,MAAAA,SAAAA,GAAQ,OAAApB,EAAAjB,IAAAc,EAAAhC,WAAA4D,cAAjD9E,EAAAoE,MAAAe,SAAAnH,MAAA,SAAAqF,GAAA,OAAAA,EAAAjB,IAAAc,EAAAhC,WAAA4D,cAFiCE,EAGxBrC,GAHwB,CAIZ6B,GAAAA,EAAjBtD,WAAA4D,WAAAM,WACkBrG,KAAQyF,EAAU7B,EAAMzB,WAA1CnC,KAAA,KACoBmE,SAAShC,EAAW4D,EAAAA,WAApBO,cAAuDT,KAYnEG,QAASH,EAAeA,EAAaG,QAAU,KAXvCF,MAAAA,EAAc3D,WAAAoE,WACZC,SAAd,EAaIC,MAAOxF,EAAKoE,MAAMlD,WAAWuE,aAXeT,EAAY5C,GAAMc,UAAAA,EAAoB4B,WAAtCS,UAdvD5C,EAAA,EAAAA,EAAA6B,EAAAlD,OAAAqB,IAAAgC,EAAAhC,GAaO,IAEO+C,EAAA,CACHrC,MAAUrD,WAAgC2F,UAAYvD,CAAtDwD,aAAA5F,EAAA6F,cACHhC,SAAA,CAkBGE,YAAa,CAjBNc,GAAX/E,EAA0BN,KAAA4C,GAAAgD,WACTlE,QAAW4D,EAAWM,KAAAA,WADbU,MAENzC,YAAQnC,EAAWnC,MAAOiB,EAFpBoE,MAAAlD,WAAAnC,KAAA,WAGLgH,IAAG1C,EAAQnC,KAAAA,WAAWmE,UAC9BT,SAAeA,EAAaG,KAAAA,WAJfiB,cAKN9E,OAATlB,EAAoBsF,YAEflB,SAAMlD,OAAWuE,OAAAA,MAGrCT,EAAU5H,MAACyH,iBAAXa,GAqBJpF,EAAIhC,KAAKoH,GA1CJpF,EAAKhC,KAAO,CAA0ByE,MAAA,eAsB1CmC,YAAAlF,EAAAoE,MAAApE,EAAAoE,MAAAlD,WAAAnC,KAAA,WAwBGkH,QAASnG,EAASN,KAAK4C,GAvBrBsD,WAAkBQ,KAAAC,MAAA,IAAArG,EAAAN,KAAA0B,WAAA4E,SAINb,CAAAnF,MAEFsC,OAOMgE,SAAAA,GATJjH,EAAA/B,MAAA,sBAAA0C,EAAAX,EAAAY,UAAAD,IAFHhB,EAAAuH,cAAA,EAFfvH,EAAAwH,OAAAnH,EAAAY,UAAAD,GAiBUQ,EAAAhC,KAAA,CAEDoH,MAAAA,sBACAa,aAAAzH,EAAAwH,OAAAE,KAAA,MACEtB,YADFlF,EAAAoE,MAAApE,EAAAoE,MAAAlD,WAAAnC,KAAA,WAEQiB,WAAaA,KAAKoE,MAAwB,IAAlBlD,EAAAA,QAAWnC,kBA4BlD6E,EAAY,WAtBZ6C,EAAAA,eAAAA,EACIxC,EAAQjE,OAAKgE,EAAL0C,WACL5H,EAAAwH,OAAAhF,OAAA,EACEqF,EAAAA,KAAAA,CACDjG,MAAcZ,sBACbuG,aAAPvH,EAAAwH,OAAAE,KAAA,MACK9F,YAAcA,EAAnB0D,MAAApE,EAAAoE,MAAAlD,WAAAnC,KAAA,WACU6H,WAAVV,KAAAC,MAAA,IAAAnG,EAAAyD,QAAAoD,eAIM/H,EAACuH,cAAP,EAES,UAAArG,EAAAkF,YAATjF,EAAA6G,OAAAC,YAAA9G,EAAA+G,MAAAnH,MAAA,SAAAoH,GAXJA,EAAA7I,OAFJU,EAAAwH,OAAA,CAAAW,EAAA7I,MAAAa,SA4CYH,EAAOuH,cAAe,EAtBhB/F,EAAAhC,KAAZsF,CACFb,MAAuB,iBACHwD,aAApBU,EAAA7I,MAAAa,QAwBYiG,YAAalF,EAAKoE,MAAQpE,EAAKoE,MAAMlD,WAAWnC,KAAO,WAvBjDuC,WAAY4E,KAAAC,MAAA,IAAAnG,EAAAyD,QAAAoD,eAGVJ,EAAgBD,EAAK1C,MAF5B1B,IAIL8E,EAAYhB,YAhBLO,MA4CnB3H,EAAOqI,WAAa,SAAC1H,GAEjB,GA1BO4G,EAAAA,iBA0BHrG,EAAKyD,QAAQC,aAAe,EAtB5B,OAFKwB,EAAAA,eAAyB,OAC9BuB,EAAe9C,EAAA,KA4BnBC,KAtBQ9E,EAAOwH,QAAUW,GACjBnI,EAAOuH,OAAAA,oBAAP,WACI/H,IAAK,IAAA8I,KAAApK,EAAAqK,QACAvI,EAAEuI,QAAAD,GADFjH,EAAAmH,YAAApH,EAAAlD,EAAAqK,QAAAD,GAAAlH,CAAApB,OAAAA,EAATyI,OAAA,WAHJrJ,SASOqJ,UA4BfzI,EAAOwF,OAAS,CAzBFrD,KAACuG,MAhCf1I,EAAA2I,YAAA,WA6DItI,EAAI/B,MAAM,kBAAmB0B,EAAOwF,OAAOrD,MAzBxCkG,EAAPO,aAAqBjI,GA4BZX,EAAOwF,OAAOrD,MAvBfjB,EAAAuE,WAAAzF,EAAAwF,OAAArD,KACHjB,EAAAwD,gBAAA3D,MAAA,WA4BQG,EAAKyD,QAAQc,WAjBVjE,EAAAhC,KAAA,CACZyE,MAAA,eADJ4E,cAAAzB,KAAAC,MAAAnG,EAAAyD,QAAAkE,cAAA,IAAA3H,EAAAyD,QAAAmE,kBA+BgB1C,YAAalF,EAAKoE,MAAQpE,EAAKoE,MAAMlD,WAAWnC,KAAO,WA3BvDmI,WAAAhB,KAAAC,MAAA,IAAAnG,EAAAyD,QAAAoD,YACNtC,WAAAvE,EAAAuE,cAfGvE,EAAAuE,WAAA,KAPbzF,EAAA4I,aAAA1H,EAAA6H,aAqCY7H,EAAKwD,gBA3BAlD,EAAjBhC,KAAA,CACcyE,MAAA,iBACQ/F,YAAgBgD,EAAAoE,MAAApE,EAAAoE,MAAAlD,WAAAnC,KAAA,WAC9BmI,WAA2BI,KAAAA,MAAwCF,IAA5BlH,EAAAA,QAAalD,YACvDuH,WAAAvE,EAAAuE,kBAZQd,EAAQC,aAAjB,CAAmC,gCAsDvC5E,EAAOgJ,aAAe,WA5BbhJ,EAAOwF,WAAa,KACftE,EAAC0H,iBAgCf5I,EAAOiJ,eAAiB,WA7BY9G,YAA3BsD,EAALW,aACK1B,EAAAA;aClPjBnH,IAAIwC,WAAW,iBAAkB,CAC7B,aADAA,OAyBIzC,UAEA6D,OAEA,SACAd,MAvBJ,MAwBI,QACImB,eACI0H,QADK,YAGZ,SAtBD/H,EAwBIM,EAtBJ0H,EAuBI1H,EACAvD,EACIkL,EACAC,EAFJC,EAIHC,EArBD9H,EAuBAN,GAEAA,OAAWqI,KAAOrI,EAElBA,EAAAsI,UAAAA,EAEAtI,IAAWgI,EAAUA,SAArBO,OAAAC,MAAA,uBAEAxI,EAAU7C,MAACsL,UAAY1L,GACb2L,GAEJC,EAAQtK,KAAd,CACMuK,OAAe7L,EAAA,KApBjBuD,EAAM6D,OAAOpH,EAAO8L,WAAW,QAASvI,EAAM6D,QAbpD7D,EAAAwI,eAAA,QAAAxI,EAAAwI,eAAA,SAAA/L,EAAA8L,WAAA,UAAA,CAkCaE,IAAAA,EAlCbd,KAAA,EAmCgBC,IAAA5H,EAAA4H,KAAA,IACIlI,EAGLjD,OAACiM,EACN9J,EAAU+J,KAAAC,KAJdlJ,EAAAqI,MAAA,IAAAc,MAAAC,UApCNpJ,EAAAqJ,cAAA,GAyBErJ,EAAWmI,MAAQA,EASnBnI,EAAAyC,aAAkCxD,GAAqCe,EAAAgI,QAAAA,EAlCzEhI,EAAAyI,UAAA1L,EAAAuM,MAAAC,SAAAvJ,EAAAqI,MAAAtL,EAAAuM,MAAAE,MAAAxJ,EAAAqI,MAAAtL,EAAAuM,MAAAG,GAAAzJ,EAAA0J,aAAAxJ,EAAAmH,YAAAtK,EAAAuM,MAAAK,QAAA,IAAAhB,EAAA,GAAAC,GAAA7L,EAAAuM,MAAAV,aAAA,IAAAgB,OAAA1M,OAAA+B,IAAAG,YAAAyK,MAAA,IAsBE7J,GAAAA,EAAAA,GAAAA,EAAAA,OAAAA,EAAAA,IAtBF,IAsBEA,IAtBF0B,EAsBE1B,EAAAA,WAAAA,IAtBF+I,EAsBE/I,EAAAA,MAtBFd,EAAA/B,MAAA,sCAAA4L,EAAA5G,IAAAwG,EAAAtK,KAAA+J,EAAA0B,SAAAf,EAAA5G,GAAAyG,GAAAhJ,MAAA,SAAAmJ,GAAA/I,EAAAqJ,cAAAN,EAAA5G,IAAA4G,EAAAhJ,EAAAgK,kBAAAhB,EAAA7D,SAAA6D,EAAA5G,OAAA,OAAA,SAAA6G,GAAA9J,EAAAf,MAAA,uCAAA4K,EAAA5G,GAAA6G,QAAArH,EAAA5E,EAAAkC,IAAAG,YAAA4K,oBAAApI,OAAAC,cAAAP,GAAAI,EAAAC,EAAAG,QAAAC,MAAAT,GAAA,EAAAoD,IAsBE1E,MAAAA,GAAAA,GAAAA,EAAAA,EAAAA,EAAAA,QAAAA,IAAAA,GAAAA,MAAAA,EAAAA,QAAAA,EAAAA,SAAAA,QAAAA,GAAAA,EAAAA,MAAAA,GAqBIjD,EAAOkC,IAAIG,YAAY6K,qBAAqB9H,KAAtCjD,EAAN/B,MAAWiC,yCAAqCrC,EAAAkC,IAAAG,YAAA6K,qBAAA9H,IAC5ChF,EAAMkB,KAAA+J,EAAA0B,SAAA/M,EAAVkC,IAAoDlC,YAAWqC,qBAAY6K,GAAAA,GAA3ErK,MAAA,SAAAmJ,GACS1K,EAAK+J,cAAsBrL,EAAOkC,IAAIG,YAAY6K,qBAAqB9H,IAAIyG,EACtE7I,EAACsJ,oBAAcN,EAAuBkB,aAF1C,OAGDC,SAAAA,GACAhL,EAAAf,MAAC6K,oCAAMA,QAKpBvM,QAAQ0N,IAAIxB,GAAZ,SAA8B,WAAtBwB,EAARC,WAAA,kBACeA,EAAAA,SAEPrK,EAAKsK,QAAQ/J,EAAM+J,YAH3BhN,EAAA,QAAAK,GAAA,QAAA,KAAA,WAOUA,IAAGG,EAASR,EAAtBiN,MAA2BtM,KAAA,QACb,GAAIH,GAAd,MAAqBG,EAAK,IAElB+B,EAAKwE,UAAUlD,OAAVkD,OADGpI,OAAJoO,KAAZ1M,IACuBwD,KAH3BhE,EAAAmN,UAAA9M,GAAA,WAAA,SAAAoF,GAWQN,OADPtD,EAADsD,QAAe,YAAWM,EAAA2H,SACV3H,EAAA2H,SAER,KAAK,GADKA,EAAdL,WAAA,UAGQpK,EAAAuH,YAERvH,EAAAA,QAAWuH,QAAX,WAPJvH,EAAAoK,WAAA,aAUApK,EAAA0K,eAAA,SAAA/H,GAKI,QAAKA,EAAMgI,eACP3K,EAAA4K,WAAAjI,GACH,IAED3C,EAAA6K,aAAA,SAAA5H,GALJ,QAAAA,EAAA6H,YASS7H,EAAS6H,UAAW7H,GACrB,IAEJjD,EAAW+K,WAAY9H,WAChBjD,EAAP4K,WAAA,KALJ5K,EAAA+K,UAAA,KAWI/K,EAAWgL,eAAiB,MAD5BhL,EAAW+K,UAAX,SAAAE,GAAA,IAAAnM,EAAAmM,EAAAnM,KAAAmE,EAAAgI,EAAAhI,SACAjD,EAAWgL,aAHfhL,EAAAlB,GAAAmE,GAM0BnE,EAAqBoM,IAArBpM,UAAqB,WAAfmE,EAAekI,gBAA/CnL,EAAA,KAAA,SAAAmC,GAUIiJ,YAAW,WALf,IAAeC,EAAUhO,EAAA,IAAAuM,OAAAzH,IAAMkJ,SAChBF,EAAAA,QAAX,OAAAhJ,EAAAkJ,EAAAhO,EAAA,IAAAuM,OAAAzH,KADJkJ,GAAAA,EAAAC,KAIAjO,EAAA,cAAkBkO,QAAQ,CACX5E,UAAM0E,EAAAC,KACG,OAQjB,IAJKjO,EAAEmO,SAAcD,SAAhB/L,GACImH,IAAAA,GAAW0E,EADfI,EAAA,KAAwBC,GAAA,EAAAC,GAAA,EAAAC,OAAAnK,EAAA,IAG3B,IAAA,IAAAoK,EAAAC,EAAAzO,EAAA,+BAAAuE,OAAAC,cAAA6J,GAAAG,EAAAC,EAAAhK,QAAAC,MAAA2J,GAAA,EAAA,CAAA,IAAAK,EAAAF,EAAA7J,MARL,GAAAF,GAAAzE,EAAA0O,GAAAC,GAAA,mBAAA3O,EAAA0O,GAAAC,GAAA,YAAA,CADJP,EAAAM,EAmBY,MANUA,GAACvM,EAAWyM,SAC9BnK,GAAA,IARgC,MAAAG,GAAA0J,GAAA,EAAAC,EAAA3J,EAAA,QAAA,IAAAyJ,GAAA,MAAAI,EAAA,QAAAA,EAAA,SAAA,QAAA,GAAAH,EAAA,MAAAC,GAOFH,GAAApO,EAAA,cAAAkO,QAAA,CAatB5E,UAAWtJ,EAAEoO,GAAaJ,SAASC,KAbb,MAI1BtL,EAAQkM,aAAkB,SAAA1M,GACtBiM,IAAAA,EAAA,KADsBU,GAAA,EAAAC,GAAA,EAAAC,OAAA5K,EAAA,IAEtB,IAAA,IAAA6K,EAAAC,EAAAlP,EAAA,+BAAAuE,OAAAC,cAAAsK,GAAAG,EAAAC,EAAAzK,QAAAC,MAAAoK,GAAA,EAAA,CAAA,IAAAJ,EAAAO,EAAAtK,MACG,GAAI+J,GAAWvM,EAAOyM,OAClB,MAEd5O,EAAA0O,GAAAC,GAAA,mBAAA3O,EAAA0O,GAAAC,GAAA,cAV6BQ,EAAAT,IAIA,MAAA9J,GAAAmK,GAAA,EAAAC,EAAApK,EAAA,QAAA,IAAAkK,GAAA,MAAAI,EAAA,QAAAA,EAAA,SAAA,QAAA,GAAAH,EAAA,MAAAC,GAJAG,EAAAnP,EAAA,cAAAkO,QAAA,CAAA5E,UAAAtJ,EAAAmP,GAAAnB,SAAAC,KAAA,KAAAjO,EAAA,cAAAkO,QAAA,CAAA5E,UAAA,GAAA;aCxJ1CvK,IAAIqQ,UAAU,aAAc,CACxB,iBADAA,UAWI,SACIC,QACAC,SACIC,EACAA,EACAA,EACAA,GAEIrH,MAAOxI,CACJ2P,SAAEG,EAAAnM,IAAA,cAHTiM,KAAA,SAAAC,GAHAA,EAAME,SAAW9E,EAAQ+E,OAAS/E,EAAQgF,UAShCJ,EAACI,UAAXhF,EAA6BgF,aAAA1M,EAAA2M,QACrBL,EAAMG,MAAUhQ,EAAOmQ,SAAAA,EAAAA,IACjBvD,EAANA,OAAmB5M,CACb4M,SAAOwD,EAChB5H,MAAAxI,EAAAqQ,UAPDtQ,IAAK,MAUK6M,EAAOwD,mBAChBP,EAAAG,QAAAhQ,EAAAmQ,kCAAAnQ,EAAAsQ,mBACJT,EAAAjD,OAAA7M,IAAAC,EAAAsQ,iBANOT,EAAMjD,OAAOwD,SAAU,GASdA,EAAbH,YAAAjQ,EAAAuQ,+BAAAvQ,EAAAwQ,gBADJX,EAAAjD,OAAA7M,IAAAC,EAAAwQ,cAJQX,EAAMjD,OAAOwD,SAAU,IAQ/BP,EAAAY,QAAA,WAIHZ,EAAAjD,OAAAwD,SAAA,GAJGP,EAAMa,QAAU,WACZb,EAAMjD,OAAOwD,SAAU,EACvBhR,OAAOoO,KAAKqC,EAAMjD,OAAO7M;aCxC7CV,IAAIqQ,UAAU,eAAgB,CAC1B,MADAA,OAOI,SACAvN,EACIwO,GADG,MAAA,CAKGA,SAAA,IACIC,MAAS,CACLC,SAAAA,iBAEAxK,KAAAA,SAAgBH,EAAAA,GAH1B,IAAM0K,EAAS,WAKF,IAAIvK,EAASrD,EAAA8N,0BAAAD,qBAAA,YACFjL,EAASM,EAAAA,SAAe6K,MAAAA,WAAkBlB,EAAM3J,SAASN,MAAMmL,UAAUC,MACxE3K,EAASH,EAANA,SAAuB+K,QAF/C,GAAIrL,GAASS,EAAS,CAKJ,IAAd6K,EAAqBrB,EAAA3J,SAAAN,MAAAmL,UAAArQ,MAAAmP,EAAA3J,SAAAN,MAAAmL,UAAAC,OACCH,EAAAA,EAAlB3K,SAAAG,QAAA4K,iBAEeE,EAAf,KASQzQ,GAAR,aAPeyQ,EADZ,GAAAD,EACHL,EACHK,EAAA,EAHqB,YAMlB,YAGA,CAEOC,IAAAA,EAAmBC,EAAa1Q,MAAA0Q,EAAAJ,OAAAI,EAAA1Q,MAAA0Q,EAAAJ,OAAAI,EAAAJ,OAAAI,EAAA1Q,MACvCyB,EAAAsD,QAAA,yBAAAyL,EAAAG,EA5BF,IA4BEA,GACMA,EAAeD,MA7BvB,IA6BuBC,GAHrBrC,EAAQgC,OA1BV,UA8Bc,GAA2BE,aAA3BC,EAAuCE,CAEpCC,IAAOD,EAAtBD,EAAA1Q,MAAA0Q,EAAAJ,OAAAI,EAAA1Q,MAAA0Q,EAAAJ,OAAAI,EAAAJ,OAAAI,EAAA1Q,MACHyB,EAAAsD,QAAA,0BAAAyL,EAAAG,EAjCC,IAiCDA,GACErC,EAAAtO,MAlCD,KAmCUsO,EAAAgC,OAnCV,IAmCUK,SAGflP,EAAAsD,QAAA,2CAAAG,EAAAS,GAnCL2I,EAAAtO,MAHU,KAqCFsO,EAAQgC,OArCN,MA0CJnB,EAAArK,OAAA,mFAAAoL,GACTf,EAAA1B,IAAA,SAAAyC,GA9CLA;aCRRvR,IAAIqQ,UAAU,mBAAoB,CAC9B,cADAA,eASI,OACIiB,SACAd,EACI3J,EAHDlD,GAMC6M,MAAM7M,CAEAuO,SAAYvC,IAElBA,MAAawC,CACPtL,SAAA,KAGF0K,KAAM,SAAAf,EAAAb,GACAyC,EAANzO,KAAAA,EAGEwC,IAAO+L,EAAAvC,EAAAgC,SAiBL,SAAAJ,IACU1K,IAAAA,EAASwL,EAAAA,WAAcC,QAIjCC,EAAAZ,SAAAO,GAXAK,EAAGZ,OAAOO,GAmBV,SAAAC,IAdJ,GAAI3B,EAAM3J,SAAU,CAeNA,GAAN2J,EAAegC,SAAYH,aACdxL,OAAS2L,EAAAA,SAAtBH,aAIMxL,GAAN2J,EAAJ3J,SAA0BG,SACtBwJ,EAAA3J,SAAAG,QAAAyL,SAAAC,OACW7L,EAASN,SAAhBA,OACaM,EAAAA,SAAe1D,MAA5BwP,SAEJ,OAAAC,EAAAC,OAAArC,EAAA3J,UAEWiM,GAAAA,EAAYD,SAAOrC,WAC7B,OAAAA,EAAA3J,SAAA2L,WAIF,GAAAhC,EAAA3J,SAAAN,MAAP,CAEP,IAAAiK,EAAA3J,SAAAN,MAAAwM,MAAAvC,EAAA3J,SAAAN,MAAApD,KApEL,OAAAqN,EAAA3J,SAAAN,MAAApD,KA4DoB,GAAIqN,EAAM3J,SAASN,MAAMoM,SACrB,OAAOG,EAAYD,OAAOrC,EAAM3J,WAK5C,MAAO,8BA9CH8I,EAAawC,KAAAA,KACPZ,IAHdf,EAAA1B,IAAA,UAAA,WAJIyC,IAWKA,EAAUa,aAGRT,EAAHxL,OAAc+L,6GAAW,WACfA,YAAV,WACHvC,EAAAqD,KAAAb,KACJZ,MATM;aC/BvBvR,IAAIqQ,UAAU,cAAe,CACzB,MADAA,QAOI,SACIiB,EACAd,GAEIyC,MAAQ,CAJT3B,SAAA,IAMKd,MAAA,CAQF0C,WAAU1C,eACN2C,OAAAA,sBAAN7C,SAAA,qbAIsBC,KAAA,SAAAC,GACP4C,IAAAA,EADO,SAAAC,GAERC,OAAAA,EAAoBH,cAAkBC,QAAAA,aAA5C,KACA,GAAAlP,EAAAgP,WAAA,CAAA,IAAAhO,GAAA,EAAAC,GAAA,EAAAC,OAAAC,EAAA,IAFJ,IAEI,IAFJC,EAEIgD,EAAA,WAAA,IAFO8K,EAEP9N,EAAAM,MACc0N,EAAAH,EAAAC,GACAG,EAAA/C,EAAA0C,WAAAvR,MAAqC2R,SAAAA,GAAAA,OAAAA,EAAmBC,EAAlE7Q,OAAA4Q,KACSE,GACN1Q,EAAA/B,MAAA,oCAAAuS,EAAAC,GACOA,EAAAC,UAAA,GARA1Q,EAAA/B,MAAA,gCAAAuS,IAClB/N,EAA4BrB,EAAMgP,WAAWO,MAAM,KAAnDjO,OAAAC,cAAAP,GAAAI,EAAAC,EAAAG,QAAAC,MAAAT,GAAA,EAAyDoD,IAErD,MAAAzC,GAAAV,GAAA,EAAAC,EAAAS,EAAA,QAAA,IAAAX,GAAA,MAAAK,EAAA,QAAAA,EAAA,SAAA,QAAA,GAAAJ,EAAA,MAAAC,IAHcoL,EAAAkD,eAAA,SAAAH,GAAAzQ,EAAA/B,MAAA,qBAAAwS,EAAAC,UAAAD,EAAAC,SAAAhD,EAAAyC,UAAAzC,EAAAyC;aC1BtCjT,IAAIqQ,UAAU,iBAAkB,CAC5B,aADAA,SAaI,QACIiB,QACAqC,SACAnD,SAEAF,EAkEI3P,EACA6P,EACAA,EACAA,GAEAA,MAAMzO,CACAgK,SAAQnI,IA3ElB+P,SAAS,EA6ECC,MAAN,GAEIpD,SAAMqD,2hJAVdtD,KAAM,SAAUC,GACZA,EAAMsD,IAAMC,EAAOC,MACnBxD,EAAMyD,MAAQ,aACdzD,EAAM0D,MAAQvT,EAAOwT,WAAW,UAAY,GAC5C3D,EAAMqD,SAAU,EAChBrD,EAAMzO,MAAQ,KACdyO,EAAMzE,MAAQnI,EAAWmI,MAEzByE,EAAMoD,OAAS,SAACxQ,GACZA,EAAO5B,iBACPgP,EAAMqD,SAAU,EAChBrD,EAAMzO,MAAQ,KACdqS,EAAMC,KAAK,uBAAwB,CAC/BlR,KAAM,CACFkF,KAAM,eACNxD,WAAY,CACRlC,aAAc6N,EAAM0D,MACpBI,SAAU9D,EAAM8D,SAChBC,SAAU5T,EAAO6T,gBAG1BhR,MAAK,SAACC,GACL+M,EAAMqD,SAAU,EAChB9H,EAAMA,MAAMtI,EAASN,KAAK0B,WAAW4P,WAAYhR,EAASN,KAAK0B,WAAWnC,SAX9E,OAYS,SAACX,GACNyO,EAAMqD,SAAU,EAChBrD,EAAMzO,MAAQA,MAItByO,EAAMkE,OAAS,WACX3I,EAAM2I,SACN3U,OAAO8B,SAAWlB,EAAOD,IAAI;aCpHjDV,IAAIqQ,UAAU,kBAAkB,WAC5B,MAAO,CADPA,SAAU,KACVsD,SAAO,EACHrC,MAAU,CACHqD,MAFJ,kBAGIC,QAAA,0BACEC,SAAE,2BACPD,MAAS,wBACTC,KAAU,uBACLC,QAAE,sBAEPA,SAAS,gtBAqBbvE,KAAM,SAAU9N,GACZA,EAAOqS,QAAUrS,EAAOqS,SAAWjL,KAAKkL,SAAShM,SAAS,IAAIiM,OAAO,EAAG,GACxEvS,EAAO4F,KAAO5F,EAAO4F,MAAQ,YACC,IAAnB5F,EAAOmS,UACdnS,EAAOmS,SAAU,QAEU,IAApBnS,EAAOoS,WACdpS,EAAOoS,UAAW;aCtClC7U,IAAIqQ,UAAU,WAAY,CAAC,WAAY,SAAUtM,GAC7C,MAAO,CADPsM,SAAU,IACVE,KAAO,SAAA9N,EAAAkN,EAAA9K,GAEGpC,EAAS8N,cAAaZ,EAAS9K,eAAY8K,EAAA,GAAAsF,MAAAtD,OAEvC,IAACuD,EAAAA,WAEHvF,EAAQ,GAAGwF,KAAOtL,KAAKuL,IAAIvQ,EAAWwQ,UAAY,EAAG1F,EAAQ,GAAG/J,MAAM6N,MAAM,SAASxO,SAArF0K,EAAWwF,GAAX,eAA2BtQ,GAD/Bd,EAAAwN,EAAA;aCNZvR,IAAIqQ,UAAU,gBAAiB,CAC3B,cADAA,SAKIiF,GAEI3B,MAAS,CACFrC,SAAA,IACHzK,SAAU,EAJX2J,MAAA,CAMG3J,SAAU2J,kBAEJD,KAACmB,SAAcA,EAAAA,GACflB,EAAArK,OAAA,sBAAA,SAAAuL,GACHA,GAAAA,EAAA6D,QAESC,EAAU7F,KAAW8F,MAAAA,WAChBpU,IAAQmU,EAAnB7F,EAAA,GAAA8F,WAAA,MACW9D,EAAX,GAAAtQ,MAAA,GACYqU,EAAAA,GAAAA,OAAZ,GAJJJ,EAAAI,eAAAF,EAAA9D,EAAA6D;aChBpBvV,IAAIqQ,UAAU,UAAW,CACrB,WADAA,MAAU,CAECiB,SAAA,KACKqC,SADL,EAEIrD,SAFJ;8dCFftQ,IAAIqQ,UAAU,OAAQ,CAClB,YACA,MACA,SACIsF,EACA7S,GAEA,IAAM8S,EAAe,GACfC,EAAgB,GAR1BxF,MAAU,CAOAuF,SAAe,IACfC,MAAa,CAEZC,QAAA,eACOC,OADP,cAEIC,WAAA,kBACMC,QAAA,eACDC,QAAA,eACEC,gBAAE,uBACHC,cAJN,sBAMHD,KAAAA,SAAiB3F,EAAAb,GACjByG,EAAezE,OAAA,KAThBnB,EAAAyF,QAAAI,SAAA7F,EAAAyF,UAAA,GAWGzF,EAAA0F,QAAiBvG,SAASa,EAAA0F,UAAA,GAEtBD,IAAUI,EAAhB,IAAAV,EACgBU,EAAhB,IAAAV,EAEMW,EAAAA,IAAAA,OAA6BC,KAAIZ,IAAAA,EAAvCrR,IAAA,GAAA,CACMkS,OAAAA,CACUC,KAAOF,WACXG,IAAA,aAECC,KAAAnG,EAAAyF,QAHmCA,QAAAzF,EAAAyF,QAKhCA,QALgCzF,EAAA0F,QAMnC1F,mBANmC,EAOnCA,cAPmC,IAS9BoG,EAAA,GATlBC,EAAA,KAWMD,SAAcE,IAChBD,IAAAA,IAAmBvQ,EAAG,EAA1BA,EAAA,GAAAA,IAAA,CAGQ,KAAIsQ,EAAY3R,OAAS,GAoBb,OAAoB8R,cAAAF,QAERf,EAAO,OAtBH,WAAA,IAAAkB,EAAAJ,EAAAK,MADR3Q,EACQ0Q,EADR1Q,GAChB4Q,EAAwBF,EAAxBE,SAAwBC,EAAAH,EAAAG,UAAAC,EAAAJ,EAAAI,QAAAjU,EAAA6T,EAAA7T,KAAA2S,EAAA/P,KAAA+P,EAAA/P,GAKpBqR,IAAAA,OALoBb,KAAAc,OAAA,CAAA9U,SAAA,IAAAkU,OAAAF,KAAAe,OAAAJ,EAAAC,GAWhBI,KAAMC,EAAcC,EAAIC,UAAWN,GAHzBK,IAAAA,EACIhB,KAAAA,IAERe,EAAkBE,YAAWN,EAFFpB,WAAA2B,UAAA5R,GAAAiQ,EAAA7H,KAAAsJ,EAAA3B,EAAA/P,IAArC0Q,OAAAF,KAAA7P,MAAAkR,YAAA9B,EAAA/P,GAAA,SAAA,WAUIjD,EAAIsD,QAAQ,iBAAkBL,EAAI+P,EAAQ/P,IAJ1CyK,EAAoBA,cAAA,CACCsF,GAAAA,EACxB+B,OAAA/B,EAAA/P,SAjBmB,IA4BxB8Q,OAAAA,IAAAA,EAEH,IAAAf,EAAA,GACJE,EAAA,IAAAS,OAAAF,KAAAuB,WAAA,CAGL9M,QAAA,KA8BK,SAAAwM,EAAAb,EAAAjW,GAJL,IAAAqX,EAAApB,EAAAnG,EAAA0F,QASI,MAAO,CAFFsB,IAAcb,EACDqB,WAAS9B,IAA3BO,OAAAF,KAAA0B,KAAArC,EAAAmC,EAAAlC,EAAAkC,GACOG,OAAA,IAAAzB,OAAAF,KAAA4B,MAAA,EAAA,GAAAC,OAAA,IAAA3B,OAAAF,KAAA4B,MAAAvC,EAAAmC,EAAA,EAAAlC,EAAAkC,IAesB,SAAAM,EAAAC,EAAAC,EAAAC,EAAAC,GAU7B3V,EAAIsD,QAAQ,yBAA0BkS,EAAWC,EAAYC,EAAWC,GAV3C,IAAA1C,EAAA,IAAAU,OAAAF,KAAAmC,aAG7B3C,EAAA9O,OAAoB0R,IAApBlC,OAAAF,KAAAe,OAAAgB,EAAAC,IAAWK,EAAiB3R,OAAA,IAAAwP,OAAAF,KAAAe,OAAAkB,EAAAC,IACjBxR,EAAAA,UAAWwP,GArD1BA,OAAAF,KAAA7P,MAAAkR,YAAAH,EAAA,kBAAA,WAEgB3U,EAAhBsD,QAAA,4BACgBkQ,EAAmBwB,SAAW,WACjC,IAAA/B,EAAA0B,EAAAoB,YAIG,IAAA,IAAAlB,KAAZ7B,EAAA,CACAQ,IAA0BuB,EAAS/B,EAAA6B,GACZkB,EAAAA,WAEnB9C,EAAA+C,SAAAjB,EAAAkB,gBAEgBjW,EAAGgT,QAAQ6B,gCAAvB5B,GACOiD,EAAWjD,gBAAgB8B,CACrC9B,OAAAA,UAGDU,OAAAF,KAAA7P,MAAAkR,YAAAH,EAAA,gBAAA,WAVJ,IAAA,IAAAE,KAAA7B,EAAA,CAFJ,IAAA+B,EAAA/B,EAAA6B,GAkBkBC,EAAAA,QAAlBJ,EAAmCC,EAAgBC,UAAAG,EAAMN,KAAA7W,UAwBxB8P,EAAArK,QAAA,WAAA,OAAA4D,OAAAkP,KAAAzI,EAAAsF,SAAA7Q,UAAA,WAAAnC,EAAAsD,QAAA,sBAAAoK,EAAAsF,SAAA,IAf7B+B,EAe6BqB,EAAA,GAAA,IAAA,IAAAvB,KAAAnH,EAAAsF,QAAA,CAAA,IAAAqD,GAf7BtB,EAe6BrH,EAAAsF,QAAA6B,GAThCf,EAAA3U,KAAA4V,QAIQhB,IAFTA,EAA2BuC,YAAAtC,EAAA,MAOMqC,GAAAD,EAAAjX,KAAAkX,OAAA3I,EAAArK,OAAA,UAAA,WAAAqQ,EAAA6C,SAAA,WAAA7I,EAAAuF,OAAAA,QA8BrBjT,EAAIsD,QAAQ,4BAA6BoK,EAAMuF,QAxBvDsC,EAAAiB,WAAA,EAAAC,mBAAA/I,EAAAuF,OAAAA,UACHvF,EAAAuF,OAAA8B,QA0BW/U,EAAIsD,QAAQ,4BAA6BoK,EAAMuF,QAxBxCuC,EAAAA,UAAWC,EAAYC,EAAAA,OAAWC,QAAYM,eACjDtB,EAAA+B,QAAAhJ,EAA0B8H,UACd/B,EAAKmC,OAAAA,QACXjC,EAAMrQ,QAAMkR,4BAA9B9G,EAAAuF,QAhBIc,SAAsBuC,GACzBtW,EAAAsD,QAAA,4BAAAuS,GACJ,IAAA5C,EAAA,IAAAU,OAAAF,KAAAmC,aAFyC5B,GAAAA,EAAAA,GAAAA,EAAAA,OAAAA,EAAAA,IAOtC,IAAA,IAAAxR,EAAAC,EAAoBoT,EAApBnT,OAAAC,cAAAP,GAAAI,EAAAC,EAAAG,QAAAC,MAAAT,GAAA,EAA4B,CAAA,IAAjB0T,EAAiBtT,EAAAM,MAHvB6T,EAAgBd,OAAzB,IAAiClC,OAAAF,KAAAe,OAAAsB,EAAA,GAAAA,EAAA,MAJS9B,MAAAA,GAAAA,GAAAA,EAAAA,EAAAA,EAAAA,QAAAA,IAAAA,GAAAA,MAAAA,EAAAA,QAAAA,EAAAA,SAAAA,QAAAA,GAAAA,EAAAA,MAAAA,GAM5BW,EAAGiC,UAAWnD,GAWNE,CAAJjG,EAAuBgI,OAAWC,SAChDjI,EAAAuF,OAAA6C,QACH9V,EAAAsD,QAAA,2BAAAoK,EAAAuF,OAAAvF,EAAAyF,SAAAzF,EAAA0F,QAAA1F,EAAAyF,SAAA,GA0BWwB,EAAIkC,UAAU,IAAIlD,OAAOF,KAAKe,OAAO9G,EAAMuF,OAAO6C,MAAM,GAAIpI,EAAMuF,OAAO6C,MAAM,KAxB9EnB,EAAA+B,QAAA3P,KAAAC,MAAA0G,EAAAyF,SAAAzF,EAAA0F,QAAA1F,EAAAyF,SAAA,WACT,GA6BJzF,EAAMrK,OAAO,cAAc,WA3BZwR,EAAAA,QAAYnH,yBAAeA,EAAAwF,YACnBxF,EAAGoJ,YAGjB5D,EAAA6D,WAAArJ,EAAAwF,WAAAhL,SACJwF,EAAAwF,WAAA2B,UAAA7B,EAAAtF,EAAAwF,WAAA2B,UARL3B,EAAA7H,KAAAsJ,EAAA3B,EAAAtF,EAAAwF,WAAA2B,WAWInB,EAAAA,SAsBIR,EAAW8D,WApBH1T;aC7JhCpG,IAAIqQ,UAAU,aAAc,CACxB,aADAA,cAOI,SACIiB,EACAd,GAkFI,MAAE,CACI3D,SAAOjJ,IACPmW,MAAMpK,GAGRqK,SAAO,6nDAAAxM,OA2BOzN,OAAAc,kBA3BP,y1HA8EHoZ,KAAAA,SAAgBC,EAAGtB,GACnBpI,EAAO3D,KAAPjJ,EAAAiJ,KACH,IAAAkN,EAAApK,EAAAhO,KAAA,OAlFC4E,EAAQwT,EAAIpY,KAAK,SAoFRqY,EAAA,CACVE,EAAA,EAjFDC,EAAG,EAkFCF,MAAe,EACRtI,OAAA,GA/EXyI,GAAW,EAiFPH,GAAS,EACFI,EAAP,KACHC,EAAA,KACGC,EAAA5K,EACMwK,KAAKK,gBAGJC,EAAP9K,EAAAhO,KAAA,sBACH+Y,EAAA/K,EAAAhO,KAAA,gBAjFCgZ,EAAchL,EAAQhO,KAAK,mBAmF7BiZ,EAAAjL,EAAAhO,KAAA,0BAvBJkZ,EAAAlL,EAAAhO,KAAA,0BAzDMmZ,EAAanL,EAAQhO,KAAK,0BAmFzBoZ,EAAPpL,EAA+BhO,KAAA,0BACbqZ,EAAiB,WAC3BP,EAAA7Y,KAAA,CACHsY,EAAAI,EAAAJ,EAjFGC,EAAGG,EAAYH,EAkFLc,MAAAA,EAAd5Z,MACM6Z,OAAkBC,EAAAA,SAhFrBC,OAkFKF,IAAAA,EAARZ,EAAAe,gBACSd,EAAL3Y,KAAA,CACasY,EAATM,EAAAN,EACYC,EAAGK,EAAAL,EACPG,MAAYjZ,EAAbA,MACCiZ,OAAY3I,EAAbA,SAEP+I,EAAAY,IAAA,CAhFJC,UAAS,aAAA/N,OAAegN,EAAON,EAAtB,QAAA1M,OAA8BgN,EAAOL,EAArC,cAAA3M,OAAmDgN,EAAOnZ,MAAQ,IAAlE,MAAAmM,OAA0EgN,EAAO7I,OAAS,IAA1F,OAoFL2I,EAAAgB,IAAqBhB,CACTkB,UAAS5C,aAAAA,OAArB4B,EAAAN,EAFqBI,EAEA1B,QAAAA,OAArB4B,EAAAL,EAFqBG,EAEA1B,mBAErBoC,EAAcM,IAAA,CACdC,UAAA,aAAA/N,OAAAgN,EAAAN,EAAAM,EAAAnZ,MANA,GACqBiZ,EAKrB,QAAA9M,OAAAgN,EAAAL,EALqBG,EAKrB,oBACCQ,EAALQ,IAAA,CACeC,UAAX,aAAA/N,OAAAgN,EAAAN,EAPqBI,EAOrB,QAAA9M,OAAAgN,EAAAL,EAAAK,EAAA7I,OARA,GACqB2I,EAOrB,oBAEAA,EAAAgB,IAAqBhB,CACTkB,UAAS5C,aAAAA,OAArB4B,EAAAN,EAAAM,EAAAnZ,MAXA,GACqBiZ,EAUA1B,QAAAA,OAArB4B,EAAAL,EAAAK,EAAA7I,OAXA,GACqB2I,EAUA1B,gCA3E3BqC,EAAoB,SAACrO,GA+Ed,IAAAgM,EAALmB,EAAA,GAAA0B,iBAtEJ,OAuEmB7O,EAAA8O,cAAXC,SACYC,EAAZ1B,EAAqBI,EAAAA,cAAgBA,QAAAA,GAAYjZ,QACrCwa,EAAZ1B,EAAqBG,EAAAA,cAArBqB,QAAA,GAAAG,UAEYC,EAAZ7B,EAAqBtB,EAAAA,QACrBoC,EAAcb,EAAAvN,EAAAkP,SA5EflD,EAAMoD,gBAAgBjC,EAAI,GAAGkC,eAAeC,YAoF3ClB,EAAc,SAAAmB,EAAAC,EAAAC,EAAAC,EAAAC,GAElB,OANyBjC,SAAAA,EAAAA,EAArB+B,EAAAC,GACAhC,OAAYuB,KAAZW,MAAqBlC,GAAW6B,GAAhCE,GAAAC,GAAAF,GAAAE,GAIAG,CAAAN,EAAAC,EAAAC,EAAAC,GA5EmBC,EA6EvB,KAGQjC,EAAA,SAAA1B,GACA0B,IAAYuB,EAASjD,EAArByC,gBACYG,EAAetB,EAA3B7Y,MAAAmZ,EAAA7I,OAAA6I,EAAA7I,OAAA6I,EAAAnZ,MAEA2Z,OAAAA,EAAcpC,EAAAsB,EAAAtB,EAAAuB,EAAAK,EAAAN,EAAAM,EAAAL,EAAAoC,GACjB,WACDtC,EAAArB,EAAAsB,EAAAtB,EAAAuB,EAAAK,EAAAN,EAAAM,EAAAnZ,MAAAmZ,EAAAL,EAAAoC,GAjDR,YAvBItC,EAAUrB,EAAMsB,EAAGtB,EAAMuB,EAAGK,EAAON,EAAGM,EAAOL,EAAIK,EAAO7I,OAAQ4K,GA4ElEG,cAEiBpC,EAAW1B,EAACyC,EAAAA,EAAZlB,EAAfK,EAAAN,EAAAM,EAAAnZ,MAAAmZ,EAAAL,EAAAK,EAAA7I,OAAA4K,GACqB/B,eAETgB,EAAZtB,GAAqBM,EAAWA,GACpBuB,EAAZ5B,GAAqBK,EAAWA,GAClB5B,EAAAsB,GAAAM,EAAAN,EAAAM,EAAAnZ,OACjBuX,EAAAuB,GAAAK,EAAAL,EAAAK,EAAA7I,OA1EU,SA6EX,MAGFoI,EAAAzY,GAAD,wBAAqB,SAAAsL,GACZ+P,GAAYtX,cAAduH,EAAcvH,MAAkCgD,GAArBuE,EAAAgQ,MAAzBD,CAvEN,IAAM/D,EAAQqC,EAAkBrO,GAGhC,OAuEAuO,EAAAvC,IAEQsC,IAAAA,SACJ2B,GAAA,EACIxC,EAAA,CACAH,EAAAI,EAAAjZ,MAAA,GAAAuX,EAAAsB,EAAAI,EAAAJ,GAvEIC,EAAIG,EAAY3I,OAAU,GAAKiH,EAAMuB,EAAIG,EAAYH,IAyEzD,MACA,IAAA,WAtEAC,GAAW,EAuEfE,EAAAsB,OAAAtB,EAAAJ,EAAAI,EAAAjZ,MACIiZ,EAAkBuB,OAAlBvB,EAAAH,EAAAG,EAAA3I,OACA2I,EAAAkB,OAAA5C,EAAAsB,EArEAI,EAAYyB,OAASnD,EAAMuB,EAsE/Ba,IACI,MACA,IAAA,YApEAZ,GAAW,EAqEVE,EAALsB,OAAAtB,EAAAJ,EACII,EAAkBuB,OAAlBvB,EAAAH,EAAAG,EAAA3I,OACA2I,EAAAkB,OAAA5C,EAAAsB,EAnEAI,EAAYyB,OAASnD,EAAMuB,EAoE/Ba,IACoB8B,MACJ,IAAA,cACL1C,GAAA,EACKE,EAARsB,OAAAtB,EAAAJ,EAAAI,EAAAjZ,MACHiZ,EAAAuB,OAAAvB,EAAAH,EAlEDG,EAAYkB,OAAS5C,EAAMsB,EAmE3BI,EAAAyB,OAAAnD,EAAAuB,EAtBRa,IA1CQ,MAmEI,IAAA,eACYZ,GAAA,EACHC,EADGuB,OAAAtB,EAAAJ,EAEHG,EAAaF,OAAAA,EAAAA,EAF9BG,EAAAkB,OAAA5C,EAAAsB,EAIeI,EAAYe,OAAZzC,EAAfuB,EACgBK,IACAA,MACJoB,QACSmB,EAAAA,EAAW/C,EAAKgD,GAAAA,EAArC7C,EAAAH,EAAAG,GAAAvB,EAAAsB,EAAAF,EAAAE,EAAAF,EAAA3Y,OAAAuX,EAAAuB,EAAAH,EAAAG,EAAAH,EAAArI,SACqBoL,GAAY7C,EACZ6C,EAAAnB,OAAgBoB,EAArC9C,EAjEQI,EAAYuB,OAASjD,EAAMuB,EAkE/BG,EAA6BkB,OAAA5C,EAAAsB,EAAA,EAC7BI,EAA8BE,OAAOnZ,EAArC8Y,EAAA,EACAa,UAKH,IAAA0B,EAAA,WA/DL,GAAItC,EAAU,CAgENE,IAAYkB,EAAalB,EAAUjZ,gBACvBua,EAAS5B,OAASA,EAATE,EACTsB,EAASxB,OAASA,EAA9BG,EACHG,EAAAkB,OAAAhB,EAAAN,EAAAM,EAAAnZ,MA9DDiZ,EAAYyB,OAASvB,EAAOL,EAAIK,EAAO7I,OA+DnC2I,IAEAA,GAAYyB,EACf3B,GAAA,EA7DLK,EAAcwC,QAgENrE,EAAAA,iBAAkBtX,GAAA,uBAAA,SAAAsL,QAClBvH,IAAU2U,EAAI2C,SAAd,IAAA/P,EAAA+P,SAAA,aAAA/P,EAAAvE,MACHqU,IACSvC,IAAIH,EAAQiB,EAAArO,GAErB,OADGuO,EAAAvC,IA1DJ,IAAK,SA4DamB,EAAJuB,IAAStB,SAAY,QACrB,MACb,IAAA,WA1DGD,EAAIuB,IAAI,SAAU,eA2DJ,MACJtB,IAAA,YAEFwB,IAAZ,cACAzB,EAAqBnB,IAAK,SAA1B,eACc,MACjB,IAAA,eA5ELmB,EAAAuB,IAAA,SAAA,eA+Ee,MAzDP,QA2DOra,EAAM2L,EAAAiD,QAAAiN,QAAA,6BAAA7X,OACjB8U,EAAAuB,IAAA,SAAA,aADJvB,EAAAuB,IAAA,SAAA,IAMQhB,GAAY4C,EAAZ,CACa1M,IAAM3J,EAAe6K,CACpBlB,EAAM3J,EAAAA,EAASN,EAAf2T,EACXC,EAAAvB,EAAAuB,EAAAE,EAAAF,GAEiBtT,EAASN,EAAMmL,gBACtCyL,EAAA3C,EAAAnZ,MAAA,EAvDS2b,EAAUxC,EAAO7I,OAAS,EAwDrBtQ,EAAfua,OAAAmB,EAAA7C,EAAAiD,EACexL,EAAfkK,OAAAkB,EAAA5C,EAAA6C,EACS1C,EAAAkB,OAAAuB,EAAA7C,EAAAiD,EACE7C,EAAAyB,OAAAgB,EAAA5C,EAAA6C,EADF1C,EAAAsB,OAAA5B,EAAAE,IAGQvI,EAAAA,OAAAA,EAAAA,EAAAA,EAAAA,MAHjB2I,EAAAsB,OAAA5B,EAAAE,GAKiBI,EAAAuB,OAAA7B,EAAAG,IAAAG,EAAAyB,OAAA/B,EAAAG,EAAAK,EAAA7I,OAAA2I,EAAAuB,OAAA7B,EAAAG,GAAjBG,EAAAkB,OAAAxB,EAAAE,EAAAF,EAAA3Y,QAMWiZ,EAAAsB,OAAA5B,EAAAE,EAAAF,EAAA3Y,MAAAmZ,EAAAnZ,MACOmP,EAAejK,OAAMmL,EAArBwI,EAA+B3T,EAAM6W,OAErCvW,EAAe6K,OAAUC,EAAAA,EAAAA,EAAAA,SACpC2I,EAAAuB,OAAA7B,EAAAG,EAAAH,EAAArI,OAAA6I,EAAA7I,OACY2I,EAAK9J,OAAM3J,EAASN,EAAMmL,EAAAA,QAL7CsJ,SASAZ,IACoBxB,EAApBsB,EAAAF,EAAAE,IACiBF,EAAKrI,EAAtBqI,EAAAE,GAEqBI,EAAAA,EAAWN,EAACqD,IAvDzBzE,EAAMuB,EAAIH,EAAKG,GAyDNG,EAAWJ,EAACoD,EAAAA,EAAAA,EAAgBhD,QACtC1B,EAAAsB,EAAAF,EAAAE,EAAAF,EAAA3Y,OAENuX,EAAAuB,EAAAH,EAAAG,EAAAH,EAAArI,SAtDOiH,EAAMuB,EAAIH,EAAKG,EAAIH,EAAKrI,QAwDhBiK,EAAU2B,OAAtB3E,EAAAsB,EACY2B,EAAU2B,OAAa5E,EAAnCuB,EACYqB,QAGhBR,EAAAA,UAAc1Z,GAAA,mBAAAob,GAnDlBlM,EAAMiN,OAAS,WAsDDnD,EAAMmD,SACJjN,EAAG8J,aAAYe,IAG3BqC,EAAaC,YAAW,WAAxB,IAAwBC,EAAxBC,UAAA5Y,OAAA,QAAAI,IAAAwY,UAAA,IAAAA,UAAA,GACgCrD,GAAnB5Y,EAAbsb,UAAA,GAAsC5C,EAAtC4C,UACavb,EAAKN,MAAAmP,EAAcsN,SAAhCvX,MAAAmL,UAAAC,OACgBqI,EAACrI,OAASoM,EAAOL,SAAlBnX,MAAAmL,UAAfrQ,QAEe0Y,EAAM2D,MAAAA,EAArB7W,SAAAN,MAAAmL,UAAArQ,MACemR,EAAAA,OAAakL,EAAAA,SAA5BnX,MAAAmL,UAAAC,QAEM5C,EAANmL,GAAAF,EAAA3Y,MAAA,EAZJ2Y,EAAAG,GAAAH,EAAArI,OAAA,EAvCIoI,EAAInY,KAAK,CAsDboc,QAAmB,GAAAxQ,OAAAwM,EAAME,EAAN,KAAA1M,OAAMwM,EAAAG,EAAN,KAAA3M,OAAMwM,EAAA3Y,MAAN,KAAAmM,OAAMwM,EAAArI,QACVhD,MAAYqL,EAAvB3Y,MACWuN,OAAAA,EAAiB+C,SAnD5BgJ,EAAY/Y,KAAK,CAsDfqc,EAANjE,EAAuBE,EACPgE,EAAAA,EAAZ/D,EACMgE,MAANnE,EAAA3Y,MAFJsQ,OAAAqI,EAAArI,SAKMyM,EAAAA,KAAkB,CACRF,aAAc1N,EAAA3J,SAA1BN,MAAAmL,UAAAnL,MAAA6W,IACMe,MAAN3N,EAAA3J,SAAAN,MAAAmL,UAAArQ,MAFJsQ,OAAAnB,EAAA3J,SAAAN,MAAAmL,UAAAC,SAjDO2J,IAAI,CAsDO+C,gBAAa,GAAA7Q,OAAAgD,EAAC3J,SAAaN,MAAAmL,UAAArQ,MAAA,EAAd,OAAAmM,OAAcgD,EAAA3J,SAAAN,MAAAmL,UAAAC,OAAA,EAAd,MAC3B4J,UAAA,cAAA/N,OAAAgD,EAAA3J,SAAAN,MAAAmL,UAAArQ,MAAA,EAAA,SAAAmM,OAAAgD,EAAA3J,SAAAN,MAAAmL,UAAAC,OAAA,EAAA,eAAAnE,OAAA,GAAA8M,EAAA4C,SAAA,UAEI5C,EAAoBzT,YAASyT,EAAfzT,SAAkCyX,QAAJ1M,iBACtC0I,IAAAA,EAAcA,EAApBjZ,MAnDAmc,EAAaxD,EAAKrI,OAoDF4M,EAACL,EAAjB7c,MAA8B2Y,EAAArI,OAChB9K,EAAe6K,EAArB2L,aAA6CxW,EAAe6K,cAC5D4I,EAAY4D,EACTV,EAAAlD,EAAAgD,cAAAhD,EAAA+C,aAAArD,EAAA3Y,MAENkc,EAAAjD,EAAA+C,aAAA/C,EAAAgD,cAAAtD,EAAArI,QAjDLiM,IAAmBtD,EAAYsB,QAAWtB,EAAYuB,QAAWvB,EAAYkB,QAAWlB,EAAYyB,UAmD9FoC,EAANvC,QAAA2B,EAAA,EACcjD,EAAduB,QAAA2B,EAAA,EACGlD,EAAAkB,OAAAlB,EAAAsB,OAAA2B,EACWjD,EAAdyB,OAAAzB,EAAAuB,OAAA2B,GAfRxC,KAnbhBxK,EAAA8I,MAAA,WAsZoB,IAAMkB,EAASF,EAAYe,gBACvBqC,EAAe3D,EAAIyE,QACvBd,EAAaC,WAAW,SACxBD,EAAaC,WAAW,UACxBD,EAAa9b,KAAK,UAAlB,GAAA4L,OAAgCgN,EAAON,EAAvC,KAAA1M,OAA4CgN,EAAOL,EAAnD,KAAA3M,OAAwDgN,EAAOnZ,MAA/D,KAAAmM,OAAwEgN,EAAO7I,SAC/E+L,EAAa/b,KAAK,cAAcmc,SAEhCJ,GADAA,EAAezc,EAAE,SAAS8c,OAAOL,GAAc1K,QACnBW,QAAQ,OAAQ,KAC5CnD,EAAM3J,SAASkT,IAAM2D,EACrBlN,EAAM3J,SAAS2L,WAAakL,EAC5BlN,EAAM3J,SAASyT,YAAcA,EAC7B9J,EAAMzB,cAGVyB,EAAMzB,WAAa,WACfnL,EAAW+K,UAAY,KACvB/K,EAAWgL,eAAiB,MAGhC4B,EAAMyN,eAAiB,WACnB3D,EAAY4D,YAAc,WAC1B1N,EAAM2N,aAAY,IAGtB3N,EAAM4N,gBAAkB,WACpB9D,EAAY4D,YAAc,YAC1B1N,EAAM2N,aAAY,IAGtBva,EAAWuC,OAAO,aAAa,SAACU,GAC5B2J,EAAM3J,SAAWA,EACbA,GACAyT,EAAc9J,EAAM3J,SAASyT,aAAe,IAAIgE,EAChD9N,EAAM8J,YAAcA,EACfA,EAAY4D,cACT1N,EAAM3J,SAASN,MAAMmL,UAAUrQ,MAAQmP,EAAM3J,SAASN,MAAMmL,UAAUC,OACtE2I,EAAY4D,YAAc,YAE1B5D,EAAY4D,YAAc,YAGlC1N,EAAM2N,cACNxO,EAAQ8O,MAAM,SAEd9O,EAAQ8O,MAAM;aClctCze,IAAIqQ,UAAU,kBAAmB,CAC7B,aADAA,OAWI,MACIiB,eACAd,SAEAF,EACI3M,EACA6M,EACAA,GAEAA,MAAMkO,CACA5V,SAAN,IARJ0H,MAAO,GAWKA,SAAM3J,OAASK,aAAfyX,iBACAnO,KAAM3J,SAASK,EAASuW,GA6FhC,IAAAmB,EAAAC,EAAAC,EAAA7P,EAAA8P,EAmDYD,SAASE,IAFjBD,EAAApd,KAAA,4BAAA2Z,IAAA,CAIH+C,gBAAA,gBACJY,aAAA,WAjKL1D,UAAA,2CAAA/N,OAXRgD,EAAA3J,SAAAK,SAAAgT,EAWQ,QAAA1M,OAXRgD,EAAA3J,SAAAK,SAAAiT,EAWQ,2CAAA3M,OAgJ4BgD,EAAM3J,SAASK,SAAS6Q,MAhJpD,0CAAAvK,OAiJ6BgD,EAAM3J,SAASK,SAASuW,OAjJrD,oCAsJQ,SAASyB,EAAiB3d,GACtBsd,EAAStd,EAAI4d,OAAS5d,EAAIma,cAAcC,QAAQ,GAAGwD,MACnDL,EAASvd,EAAI6d,OAAS7d,EAAIma,cAAcC,QAAQ,GAAGyD,MAEnD,IAAMJ,EAAMD,EAAQpd,KAAK,OAAO,GAAGsa,eAEnC,MAAO,CACH/B,GAAI2E,EAASG,EAAIpS,GAAKoS,EAAIK,EAC1BlF,GAAI2E,EAASE,EAAIM,GAAKN,EAAIO,GA/IvB/O,EAAA3J,SAAA,KACGA,EAAAA,KAASK,KAClBsJ,EAAAgP,kBAAA,EARLhP,EAAMkO,OAAS,GAUXe,EAAAA,SAAiB,GAPrBjP,EAAMiN,OAAS,WAU4B,MAA3CjN,EAAoB3J,SAAUqX,SAAVT,OACF7K,EAAAA,SAAa8M,SAAbjC,OAAmC5W,GAElC6L,EAAMwL,SAANhX,SAA0BuW,QAAUvW,GANnDuY,KAGJjP,EAAAmP,YAAA,SAAAzB,GACI,IAAMxL,EAAQE,EAAa8M,gBAAgBlP,EAAM3J,SAAUqX,GAW5ChX,GAAfwL,EAAiCwL,aAAjC1N,EAAA3J,SAAAK,SAAAgX,cAIMrX,EAASK,SAAS6Q,SAAQvH,YAAeuH,EAA/CmG,YACMrX,EAASK,KAASuW,EAAc5K,OAAC+M,EAASnC,aANpDjN,EAAMqP,MAAQ,WAUArP,EAAA3J,SAAAK,SAAiBgT,EAAA1J,EAAAoP,SAAA1F,EACftH,EAAAA,SAAa8M,SAAAA,EAAblP,EAAkCoP,SAAlCzF,EACRuD,EAAY7W,SAAG+L,SAAakN,MAAAA,EAAgBf,SAAQpd,MAC5C6O,EAAGkN,SAAYxW,SAASyK,OAAQnB,EAA5CoP,SAAAjO,OACM9K,EAAS2L,SAAftL,SAA4B0L,MAAaC,EAAOrC,SAAM3J,MAChDA,EAANA,SAAqB6W,SACrBD,OAAAjN,EAAAoP,SAAAnC,OATAgC,KAUAjP,EAAAsJ,MAAA,WAGW/K,IAAAA,EAAX6D,EAAA8M,gBAAAlP,EAAA3J,UAVJ6W,EAAA9K,EAAAkN,gBAAAf,EAAApd,KAAA,OAAAiR,EAAA8M,gBAAAlP,EAAA3J,WAGI6W,EAAeA,EAAa/J,QAAQ,OAAQ,KAU1CoM,EAANlZ,SAAsB2L,WAAmBI,EAAAC,OAAArC,EAAA3J,UAC/BA,EAASmZ,SAAWhZ,IAA1B0W,EAGAlN,EAAaoC,SAAaC,YAAahM,CAJ3CqX,YAAAxL,EAAAuN,WAAA,WAAA,aAOarc,EAAAmL,cAIP5I,EAAO4Z,cAAQhN,SAAQ/L,GACdwJ,EAAA3J,SAAAmZ,WAAAhZ,GAEGrD,EAAK6C,OAASuM,EAA5BmN,UAAA1P,EAAA3J,UAEakY,EAAA/L,KAAAJ,EAAAC,OAAArC,EAAA3J,YATjB2J,EAAMrK,OAAO,2BAA2B,WAa9BU,OAGIA,EAAAA,OAASgN,QAAU,SAAAd,GACrBoN,GAAJpN,EAAIoN,CAFR,IAAA5Z,EAAA5C,EAAA6C,SAAAuM,GAOcxM,IAIViK,EAAA3J,SAAAgN,SAAA,EACHrD,EAAA3J,SAAAuZ,SAAA7Z,GAZDA,EAAMmL,UAAU2O,KAAK7c,MAAK,WAcZgN,EAAd3J,SAAAgN,SAAA,EACAkG,EAAiBuG,YAAYzZ,EAA7BlF,KAAA,wBAAA6O,EAAA3J,SAAAN,MAAAoM,UACeC,EAAAA,gBATnBhP,EAAAuC,OAAA,kBAAA,SAAAU,GAgBA,IAAegY,EAEf,OAAerO,EAAA3J,SAAoB,UACnB8I,EAAZ8O,MAAA,QAIK9O,EAAA8O,MAAsB7B,QACf/M,EAAO0Q,SAyCdrB,SAAsBrY,GACf,OAAHA,EAAiB6U,uBAAyByD,QAAnD,SAAAnY,GACaoY,OAAS7d,EAAIma,cAAcC,QAAWyD,SAAAA,GAAAA,OAAnDoB,EAAA/N,SAAAC,SAAAzN,OAAA,KA3CQqb,CAAwBzZ,GACpBrF,EAAAA,OAAJoR,EAAAsN,UAAArZ,GACA+X,EAAYgB,SAAZhN,EAAA6N,iBAAA7N,EAAA8M,gBAAA7Y,GAAAA,EAAAN,OAEMiK,EAAG0O,SAAgBrY,EAGzBkY,EAAYvO,KAAM3J,EAASK,OAA3BL,OAKJ+X,EAAAA,UAAWtd,GAAA,oBAAA,WACPE,GAAJ,MADWud,EAAA9d,EAAA,4BAAAK,GAAA,wBAAA,SAAAC,IAAA,UAEA4Y,GAFA,GAAA5Y,EAAAqb,OAAA,GAAArb,EAAAmf,QAAAnf,EAAAma,cAAAC,QAAA,KAZoC,SAA3Cpa,EAAIsO,OAAO0Q,aAAa,kBAgBbrZ,EAAAA,iBACAA,GAAe,GAGjC+H,EAAAiQ,EAAA3d,IAdc2Y,GAAK1J,EAAM3J,SAASK,SAASgT,EAiB1BrT,EAAtBsT,GAAgC3J,EAAA3J,SAAAK,SAAAiT,MAEuClV,EAA/D3D,GAAA,uBAAA,SAAAC,GADJ,GAAAqd,EAAA,CAGHrd,EAAAC,iBAHG,IAAAmf,EAVqBzB,EAAiB3d,GAA1B2Y,EAUZyG,EAVYzG,EAAGC,EAUfwG,EAVexG,EAgBF3J,EAAA3J,SAAAK,SAAbgT,EAA6CA,EAAAjL,EAAAiL,EACzCmE,EAAiBxX,SAAAK,SADwBiT,EAAAA,EAAAlL,EAAAkL,EAGhCsF;aCzJjCzf,IAAIqQ,UAAU,cAAe,CACzB,cADAA,SAKIiF,GAEI3B,MAAS,CACFrC,SAAA,IACEqC,SAAE,EAJRnD,MAAA,CAMGjK,MAAA,gBAEEoJ,KAAQsN,SAARzM,EAAAb,GADJa,EAAMrK,OAAO,SAAS,SAACI,GAGf,GADQoJ,EAAAsN,OACR1W,EAAA,CAEO,IAAG+O,EAAYsL,EAAQra,QAAlCA,EAAAwM,MACA8N,EAAkBR,KAAA7c,MAAM,WACRqd,IAAAA,EAAZA,EAAAxf,MACawf,EAAbA,EAAAlP,OACIkP,EAAQxf,MAAQ,MAAhBsQ,EAAqBA,EAAAtQ,EAAA,IACLA,EAAP,KAEZwf,EAAAlP,OAAA,MAEGtQ,EAASA,EAAQsQ,EAAU,IAD3BA,EAAsB,KAEtB,IAAA6D,EAAA7F,EAAA,GAAA8F,WAAA,MACH9F,EAAA,GAAAtO,MAAAA,EAGDsO,EAAQ,GAAGgC,OAASA,EAFJhC,EAAW8F,eAA3BD,EAAAqL,EAAAtL,QACWlU,EAAQA;aC9B3CrB,IAAIqQ,UAAU,cAAe,CACzB,MADAA,SAKIvN,GAEI0N,MAAO,CACGc,SAAA,IACNwP,MAAY,CACZC,KAAc,eACJD,WAAA,yBACFC,aAAA,2BAPTC,SAAA,uBASK/N,OAAA,sBAcEgO,SAAOzQ,ouBAWLA,KAAM0Q,SAAN1Q,GACHA,EAAAyQ,KAAAzQ,EAAAyQ,MAAA,EACGzQ,IAAMwQ,EAAU,WACVG,EAASpgB,MAAKyP,sBAAyBtB,EAAM4R,WAAnDtQ,EAAAuQ,aAAAvQ,EAAAyQ,KAAAzQ,EAAAwQ,UAVJxQ,EAAM0Q,MAAQ,GAWJ,IAAQ3W,EAAVV,KAAwBsX,IAAAA,EAA5B3Q,EAAuCyQ,KAAA,GACzB1W,EAAU4W,KAApBC,IAAAC,EAAA,EAAA7Q,EAAA8Q,UACHC,GAAA/Q,EAAA8Q,SAAA,IACJD,EAAAxX,KAAAuL,IAAA,EAAAmM,EAAA,IARD,IAAK,IAAIjb,EAAI+a,EAAW/a,GAAKib,EAASjb,IAW7BkK,EAAQ0Q,MAAAjf,KAAMqE,GAA3B,GAAAkK,EAAAwQ,SAAA,CAIa,IAAAG,EAAclgB,EAAAuP,EAAMwQ,UAAA/R,SAAAC,IAAA,GACZrF,EAAK2X,QAAKhR,YAAA2Q,GAChBlgB,EAAA,QAAAsJ,UAAA4W,KAKXM,EAAWtb,OAAA,QAAA,WAFfsb,OAMQjR,EAAArK,OAAcqK,cAAgB,WAClCA,EAAA8Q,SAAAzX,KAAA2X,KAAAhR,EAAAsQ,WAAAtQ,EAAAuQ,cACWU,OAGTC,EAANC,SAAiB,SAAAC,GACHX,EAAQA,KAAGW,EACrBH,KAGPjR,EAAAqR,SAAA,WArELrR,EAAAyQ,MAAAzQ,EAAA8Q,WALR9Q,EAAAyQ,MAAA,EAkEoBQ,MAGJjR,EAAMkR,SAAW,WACK,GAAdlR,EAAMyQ,OACVzQ,EAAMyQ,MAAQ,EACdQ;aCxEpBzhB,IAAIqQ,UAAU,cAAe,CACzB,SADAA,aAOI,SACIiB,EACAd,GAGI,MAAI7P,CACAiD,SAAW6G,IACLqX,MAAAA,GAANvR,KAAA,WAGA3M,GAAW+G,EAAOmX,IAAAA,OAASC,IAAO,CAC9BC,EADsCvX,OAAAwX,OAAAthB,EAAAkC,IAAA4H,OAAAM,KAE/B,IAAA+W,EAAAle,EAAA6G,OAAAqX,SAAA,CACGpd,OAAA/D,EAAAuhB,WAEFC,EAAYxX,KAAAmX,EAAAC,OAAA,OAAA,CACZK,gBAAe,EACLnN,MAJR,CAKFoN,KAAiB,CACNC,MAAA,UADMH,WAAA,0CANlBC,cAAA,cAUMG,SAAA,OAAAC,gBAAA,CAEMF,MAAA,YAdvBG,QAAA,CAkBsBH,MAAA,UACzBI,UAAA,cADG9e,EAAW+G,KAAKgY,MAAM;aCnC1C3iB,IAAIqQ,UAAU,mBAAoB,CAC9B,MADAA,SAKI0J,GAEIvJ,MAAO,CACEc,SAAA,IACLsR,MAAa,CAJd7I,IAAA,oBAMG6I,YAAA,gCAANrS,KAAM,SAAUC,EAAOb,GAITiT,EACOC,SAAA,sBACI5hB,KAAEuP,EAAMrN,KACf2f,EAAW/I,aAIboG,EAAY2C,KAAAA,qBAAhBC,MAAA,WANJ,IAAA5f,EAAAlC,EAAAiN,MAAA/K,KAAA,UAQH2f,EAAA/I,EAAA,SACJnY,KAAAuB,EAAA6f,KApBLphB,KAAA,sBAAA,kBALRqhB,SAAA/U,MAsBwB6L,EAAIoG,YAAY2C,EAAUtS,EAAMoS;aCtBxD5iB,IAAIwE,OAAO,WAAY,CACnB,aADAA,SAKIZ,GACkF,OAAIa,SAAAsD,GAAiD,IAAnItD,EAAAb,EAAAW,YAAAX,EAAAW,YAAA5C,MAAA,SAAA8C,GAAA,OAAAA,EAAAsB,IAAAgC,EAAAlD,WAAAqe,gBAAA,KACUC,EAASC,EAAKC,KAAxBA,SACA,GAAe,OAAXF,EAAM,MAAV,GAEC,GAAA1e,GAAA,MAAAA,EAAAI,WAAAC,aAAA,CAEG,OAAQ+E,KAAKC,MAAMqZ,IADV,KAAI1e,EACL,MAAA,wBACJ,KAAA,EACW,MAAA,cACX,OAAAoF,KAAAC,MAAAqZ,GAAA,cAMR,OATIA,GAAA,SASItZ,KAAKC,MAAMqZ,IAHRtZ,KAAKC,EACf,MAAA,sBAKG,KAAK,EAJM,MAAG,YACVD,OAAKC,KAAMqZ,MAAnBA,GAAA;aCrBZnjB,IAAIwE,OAAO,QAAS,CAChB,WAEI,OAAO,SAAAoB,GACIiE,OAAK1I,KAAMyE,MAAlBA;aCJZ5F,IAAIwE,OAAO,QAAS,CAChB,OADAA,SAOI,SACOb,EAAOhD,GACA,IAAA2iB,EAAA,CAFUC,IAAA,IAGVC,IAAA,IAHUC,IAAA,IAIVC,IAAA,IAJUC,IAAA,IAKVC,IAAA,IALUC,IAAA,IAMVC,IAAA,IANUC,IAAA,IAOVC,IAAA,KAPUC,IAAA,IAQVC,IAAA,IARUC,IAAA,IASVC,IAAA,IACLC,IAVe,IAUTC,IAAA,MAER,OAZiB,SAAAnB,GAYVA,MAAAA,IAZUA,EAAA,GAcV,IAAAoB,EAAA5gB,EAAA6F,cAdUgb,EAAA,IAeV7jB,EAAA+D,OAAA8f,eACEA,EAAA7jB,EAAA+D,OAAA8f,eAYDlB,EAAgBiB,KA5B/BC,EAAAlB,EAAAiB,IAqBc,IAAN3Z,EAAA4Z,EAAA,KAAA3a,KAAAC,MAAA,IAAAqZ,GAAA,KAAAsB,QAAA,GAIAD,OAHH7jB,EAAA+D,OAAAggB,qBAYG9Z,GAAU,IAAMjH,EAAK6F,eATrBgb;aChChBxkB,IAAIwE,OAAO,WAAW,WAClB,OAAO,SAASmgB,GADhBngB,OAAOqF,KAAXC,MAAiC,IAAX6a,GAAW;aCAjC3kB,IAAIwE,OAAO,WAAW,WAClB,OAAO,SAAUogB,GADjBpgB,OAAOogB,EAAXC,QAAsBC;aCAtB9kB,IAAIwE,OAAO,cAAe,CACtB,OADAA,SAAOV,GAGH,OAAO,SAAAkP,GACIlP,OAAKmH,EAAAA,YAAZ+H,OASAhT,IAAAwE,OAAOV,OAAKmH,CADhB,OAHR,SAAAnH,GAGQ,OAAO,SAASkP,GACZ,OAAOlP,EAAKmH,YAAY+H;svDCbpChT,IAAI+kB,QAAQ,UAAW,CACnB,YACA,SACIC,GAEA,OAAA,SAAAC,GAAA,SAAAC,IAAA,OAAAC,gBAAAjX,KAAAgX,GAAAE,2BAAAlX,KAAAmX,gBAAAH,GAAA5L,MAAApL,KAAA2P,YAAA,OAAAyH,UAAAJ,EAAAD,GAAAM,aAAAL,EAAA,KAAA,CAAA,CAAAna,IAAA,SAAAnF,MAAA,SACkByC,GACV,MAAe,aAARA,GAA+B,WAARA,IAFtC,CAAA0C,IAAA,iBAAAnF,MAAA,SAK0BG,EAAIsC,EAAMxD,EAAY2gB,EAAepd,EAAUgb,GACjE,OAAAqC,KAAAJ,gBAAAH,GAAA,iBAAAhX,MAAAwX,KAAAxX,KAA4BnI,EAAIsC,EAAMxD,EAAY2gB,EAAepd,EAAUgb,OANnF8B,EAAA,CAA6BF;mZCLrChlB,IAAI+kB,QAAQ,MAAO,CACf,aACA,KACA,QACA,SACA,MACA,YACA,SAPAA,EAeI3kB,EAAOulB,EAAAhlB,EACHmC,EAAc8iB,GACV,OAAIjlB,IAAAA,WACA,SAAAklB,IAAcV,gBAAAjX,KAAA2X,GAC+B,cAAtCllB,EAAAkC,IAAWG,YAAY8iB,YAC9B5X,KAAc6X,OAAA,+BACX,oBAAIplB,EAAWqC,IAAAA,YAAY8iB,YAC9B5X,KAAc6X,OAAA,gCAC+B,WAAtCplB,EAAWqC,IAAAA,YAAY8iB,YAC9B5X,KAAc6X,OAAA,sCACX,iBAAAplB,EAAAkC,IAAAG,YAAA8iB,YACH5X,KAAcvN,OAAWqC,uCAAzBkL,KAAK6X,OAASplB,EAAOkC,IAAIG,YAAYtC,IAGrC0F,KAAQ2f,QAAWplB,WAC1BmC,EAAAsD,QAAA,UAAAzF,EAAAkC,IAAAG,YAAA8iB,YAAA5X,KAAA6X,QAbOplB,OAAAA,aAAAA,EAAAA,CAAAA,CAAAA,IAAAA,UAAAA,MAAAA,SAFLqlB,EAAAtlB,EAAAyC,GAAA,IAAA8iB,EAAA/X,KAAA,OAAA9N,GAAA,SAAA8lB,EAAAC,GAiBwBrjB,EAAAsD,QAAA,cAAA4f,EAAAC,EAAAF,OAAArlB,EAAAyC,GAGnBwiB,EAAM,CAFAK,OAACE,EACKxlB,IAAAulB,EAAAF,OAAZrlB,EACMyC,KAAAA,EACM6iB,QADN,CAEQD,cAFR,UAAAplB,EAAAkC,IAAAG,YAAAojB,YAIO5iB,MAAA,SAAAC,GACL4iB,GAAa5iB,EAAEN,MAAYxC,EAAWqC,KAAAA,MAG7BG,OAJJL,EAAAsD,QAAA,YAAA4f,EAAAC,EAAAF,OAAArlB,EAAAyC,EAAAM,QAGJA,EAAAA,EAAaN,KAAApB,OAGP0B,EAAAA,QAAc1B,eAArBikB,EAAAC,EAAAF,OAAArlB,EAAAyC,EAAAM,GACAyiB,EAAAziB,EAAAN,SACH,SAAAM,GAIDX,EAAIsD,QAAQ,cAAe4f,EAAQC,EAAKF,OAASrlB,EAAKyC,EAAMM,GAHhDA,EAAAN,MAAgB6iB,EAAaD,KAAAA,MACzBI,EAAhB1iB,EAAAN,KAAApB,OAEYokB,EAAA1iB,WAlChB9C,CAAAA,IAAAA,MAAAA,MAAAA,SAuCKD,EAAA4lB,GAzCV,OAoBKA,IAFJ5lB,GAAA,IAAAO,EAAAslB,MAAAD,IAlBDpY,KAAAsY,QAAA,MAAA9lB,KAEKC,CAAAA,IAAAA,OAAAA,MAAAA,SA6CA2lB,EAAJnjB,GACO,OAAUlC,KAAEslB,QAAMD,OAArB5lB,EAAAyC,KA9CAxC,CAAAA,IAAAA,MAAAA,MAAAA,SAgDGD,EAAK8lB,GACf,OAAAtY,KAAAsY,QAAA,MAAA9lB,EAAAyC,KAjDOxC,CAAAA,IAAAA,QAAAA,MAAAA,SAFLD,EAAAyC,GAsDQ,OAAKqjB,KAAQA,QAAQ9lB,QAArBA,EAAPyC,KApDIxC,CAAAA,IAAAA,QAAAA,MAAAA,SAFL+B,GAAAA,EAAAA,EAyDChC,QAzDD,SAyDY,QACJ,IAAK8lB,EAAQzmB,OAAOW,SAApBe,KA1DRglB,EA2DF,IAAAC,OAAA,OAAAhkB,EAAA,qBA3DEikB,KAAAjmB,GAAA,OAAA+lB,EA+DFA,EAAA,GA/DEG,mBAiESH,EAAA,GAAA9S,QAAA,MAAA,MAjET,GAAA,OAEKhT,CAAAA,IAAAA,gBAAAA,MAAAA,WA+EJ,OAZM8lB,EAAOrgB,QAASugB,mBAYfzY,KAAK5J,IAAI,kCAAoC3D,EAAO6T,YAAa,MAAjE,OAA6E,SAAAzS,GAXpF,IAAca,EAAA,6DAEbgjB,EAAAiB,OAAAjkB,EAAAb,GACW6B,EAAKkjB,WAAAlkB,SAvEbjC,EAAAA;mZCjBpBX,IAAI+kB,QAAQ,QAAS,CACjB,KACA,QACA,SACA,MACA,QACA,SACI3kB,EAPJ2kB,EAaIpkB,EAAOmC,EAAAiJ,GACW,OAAA,IAAA,WAAd,SAAAgb,IAAc5B,gBAAAjX,KAAA6Y,GACgC,cAAtCpmB,EAAWqC,IAAAA,YAAY8iB,YACvB5X,KAAc6X,OAAA,+BAC+B,oBAAtCplB,EAAWqC,IAAAA,YAAY8iB,YAC9B5X,KAAc6X,OAAA,gCACX,WAAIplB,EAAWqC,IAAAA,YAAY8iB,YAC9B5X,KAAc6X,OAAA,sCAC+B,iBAAtCplB,EAAWqC,IAAAA,YAAY8iB,YAC9B5X,KAAc6X,OAAA,uCAEd7X,KAAcvN,OAAWqC,EAAAA,IAAYtC,YAArCA,IAEJwN,KAAK6X,QAAU,UAAVA,EAALhlB,MAAe,YAAfJ,EAAAkC,IAAAG,YAAA8iB,YAAA5X,KAAA6X,QAGIha,EAAM0I,YAAAA,KAAAA,KAAY,wBAAA,CACRtR,KAAA,CACAkF,KAAA,cACIxD,WADJ,CAEU0P,SAAA5T,EAAA6T,gBAFVhR,MAAA,eAFJiR,OAUG,SAAC1S,GACIA,EAAVhB,MAAAgB,GACM0S,EAAaA,WAAnB,QA3BE,OAAA8Q,aAAAwB,EAAA,CAAA,CAAAhc,IAAA,UAAAnF,MAAA,SADXogB,EAAAtlB,EAAAyC,GAAA,IAAA8iB,EAAA/X,KAAA,OAAA9N,GAAA,SAAA8lB,EAAAC,GAAA,IAiCwBa,EAAA,CAIfX,cAAe,WAJX3lB,EAAKyC,YAAMxC,EAAAkC,IAAAG,YAAAojB,WAEb3R,EAAU1T,MAAGgL,gBAAoBpL,EAAOkC,EAAIG,OAAXtC,EAAuB0lB,GACxDY,EAAU,CACZX,OAAeL,EADnBtlB,IAAAulB,EAAAF,OAAArlB,EAGUyC,KAAAA,EACJ6jB,QAAAA,IACMhB,MADN,SAAAviB,GAEQsiB,GAAAA,EAFR5iB,MAAAM,EAAAN,KAAApB,MAKG0B,OALHX,EAAA/B,MAAA,cAAAilB,EAAAC,EAAAF,OAAArlB,EAAAyC,EAAAM,QAIOujB,EAAAA,EAAAA,KAAAA,OAGKlkB,EAAA/B,MAAA,iBAA2BilB,EAAJC,EAAjCF,OAA0DtiB,EAAAA,EAA1DA,GACOA,EAASN,EAAhBA,SACA,SAAAM,GACHX,EAAA/B,MAAA,gBAAAilB,EAAAC,EAAAF,OAAArlB,EAAAyC,EAAAM,GAKGA,EAASN,MAAQM,EAASN,KAAKpB,MAJzBokB,EAAA1iB,EAAkBuiB,KAAQjkB,OAEpC0B,EAAaA,WApDX,CAAAsH,IAAA,MAAAnF,MAAA,SAyDEugB,EAAO1iB,GAItB,OAHY6iB,IAnBL5lB,GAAA,IAAAO,EAAAslB,MAAAD,IAsBPpY,KAAAsY,QAAA,MAAA9lB,KA7Da,CAAAqK,IAAA,OAAAnF,MAAA,SADXlF,EAAAyC,GAiEKmjB,OAAJpY,KAAgBsY,QAAA,OAAA9lB,EAAAyC,OAhEN4jB,EAAA;ooBCd1B/mB,IAAI+kB,QAAQ,YAAa,CACrB,MACA,SACIjiB,GA2FyC,OApFsBmkB,WAAetT,SAAAA,IAA1EwR,gBAAAjX,KAAA8W,GADJ9W,KAAA7F,KAAA6F,KAAAgZ,YAAA7e,KAWQ6F,KAAKrJ,WAAa,GAPVqJ,KAAGsX,cAAb2B,GACUxT,KAAAA,KAAQ,GAA+BzF,KAAQ+Y,SAAF,GAJEA,OAAAA,aAAAA,EAAAA,CAAAA,CAAAA,IAAAA,cAAAA,MAAAA,SA4FvC7e,EAAS5D,GAAO,IAAAyhB,EAAA/X,KACxB,KAAAA,KAAOyG,UAAavM,KAAQod,cAAMyB,IAAuBzB,KAAAA,cAAc4B,GAAmBzlB,MAAKuM,KAAAmZ,cAAOD,GAAAjkB,KAAA4C,IAAA,OAAIshB,KADvG,IAEAlkB,EAAA+K,KAAC/K,SAASxB,MAAA,SAAAyG,GACb,OAAOuM,EAAM2S,IAAAA,EAAenkB,cAAckF,GAAWxD,KAA9CkB,IAA+Dyf,EAAAA,OAA/Dpd,EAAmFA,KAAAA,kBAH9F,OAAAjF,EAJJwR,EAAA2S,eAAAnkB,EAAA4C,GAAA5C,EAAAkF,KAAAlF,EAAA0B,WAAA1B,EAAAqiB,cAAAtX,KAAA9F,SAAAjF,EAAAigB,MAJiC,OApFsB6D,CAAAA,IAAAA,iBAAAA,MAAAA,SAwFbzB,EAAA7Q,GAAA,IAAA4S,EAAArZ,KAAAsZ,MAAAC,QAAAjC,KAElCA,EAAA,CAAAA,IAFkC,IAAAtgB,GAAA,EAAAC,GAAA,EAAAC,OAAAC,EAAA,IAAA,IAAA,IAAAC,EAAAgD,EAAA,WAAA,IAAA8e,EAAA9hB,EAAAM,MAAA,OAAA2hB,EAAAnf,UAAAmf,EAAA/B,eAAA+B,EAAA/B,cAAA4B,IAAAG,EAAA/B,cAAA4B,GAAAjkB,MAAAokB,EAAA/B,cAAA4B,GAAAjkB,KAAA8B,OAJT,CAAAyiB,EAAAH,EAAAnf,SAAA5D,QAAA,SAAA4D,GAAA,OAAAuM,EAAAgT,OAAAvf,EAAAC,KAAA4e,gBAAAM,EAAA/B,cAAA4B,GAAAjkB,KAAAxB,MAAA,SAAA0lB,GAAA,OAAAA,EAAAthB,IAAAqC,EAAArC,IAAA4O,EAAAgT,OAAAN,EAAAhf,KAAA4e,qBAAAxP,KAAA,SAAAtU,GAAA,OAAAwR,EAAA2S,eAAAnkB,EAAA4C,GAAA5C,EAAAkF,KAAAlF,EAAA0B,WAAA1B,EAAAqiB,cAAA+B,EAAAnf,SAAAjF,EAAAigB,UAIS,YAAA7d,EAAAigB,EAAAhgB,OAAAC,cAAAP,GAAAI,EAAAC,EAAAG,QAAAC,MAAAT,GAAA,EAAA,CAAA,IAAA0iB,EAAAtf,IAAA,OAAAsf,GAAA,IAAA,WAAA,SAAA,QAAA,GAAA,WAAAC,QAAAD,GAAA,OAAAA,EAAAF,IAAA,MAAA7hB,GAAAV,GAAA,EAAAC,EAAAS,EAAA,QAAA,IAAAX,GAAA,MAAAK,EAAA,QAAAA,EAAA,SAAA,QAAA,GAAAJ,EAAA,MAAAC,GAJT,MAAA,MApFsB6hB,CAAAA,CAAAA,IAAAA,cAAAA,MAAAA,SAgBxCa,EAAWC,GATnB,IAAApT,EAAA,IAAAzG,KAEP,OAFOyG,EAAA5O,GAAA+hB,EAAA/hB,GAAA4O,EAAA9P,WAAAijB,EAAAjjB,WACX8P,EAAA6Q,cAAcsC,EAAAtC,cAAA7Q,EAAAyO,KAAA2E,EAAA3E,KAcVzO,EAAMvM,SAAW2f,EAAa3f,SAbb8e,IATsCD,CAAAA,IAAAA,WAAAA,MAAAA,SA0C3CxjB,GAoCPN,IAAMM,EAEV,OADUX,EAAP/B,MAAA,0CAAA0C,GACH,KACMkR,GAAK6S,MAACF,QAAAA,EAANnkB,MAAmCkF,CAC7C,IAAA5E,EAAAN,KAAA8B,OA3EU,OAAA,KAAA,IAAA2F,EAAA,GA0EmCvC,GAAAA,EAAAA,GAAAA,EAAAA,OAAAA,EAAAA,IAGT,IAAA,IAAAoH,EAAAC,EAAAjM,EAAAN,KAAAqC,OAAAC,cAAA6J,GAAAG,EAAAC,EAAAhK,QAAAC,MAAA2J,GAAA,EAAA,CAAA,IAAAnM,EAAAsM,EAAA7J,MA/BzBgF,EAAO3I,KAAKiM,KAAKoZ,eAAenkB,EAAK4C,GAAI5C,EAAKkF,KAAMlF,EAAK0B,WAAY1B,EAAKqiB,cAAe/hB,EAAS2E,SAAUjF,EAAKigB,QA4B/E/a,MAAAA,GAAAA,GAAAA,EAAAA,EAAAA,EAAAA,QAAAA,IAAAA,GAAAA,MAAAA,EAAAA,QAAAA,EAAAA,SAAAA,QAAAA,GAAAA,EAAAA,MAAAA,GAKtCmd,OAAiBA,EA7BrB,OAAOtX,KAAKoZ,eAAe7jB,EAASN,KAAK4C,GAAItC,EAASN,KAAKkF,KAAM5E,EAASN,KAAK0B,WAAYpB,EAASN,KAAKqiB,cAAe/hB,EAAS2E,SAAU3E,EAASN,KAAKigB,QAzDlG6D,CAAAA,IAAAA,iBAAAA,MAAAA,SAoFtBlhB,EAAAsC,EAAAxD,EAAA2gB,EAAApd,EAAAgb,GAvBjC,IAAM4E,EAAW,IAAI9Z,KA8BhB,OAP4B8Z,EAAAjiB,GAAAA,EAAAiiB,EAAA3f,KAAAA,EAItB+e,EAAAA,WAJsBviB,EAnBjCmjB,EAASxC,cAAgBA,EAwBjBwC,EAAM5f,SAAYA,EAClB4f,EAAA5E,KAAAA,EACH4E,IA3FkDf,CAAAA,IAAAA,YAAAA,IAAAA,WAalD7e,OAlBQ1F,EAkBbwL,KAAA7F,MAjBQ4f,OAAO,GAAGhB,cAAgBvkB,EAAKmiB,MAAM,GADjC,IAACniB,IAK0CukB,CAAAA,IAAAA,YAAAA,IAAAA,WAOhD,OAAA/Y,KAAA7F,KAjBvBsL,QAAyB,qBAInB,SAAAuG,EAAAC,GAAA,MAAA,IAAAA,EAAA8M,iBAAAtT,QAAA,KAAA,MAMiEsT,CAAAA,IAAAA,WAAAA,IAAAA,WAwElD,OAAkB/Y,KAAKsX,KApEpB7R,QAAQ,qBAAqB,SAACuG,EAAGC,GAAJ,MAAU,IAAMA,EAAE8M,iBAAetT,QAAQ,KAAM,MAJ7BsT,CAAAA,IAAAA,YAAAA,IAAAA,WA2E7C,OAAG/Y,KAAK9F,aA3EqC6e,EAAAA;svDCVvEjnB,IAAI+kB,QAAQ,QAAS,CACjB,YACA,SACIC,GAEA,OAAA,SAAAC,GAAA,SAAAiD,IAAA,OAAA/C,gBAAAjX,KAAAga,GAAA9C,2BAAAlX,KAAAmX,gBAAA6C,GAAA5O,MAAApL,KAAA2P,YAAA,OAAAyH,UAAA4C,EAAAjD,GAAAM,aAAA2C,EAAA,KAAA,CAAA,CAAAnd,IAAA,SAAAnF,MAAA,SACkByC,GACV,MAAe,UAARA,GAA4B,SAARA,IAFnC,CAAA0C,IAAA,iBAAAnF,MAAA,SAK0BG,EAAIsC,EAAMxD,EAAY2gB,EAAepd,EAAUgb,GAEjE,OADWqC,KAAAJ,gBAAA6C,GAAA,iBAAAha,MAAAwX,KAAAxX,KAAwBnI,EAAIsC,EAAMxD,EAAY2gB,EAAepd,EAAUgb,OAN1F8E,EAAA,CAA2BlD;svDCLnChlB,IAAI+kB,QAAQ,WAAY,CACpB,YACA,UACA,QACA,SACIC,EACAmD,EACAD,GAEA,OAAA,SAAAjD,GAAA,SAAAmD,IAAA,OAAAjD,gBAAAjX,KAAAka,GAAAhD,2BAAAlX,KAAAmX,gBAAA+C,GAAA9O,MAAApL,KAAA2P,YAAA,OAAAyH,UAAA8C,EAAAnD,GAAAM,aAAA6C,EAAA,CAAA,CAAArd,IAAA,aAAAnF,MAAA,WAcQ,OAAOsI,KAAKlH,QAAUkH,KAAKlH,QAAQqhB,aAAe,cAAgBna,KAAKnI,MAd/E,CAAA,CAAAgF,IAAA,SAAAnF,MAAA,SACkByC,GACV,MAAe,cAARA,GAAgC,YAARA,IAFvC,CAAA0C,IAAA,iBAAAnF,MAAA,SAK0BG,EAAIsC,EAAMxD,EAAY2gB,EAAepd,EAAUgb,GACjE,IAAMvc,EAAQ4e,KAAAJ,gBAAA+C,GAAA,iBAAAla,MAAAwX,KAAAxX,KAAwBnI,EAAIsC,EAAMxD,EAAY2gB,EAAepd,EAAUgb,GAIrF,OAHAvc,EAASG,QAAUH,EAASyhB,YAAY,UAAWH,GACnDthB,EAAS0hB,eAAiB1hB,EAASyhB,YAAY,iBAAkBJ,GACjErhB,EAAShC,WAAW4E,MAAQ+e,WAAW3hB,EAAShC,WAAW4E,OACpD5C,MAVfuhB,EAAA,CAA8BpD;85CCTtChlB,IAAI+kB,QAAQ,WAAY,CACpB,YACA,QACA,SACIC,EACAyD,GAEA,OAAA,SAAAxD,GAAA,SAAAyD,IAAA,OAAAvD,gBAAAjX,KAAAwa,GAAAtD,2BAAAlX,KAAAmX,gBAAAqD,GAAApP,MAAApL,KAAA2P,YAAA,OAAAyH,UAAAoD,EAAAzD,GAAAM,aAAAmD,EAAA,CAAA,CAAA3d,IAAA,SAAAzG,IAAA,WASQ,OAHK4J,KAAKya,UACNza,KAAKya,QAAUza,KAAK0a,eAAe,SAAUH,IAE1Cva,KAAKya,WATpB,CAAA,CAAA5d,IAAA,SAAAnF,MAAA,SACkByC,GACV,MAAe,YAARA,MAFfqgB,EAAA,CAA8B1D;svDCPtChlB,IAAI+kB,QAAQ,QAAS,CACjB,YACA,UACA,WACA,QACA,SACIC,EACAE,EACAkD,EACAK,GAEA,OAAA,SAAAxD,GAAA,SAAA4D,IAAA,OAAA1D,gBAAAjX,KAAA2a,GAAAzD,2BAAAlX,KAAAmX,gBAAAwD,GAAAvP,MAAApL,KAAA2P,YAAA,OAAAyH,UAAAuD,EAAA5D,GAAAM,aAAAsD,EAAA,KAAA,CAAA,CAAA9d,IAAA,SAAAnF,MAAA,SACkByC,GACV,MAAe,UAARA,GAA4B,SAARA,IAFnC,CAAA0C,IAAA,iBAAAnF,MAAA,SAK0BG,EAAIsC,EAAMxD,EAAY2gB,EAAepd,EAAUgb,GACjE,IAAMxb,EAAK6d,KAAAJ,gBAAAwD,GAAA,iBAAA3a,MAAAwX,KAAAxX,KAAwBnI,EAAIsC,EAAMxD,EAAY2gB,EAAepd,EAAUgb,GAN1F,OAOQxb,EAAMG,MAAQH,EAAM0gB,YAAY,QAASG,GACzC7gB,EAAMkhB,QAAUlhB,EAAM0gB,YAAY,UAAWpD,GAC7Ctd,EAAMO,UAAYP,EAAMghB,eAAe,YAAaR,GACpDxgB,EAAM/C,WAAW4E,MAAQ+e,WAAW5gB,EAAM/C,WAAW4E,OACrD7B,EAAM/C,WAAWkkB,iBAAmBP,WAAW5gB,EAAM/C,WAAWkkB,kBAChEnhB,EAAM/C,WAAWmkB,QAAUR,WAAW5gB,EAAM/C,WAAWmkB,SAvB3DphB,EACR/C,WADiBokB,gBAGjBT,WACA5gB,EACA/C,WACImgB,iBAKApd,MAAAihB,EAAA,CAA2B7D;85CCXnChlB,IAAI+kB,QAAQ,QAAS,CACjB,YACA,SACIC,GAEA,OAAA,SAAAC,GAAA,SAAAiE,IAAA,OAAA/D,gBAAAjX,KAAAgb,GAAA9D,2BAAAlX,KAAAmX,gBAAA6D,GAAA5P,MAAApL,KAAA2P,YAAA,OAAAyH,UAAA4D,EAAAjE,GAAAM,aAAA2D,EAAA,KAAA,CAAA,CAAAne,IAAA,SAAAnF,MAAA,SACkByC,GACV,MAAe,UAARA,GAA4B,SAARA,MAFnC6gB,EAAA,CAA2BlE;6xDCLnChlB,IAAI+kB,QAAQ,eAAgB,CACxB,KACA,QACA,MACA,UACA,YACA,MACA,SACI3kB,EACAulB,EACA9iB,EACAslB,EACAnD,EACAliB,GAEA,OAAA,SAAAmiB,GAAA,SAAAjZ,IAAA,OAAAmZ,gBAAAjX,KAAAlC,GAAAoZ,2BAAAlX,KAAAmX,gBAAArZ,GAAAsN,MAAApL,KAAA2P,YAAA,IAAAsL,EAAA,OAAA7D,UAAAtZ,EAAAiZ,GAAAM,aAAAvZ,EAAA,CAAA,CAAAjB,IAAA,WAAAzG,IAAA,WAAA,OAEmB4J,KAAIkb,YAClBlb,KAAAkb,UAAAlb,KAAA0a,eAAA,WAAAT,IAHLja,KAAAkb,aAAA,CAAA,CAAAre,IAAA,SAAAnF,MAAA,SACkByC,GACV,MAAe,kBAARA,GAAoC,gBAARA,IAF3C,CAAA0C,IAAA,WAAAnF,OAAAujB,EAAAE,kBAAAC,mBAAAC,MAAA,SAAAC,EAK0BC,GAL1B,IAAAjd,EAAAkd,EAAAjmB,EAAAkJ,EAAAgd,EAAA9L,UAAA,OAAAyL,mBAAAM,MAAA,SAAAC,GAAA,OAAA,OAAAA,EAAAC,KAAAD,EAAAnkB,MAAA,KAAA,EAAA,OAK0C8G,EAL1Cmd,EAAA1kB,OAAA,QAAAI,IAAAskB,EAAA,GAAAA,EAAA,GAKwD,KAC1CD,EAAiB,CACnBK,QAAS,mBAPrBvd,GAAAA,EAAAvH,UAAAuH,EAAAA,EAAAiL,KAAA,SAAAuS,GAAA,OAAAA,EAAAtnB,SAAAT,KAAA,QAAAynB,EAAA,gBAAAld,EAAArC,KAAA,MAAA0f,EAAAnkB,KAAA,EAAA7C,EAAAyB,IAAA,8BAAAkJ,OAAAic,GAoBYC,GApBZ,KAAA,EAAA,GAAAjmB,EAAAomB,EAAAI,KAAAtd,EAgCmBX,EAAAke,SAAAzmB,GAhCnB,CAAAomB,EAAAnkB,KAAA,GAAA,MAAA,OAkCiB0jB,EAAAA,MAAY,iCAAgCjB,GAlC7D0B,EAAAM,OAAA,UAAA,KAAA,GAAA,OAAAN,EAAAM,OAAA,SAqCKxd,GArCL,KAAA,GAAA,IAAA,MAAA,OAAAkd,EAAAO,UAAAZ,OAAA,SAAAa,GAAA,OAAAlB,EAAA7P,MAAApL,KAAA2P,gBAAA7R,EAAA,CAAkCgZ;85CCf1ChlB,IAAI+kB,QAAQ,eAAgB,CACxB,YACA,SACIC,GAEA,OAAA,SAAAC,GAAA,SAAAqF,IAAA,OAAAnF,gBAAAjX,KAAAoc,GAAAlF,2BAAAlX,KAAAmX,gBAAAiF,GAAAhR,MAAApL,KAAA2P,YAAA,OAAAyH,UAAAgF,EAAArF,GAAAM,aAAA+E,EAAA,CAAA,CAAAvf,IAAA,WAAAzG,IAAA,WAMQ,OAAO4J,KAAKrJ,WAAW0lB,WAAa,MAN5C,CAAA,CAAAxf,IAAA,SAAAnF,MAAA,SACkByC,GACV,MAAe,kBAARA,GAAoC,gBAARA,MAF3CiiB,EAAA,CAAkCtF;85CCL1ChlB,IAAI+kB,QAAQ,aAAc,CACtB,YACA,SACIC,GAEA,OAAA,SAAAC,GAAA,SAAAuF,IAAA,OAAArF,gBAAAjX,KAAAsc,GAAApF,2BAAAlX,KAAAmX,gBAAAmF,GAAAlR,MAAApL,KAAA2P,YAAA,OAAAyH,UAAAkF,EAAAvF,GAAAM,aAAAiF,EAAA,KAAA,CAAA,CAAAzf,IAAA,SAAAnF,MAAA,SACkByC,GACV,MAAe,gBAARA,GAAkC,cAARA,MAFzCmiB,EAAA,CAAgCxF;85CCLxChlB,IAAI+kB,QAAQ,UAAW,CACnB,YACA,QACA,aACA,eACA,SACA,SACIC,EACAkE,EACAsB,EACAF,EACA3pB,GAEA,OAAA,SAAAskB,GAAA,SAAAkD,IAAA,OAAAhD,gBAAAjX,KAAAia,GAAA/C,2BAAAlX,KAAAmX,gBAAA8C,GAAA7O,MAAApL,KAAA2P,YAAA,OAAAyH,UAAA6C,EAAAlD,GAAAM,aAAA4C,EAAA,CAAA,CAAApd,IAAA,UAAAnF,MAAA,SA0BkB6H,GAAA,IAAAS,KAAA1B,cAAA0B,KAAA1B,YAAAvH,OAAA,OAAA,EAAA,IAAAC,GAAA,EAAAC,GAAA,EAAAC,OAAAC,EAAA,IAKV,IAAA,IAAAC,EAAAC,EAA8BiH,KAAAA,YAA9BhH,OAAAC,cAAAP,GAAAI,EAAAC,EAAAG,QAAAC,MAAAT,GAAA,EAAA,CAAA,IAAW8kB,EAAX1kB,EAAAM,MAA2Cf,WAAAnC,KAAAukB,cAA3C3X,GAAA,EAAAC,GAAA,EAAAC,OAAAnK,EAAA,IACQolB,IAAAA,IAAAA,EAAAA,EAAiBT,EAAjBS,OAAAA,cAAAA,GAAAA,EAAAA,EAAAA,QAAAA,MAAAA,GAAAA,EAAiBT,CAAAA,IAAjBS,EAAiBT,EAAAA,MADkBU,EAAAC,EAAA9lB,WAAA6lB,EAAA7lB,WAAAnC,KAAAioB,EAAAjoB,KAAA,GAAAgoB,GAEfD,KAFeC,EAAAA,EAAAzD,eAG/ByD,OAAa,GAHzB,MAAA7kB,GAAA0J,GAAA,EAAAC,EAAA3J,EAAA,QAAA,IAAAyJ,GAAA,MAAAI,EAAA,QAAAA,EAAA,SAAA,QAAA,GAAAH,EAAA,MAAAC,KALU,MAAA3J,GAAAV,GAAA,EAAAC,EAAAS,EAAA,QAAA,IAAAX,GAAA,MAAAK,EAAA,QAAAA,EAAA,SAAA,QAAA,GAAAJ,EAAA,MAAAC,GAoBV,OAAO,IA9Cf,CAAA2F,IAAA,iBAAAnF,MAAA,WAyCoB,OAAAsI,KAAO0c,QAAPjqB,EAAAuM,MAAAV,eAzCpB,CAAAzB,IAAA,qBAAAnF,MAAA,SA+BmDkD,GAAA,IAAAmd,EAAA/X,KAAA,OAAApF,EAAAtE,QAAA,SAAAwC,GAAA,OAAAA,EAAAqhB,eAAApC,EAAAoC,kBA/BnD,CAAAtd,IAAA,iBAAAnF,MAAA,WA+BmD,IAAAvE,EAAA,KAAAsQ,EAAA,KALjC,OAKiCzD,KAAArJ,WAAAgmB,aAAA3c,KAAArJ,WAAAimB,cAAAzpB,EAAA6M,KAAArJ,WAAAgmB,YAAAlZ,EAAAzD,KAAArJ,WAAAimB,cAAA5c,KAAArJ,WAAAkmB,QAAA7c,KAAArJ,WAAAxD,OAAA6M,KAAArJ,WAAA8M,QAa1CtQ,EAAA6M,KAAArJ,WAAAxD,MAAA,KAAA,IAlBSsQ,EAAAzD,KAAArJ,WAAA8M,OAAA,KAAA,KAAAzD,KAAArJ,WAAAxD,OAAA6M,KAAArJ,WAAA8M,SAAAtQ,EAAA,IAAA6M,KAAArJ,WAAAxD,MAAAsQ,EAAA,IAAAzD,KAAArJ,WAAA8M,QAAA,CAAAtQ,MAAAA,EAAAsQ,OAAAA,EAAA4M,MAAAld,EAAAsQ,EAAAtQ,EAAAsQ,EAAAA,EAAAtQ,KA1BlB,CAAA0J,IAAA,aAAAnF,MAAA,WAiEY+L,OAASzD,KAAKrJ,SAAWimB,MAAAA,KAAzBjmB,WAAAmmB,mBAAA9c,KAAArJ,WAAAnC,OAjEZ,CAAAqI,IAAA,SAAAzG,IAAA,WAAA,OAMa4J,KAAK+c,UAnBd/c,KACR+c,QADmB/c,KAEnB0a,eACA,SACAM,IASIhb,KAAA+c,UAAA,CAAAlgB,IAAA,cAAAzG,IAAA,WAAA,OAAA4J,KAAAgd,eAAAhd,KAAAgd,aAAAhd,KAAA0a,eAAA,CAAA,eAAA,eAAA4B,IAAAtc,KAAAgd,eAAA,CAAAngB,IAAA,gBAAAzG,IAAA,WA4BY,OA5BZ4J,KAAAid,iBAAAjd,KAAAid,eA0BkBjd,KAAA0a,eAAA,CAAA,iBAAA,iBAAA0B,IAECpc,KAAPid,iBA5BZ,CAAApgB,IAAA,uBAAAzG,IAAA,WA8CQ,IAAAijB,EAAArZ,KAgDA,OA/CHA,KAAAkd,wBA/CLzqB,EAAAkC,IAAAG,YAAA6K,qBAAA9H,IAAAmI,KAAArJ,WAAAwmB,iBAAAnd,KAAAkd,sBAAAzqB,EAAAkC,IAAAG,YAAA6K,qBAkDoB+c,KAALQ,sBAA0B5e,EAAjC3J,IAAAG,YAAA4K,oBAAAjM,MAAA,SAAAgL,GAAA,OAAAA,EAAA5G,IAAAwhB,EAAA1iB,WAAAwmB,oBAlDRnd,KAAAkd,wBAAAld,KAAAkd,sBAAA,KA8Feld,KAAKkd,wBA9FpB,CAAArgB,IAAA,WAAAzG,IAAA,WA8DYia,OALPrQ,KAAAod,YAzDLpd,KAAAod,UAAA,GAAApd,KAAAqd,sBAAArd,KAAAqd,qBAAAC,kBAAAtd,KAAAod,UA2DqBpd,KAAAqd,qBAAAC,gBAAAtd,KAAAnI,KAAA,KAGDmI,KAAZod,YA9DR,CAAAvgB,IAAA,UAAAzG,IAAA,WAkEe,QAGA4J,KAAIqd,qBAAyBE,oBAGnCvd,KAAAhH,SAAAiG,UAxET,CAAApC,IAAA,SAAAzG,IAAA,WA6EYjD,OAAAA,KADG6F,SAAAwkB,SA5Ef,CAAA3gB,IAAA,YAAAzG,IAAA,WAiFK,OAAA4J,KAAAhH,SAAAykB,YAjFL,CAAA5gB,IAAA,cAAAzG,IAAA,WA4GQ,OAAY4C,KAAAA,SAAL0kB,cA5Gf,CAAA7gB,IAAA,mBAAAzG,IAAA,WAUK,OAVL4J,KAAA2d,oBAMkBZ,KAAAA,kBAAS,GACf/c,KAAeqd,sBAAoBrd,KAAUgb,qBAA7C4C,mBACH5d,KAAA2d,kBAAA3d,KAAAqd,qBAAAO,iBAAA5d,KAAArJ,WAAAknB,cAAA,KAEJ7d,KAAA2d,oBAVL,CAAA9gB,IAAA,QAAAzG,IAAA,WAaa,OAAK4mB,KAAAA,iBAAcc,QAbhC,CAAAjhB,IAAA,eAAAzG,IAAA,WAgBQ,OAAY4mB,KAAAA,iBAAZxoB,MAAAwL,KAAArJ,WAAAmE,gBAhBR,CAAA+B,IAAA,WAAAzG,IAAA,WAAA,OAAA4J,KAmBwBrJ,WAAA0lB,UAAArc,KAAArJ,WAAA0lB,UAAA,MAnBxB,CAAA,CAAAxf,IAAA,SAAAnF,MAAA,SACkByC,GACV,MAAe,YAARA,GAA8B,WAARA,MAFrC8f,EAAA,CAA6BnD;85CCbrChlB,IAAI+kB,QAAQ,QAAS,CACjB,YACA,UACA,OACA,SACIC,EACAmD,EACAxkB,GAEA,OAAA,SAAAshB,GAAA,SAAAwD,IAAA,OAAAtD,gBAAAjX,KAAAua,GAAArD,2BAAAlX,KAAAmX,gBAAAoD,GAAAnP,MAAApL,KAAA2P,YAAA,OAAAyH,UAAAmD,EAAAxD,GAAAM,aAAAkD,EAAA,CAAA,CAAA1d,IAAA,kBAAAnF,MAAA,WAAA,IAAAqgB,EAAA/X,KAAAhJ,GAAA,EAAAC,GAAA,EAAAC,OAAAC,EAAA,IAmBQ,IAnBR,IAmBQC,EAnBRgD,EAAA,WAAA,IAmBmB2jB,EAnBnB3mB,EAAAM,MAAA,OAAAqmB,EAAAhG,EAAAnd,SAAAnH,MAAA,SAAAuqB,GAAA,OAAAA,EAAAnmB,IAAAkmB,UAAA,EAAA,CAAAvE,GAAA,GAAA,YAmBQniB,EAAwB5B,EAAKwE,UAAUsP,KAAI,SAAA0U,GAAC,OAAIA,EAAEnlB,QAAQjB,MAA1DP,OAAAC,cAAAP,GAAAI,EAAAC,EAAAG,QAAAC,MAAAT,GAAA,EAA+D,CAAA,IAAA0iB,EAAAtf,IAAA,OAAAsf,GAAA,IAAA,WAnBvE,SAmBuE,QAAA,GAAA,WAAAC,QAAAD,GAAA,OAAAA,EAAAF,IAnBvE,MAAA7hB,GAAAV,GAAA,EAAAC,EAAAS,EAAA,QAAA,IAAAX,GAAA,MAAAK,EAAA,QAAAA,EAAA,SAAA,QAAA,GAAAJ,EAAA,MAAAC,GA2BQ,OAAO,IA3Bf,CAAA2F,IAAA,kBAAAnF,MAAA,WAgDQ,IA5BI,IAAKqmB,EAAW,MA4BpBG,EAAA,EAAAC,EA3BQ,CACH,UAiBD,MAhBK,cAAoB,cAAwB,UAC7C,SAAA,iBAAA,YACH,wBAuBLD,EAAAC,EAAApnB,OAAAmnB,IAAsC,CAAjC,IAAME,EAAUD,EAAAD,GA7BrBG,EAA6BpkB,EAAcwL,QAAAwY,KAAC,KAAA,IAAA,IAAMnlB,KAAAA,WAANtE,KAAAukB,cAAAuF,QAAAD,GAAA,CAA5CE,EAAAH,EAA+D,OAAA,IAAAlV,EAAA,kBAAA5J,OAAAif,EAAA,QAsC/D,MAAO,CAtCwD1mB,GAAA,SAAAmI,KAAAnI,GAAAmR,SAAAhJ,KAAArJ,WAAAqS,SAAAC,UAAAjJ,KAAArJ,WAAAsS,UAO9DC,QAAAA,EARajU,KAAA,CAAA4E,MAAAmG,SAlBtB,CAAAnD,IAAA,gBAAAnF,MAAA,WAkBsB,IAAAgF,EAAA,GAAA,OAAAA,EAAA3I,KAAAiM,KAAArJ,WAAAikB,SAAA5a,KAAArJ,WAAA6nB,eAAA,IAAA9hB,EAAA3I,KAAA,MAAA2I,EAAA3I,KAAAiM,KAAArJ,WAAA8nB,MAAAze,KAAArJ,WAAA+nB,WAAA,IAAAhiB,EAAA3I,KAAAiM,KAAArJ,WAAAgoB,UAAA3e,KAAArJ,WAAAioB,eAAA,IAAAliB,EAAApG,QAAA,SAAAuoB,GAAA,MAAA,IAAAA,KAAA5iB,KAAA,OAlBtB,CAAAY,IAAA,WAAAzG,IAAA,WAKmB,IAAAijB,EAAArZ,KALnB,OAMaA,KAAKkb,YACFlb,KAAKrJ,WAAWmoB,aAChB9e,KAAKkb,UAAYzlB,EAAKspB,0BAA0BzoB,QAAO,SAAC0oB,GACpD,OAA8F,IAAvF3F,EAAK1iB,WAAWmoB,aAAaR,QAAQU,EAAoBroB,WAAWsoB,iBAT/Fjf,KAAAkb,UAAAlb,KAAA0a,eAAA,WAAAT,IAAAja,KAAAkb,YAAA,CAAAre,IAAA,iBAAAzG,IAAA,WA+BQ,OAAO4J,KAAKrJ,WAAWwmB,kBAAoBnd,KAAKsX,cAAc7Y,aAAaxJ,KAAK4C,MA/BxF,CAAA,CAAAgF,IAAA,SAAAnF,MAAA,SACkByC,GACV,MAAe,UAARA,GAA4B,SAARA,MAFnCogB,EAAA,CAA2BzD;aCTnC,IAAMoI,YAAc,CAChBC,GAAI,CAAC,EAAG,KADND,GAAAA,CAAAA,IAAAA,KACAE,GAAE,CAAA,IADY,KAEdC,GAAG,CAAA,MAFW,SAApBC,aAAAvb,GAQI,IAAKmb,YAAYnb,GADrB,MAASub,IAAAA,MAAcvb,6CAAMlI,OAAAkP,KAAAmU,aAAAjjB,KAAA,OAI5B,IAAAyB,QAAA,CAGG6hB,SAAU1tB,OAAO2tB,wBAA0Btf,SAAQ,aADjDxC,SAAU,iCAAA+hB,KAAAC,UAAAC,WACZJ,UAAU1tB,UAAO2tB,UAAAA,cAA0Btf,QAAS,YADxC,EAEZ0f,MAAQ,mBAAEH,KAAAC,UAAiCD,aAAeE,OAAAA,SAC1Djd,YALH,WAMQ,OAAE1C,KAAA6f,iBAEHA,cARP,WAEe,OAQZA,KARYN,QAaZO,kBAfH,SAEe/b,GAeR,OADAub,aAAYvb,GACLlS,OAAOkuB,YAAcb,YAAWnb,GAAvC,IAEJic,oBAnBH,SAEejc,GAkBRub,aAAYvb,GACNkc,IAAKf,EAAAA,YAAkBnb,GAAMmb,IAAAA,YAAkBnb,GAArD,GACA,OAAOlS,OAAOkuB,WAAdE,GAGUC,WAzBjB,WAyBiB,IAAAlpB,GAAA,EAAAC,GAAA,EAAAC,OAAAC,EAAA,IAAA,IAAA,IAAAC,EAAAC,EAAAwE,OAAAkP,KAAAmU,aAAAtI,UAAAtf,OAAAC,cAAAP,GAAAI,EAAAC,EAAAG,QAAAC,MAAAT,GAAA,EAAA,CAAA,IAAA6F,EAAAzF,EAAAM,MAAA,GAAAsI,KAAA8f,kBAAAjjB,GAGF,OAAOA,GAHL,MAAAlF,GAAAV,GAAA,EAAAC,EAAAS,EAAA,QAAA,IAAAX,GAAA,MAAAK,EAAA,QAAAA,EAAA,SAAA,QAAA,GAAAJ,EAAA,MAAAC,GAOV,MAAO,OAPGpF,IAAA+kB,QAAA,UAAA,CAAA,WAAA,OAAAnZ;85CCpClB5L,IAAI+kB,QAAQ,gBAAiB,CACzB,YACA,SACIsJ,GAEA,OAAA,SAAAC,GACI,SAAAC,EAAYxjB,EAAK5H,EAAMqrB,GAAQ,IAAAvI,EAAA,OAAAd,gBAAAjX,KAAAqgB,IAC3BtI,EAAAb,2BAAAlX,KAAAmX,gBAAAkJ,GAAA7I,KAAAxX,KAAMnD,EAAK,KAAMyjB,EAAQ,QACpBrrB,KAAOA,EAFe8iB,EADnC,OAAAX,UAAAiJ,EAAAD,GAAA/I,aAAAgJ,EAAA,CAAA,CAAAxjB,IAAA,YAAAnF,MAAA,WAOQ,OAAOsI,KAAKsgB,OAAOzsB,UAP3BwsB,EAAA,CAAmCF;mZCL3CruB,IAAI+kB,QAAQ,YAAa,CACrB,WAEI,OAAA,WACI,SAAAsJ,EAAYtjB,EAAKgI,EAAMyb,EAAQ9c,GAAWyT,gBAAAjX,KAAAmgB,GACtCngB,KAAKnD,IAAMA,EACXmD,KAAK6E,KAAOA,EACZ7E,KAAKsgB,OAASA,EAPlBtgB,KAAAwD,UACRA,EAEI,OAAA6T,aAAA8I,EAAA,CAAA,CAAAtjB,IAAA,UAAAnF,MAAA,WACI,SAAAsI,KAAYnD,OAAKgI,QAAMyb,KAAQ9c,OAA/BnL,MAA0CpD,KAAA4C,MAD9C,CAAAgF,IAAA,YAAAnF,MAAA,WAMK,OAAAsI,KAAAsgB,OAAAC,UANL,CAAA1jB,IAAA,YAAAnF,MAAA,WAAA,OAAAsI,KAAAwD,UAQc3P,OAAAmM,KAAAsgB,OAAAzsB,QARd,CAAAgJ,IAAA,cAAAnF,MAAA,WAwBQ,OAAOsI,KAAKsgB,OAAOE,WAxB3B,CAAA3jB,IAAA,WAAAnF,MAAA,WAAA,QAAAsI,KAAAwD,UAAA6D,SAAA,CAAAxK,IAAA,SAAAnF,MAAA,WAAA,OAAAsI,KAAAwD,UAAAnL,MAoBoBmL,KAAAA,UAALnL,MAAwB6W,IApBvC,OAAA,CAAArS,IAAA,WAAAnF,MAAA,WAAA,OAAAsI,KAAAwD,WAuBkBxD,KAAAwD,UAAAnL,OACEioB,KAAOE,UAAnBnoB,MAAAlF,OAxBR,IAAA,CAAA0J,IAAA,YAAAnF,MAAA,WAAA,OAAAsI,KAAAwD,WAAAxD,KAAAwD,UAAAnL,OAAA2H,KAAAwD,UAAAnL,MAAAoL,QAiCY,IAjCZ,CAAA5G,IAAA,aAAAnF,MAAA,WAoCK,OAAAsI,KAAAsgB,OAAAjoB,MAAApD,KAAA4C,KApCL,CAAAgF,IAAA,UAAAnF,MAAA,WAuCY,OAAK8L,KAAAA,MAAaxD,KAAKwD,KAAAA,KACXA,KAAAA,KAAUnL,KAsBnB,eA9Df,CAAAwE,IAAA,aAAAnF,MAAA,WAAA,OAAAsI,KAAAygB,YAAAzgB,KAAAyE,WAAA,CAAA5H,IAAA,iBAAAnF,MAAA,WAiDS,OAAAsI,KAAA0gB,WAAA1gB,KAAA2gB,YAAA,YAAA,eAjDTR,EAAA;mZCHRruB,IAAI+kB,QAAQ,mBAAoB,CAC5B,QACA,KACA,MACA,SACIY,EACAvlB,EACA0C,GAEA,OAAA,WAAA,SAAAgsB,EAAAjgB,GAAA,IAAAnM,EAAAmM,EAAAnM,KAAA6U,EAAA1I,EAAA0I,KAAAjH,EAAAzB,EAAAyB,SAAAye,EAAAlgB,EAAAkgB,UAAAC,EAAAngB,EAAAmgB,kBAAA7J,gBAAAjX,KAAA4gB,GAAA5gB,KAAAxL,KAAAA,EACIwL,KAAAqJ,KAAAA,EAAoErJ,KAAAoC,SAAAA,EAAApC,KAAA6gB,UAAAA,EAA1Cze,KAA0C0e,kBAAAA,EAAhCD,KAAgChV,IAAA,KAArBiV,KAAAA,SAAqB,EAQhE9gB,KAAK/K,KAAO,GARoD+K,KAAA+gB,QAAA,GADxE,OAAA1J,aAAAuJ,EAAA,CAAA,CAAA/jB,IAAA,OAAAnF,MAAA,WAGQ,IAAAqgB,EAAA/X,KAGK8gB,OAFA1e,EAAAA,MAAWA,wBAAhBpC,KAAAoC,UAEK0e,GAAAA,SAAAA,EAAoBA,GACzB/I,EAAA3V,SAAAyJ,IACemM,EAAfD,EAAA3V,SAAAyJ,MAcIkM,EAAKpS,SAAU,EAtB3B8R,EAAArhB,IAAA2hB,EAAA3V,SAAA5P,KAAA8C,MAAA,SAAAC,GAAAwiB,EAAApS,SAAA,EAAAoS,EAAA3V,SAaWyJ,IAAAtW,EAAAN,KACO+iB,EAAAD,EAAA3V,SAAyByJ,QAEzB,SAAAhY,GACGuO,EAAAA,SAAc,EACXxN,EAAKwN,MAAAA,gCAAbvO,GACAokB,EAAApkB,YAnBhB,CAAAgJ,IAAA,cAAAnF,MAAA,SAwBqBiO,GAKN,OAJC3F,KAAKoC,SAALA,EAIDpC,KAACnM,SA7BhB,CAAAgJ,IAAA,YAAAnF,MAAA,SAgCuB7D,GATX,IAAAmtB,EAAAjuB,EAAA0O,GAAAxM,KAAA,UAvBZ,OAgBQ+K,KAAA+gB,QAAAC,EAAAnpB,MAmBHmI,KAAA+gB,QAAAC,EAAAnpB,IAAAmpB,EAAAC,OAnCLD,EAAAC,MAAAjhB,KAAA+gB,QAAAC,EAAAnpB,IAAAmpB,IAAA,CAAAnkB,IAAA,WAAAzG,IAAA,WAAA,MAAA,YAAA4J,KAAAoC,SAAA4N,gBAAA4Q,EAAA;mZCTR9uB,IAAI+kB,QAAQ,eAAgB,CACxB,aACA,UACA,SACA,MACA,MACA,SACA,SAPAA,EAeInZ,EAAAjL,EAAAsD,EACInB,EAAyEiR,GAAA,OAAA,WAA9C/M,SAAAA,EAAAA,GAA8C,IAAArD,EAAAkL,EAAAlL,KAAA4C,EAAAsI,EAAAtI,MAAA6oB,EAAAvgB,EAAA7H,QAAAA,OAAA,IAAAooB,EAApC,KAAoCA,EAAAC,EAAAxgB,EAAA3F,SAAAA,OAAA,IAAAmmB,EAAA,EAAAA,EAAAC,EAAAzgB,EAAA3H,SAAAA,OAAA,IAAAooB,EAAA,GAAAA,EAAAnK,gBAAAjX,KAAAlK,GAAAkK,KAAAnI,GAAAgO,EAA9B7K,IAAAA,aAAAA,KAA8BvF,KAAAA,EAAAuK,KAAA3H,MAAAA,EAAhBW,KAAgBF,QAAAA,EAKrEkH,KAAKhF,SAAWA,EALqDgF,KAAAhH,SAAAA,EAOrEgH,KAAKqhB,YAAc,KALP5rB,KAAZqD,UACAkH,KAAa3H,QAAb2H,KAAAshB,qBAHqE,OAAAjK,aAAAvhB,EAAA,CAAA,CAAA+G,IAAA,iBAAAnF,MAAA,WAD7EsI,KAAAhF,SAAAvI,EAuBqB8uB,cACJvmB,KAAAA,SAAiBvI,EAAC8uB,aAE1BvhB,KAAAhF,SAAA,IAEGgF,KAAKhF,SAAW,GAAhBgF,KAAKhF,KAAL/B,kBA3BiE,CAAA4D,IAAA,mBAAAnF,MAAA,WA8BxEsI,KAAAhF,SAAAvI,EAAA8uB,aA/BLvhB,KAAAhF,WAAAgF,KAAAwhB,mBAC6E,CAAA3kB,IAAA,mBAAAnF,MAAA,WAwCjEsI,KAAKhF,SAAW,GAJfwmB,KAAAA,WArCbxhB,KAAAwhB,mBAC6E,CAAA3kB,IAAA,aAAAnF,MAAA,SAwC5DsD,GACL,QAAKA,KAALlC,SAAAkH,KAAAlH,QAAAjB,IAAAiB,EAAAjB,MAEC2pB,EAAAA,MAAAA,sBAAL1oB,EAAAqhB,cACHna,KAAAlH,QAAAA,EA7CLkH,KAAAoM,YAAA,KAAApM,KAAA6L,IAAA,KAAA7L,KAAAqhB,YA+CevoB,KACHkH,KAAKlH,SAAW,GAEnBA,GASG/C,EAAIhC,KAAK,CARHyE,MAAA,cACVipB,YAAA3oB,EAAAqhB,aACK/N,UAALtT,EAAAjB,KAGKmB,KAAAA,KAAWC,gBAUhBvD,EAAWoK,WAAW,kBART,KAzDwD,CAAAjD,IAAA,WAAAnF,MAAA,SA4D7D+pB,GACA1D,KAAAA,MAAWjlB,IA7DkD,CAAA+D,IAAA,WAAAnF,MAAA,WAgEhEjC,GAAKwD,KAAAA,OAAV+G,KAAA3H,MAAAmL,WAAAxD,KAAA3H,MAAAmL,UAAAnL,OAAA2H,KAAAlH,QAGH,OAAAkH,KAAA0hB,gBAAA1hB,KAAA2hB,sBAAA3hB,KAAA4hB,iBAAA5hB,KAAA6hB,wBAnEwE,CAAAhlB,IAAA,qBAAAnF,MAAA,WAD7E,IAAAoqB,EAAA9hB,KAAAlH,QAAA0kB,OAAA,IAAAsE,EA2EkBzpB,MAAN,IAEHypB,GAAA,IAaD,IAAMje,EAAc7D,KAAKlH,QAAQ4K,iBAZ7B,OAAKge,KAAAA,IAAL7d,EAA4B8d,MAAAA,EAA5Ble,QAAyDme,IA7EQ,CAAA/kB,IAAA,sBAAAnF,MAAA,WAgFrE,IAAOoqB,EAAP9hB,KAAAlH,QAAA0kB,OACH,GAAAsE,EAAA,CAlFLA,GAAA,IAqFYA,IAAAA,EAAiBhpB,KAAQ0kB,QAA7B9Z,iBAgBA,OAAO/H,KAAKuX,IAAIrP,EAAY1Q,MAAO0Q,EAAYJ,QAAUqe,KApGY,CAAAjlB,IAAA,kBAAAnF,MAAA,WAwGrE,IAAMmM,EAAc7D,KAAKlH,QAAQ4K,iBAhBjCoe,OAAYA,KAAAA,IAASje,EAArB1Q,MAAA0Q,EAAAJ,UAxFqE,CAAA5G,IAAA,mBAAAnF,MAAA,WAD7E,IAAAmM,EAAA7D,KAAAlH,QAAA4K,iBAAA,OAAA/H,KAAAuX,IAAArP,EAAA1Q,MAAA0Q,EAAAJ,UAC6E,CAAA5G,IAAA,gBAAAnF,MAAA,WA+FhEoqB,OAAAA,KAAL1V,YACIzQ,KAAAC,MAAAD,KAAAuL,IAAAlH,KAAAoM,YAAAjZ,MAAA6M,KAAAoM,YAAA3I,SAqBG9H,KAAKuL,IAAIlH,KAAK3H,MAAMmL,UAAUnL,MAAMlF,MAAO6M,KAAK3H,MAAMmL,UAAUnL,MAAMoL,UArHR,CAAA5G,IAAA,iBAAAnF,MAAA,WAqGxE,OAAAsI,KAAAoM,YAtGLzQ,KAAAC,MAAAD,KAAAuX,IAAAlT,KAAAoM,YAAAjZ,MAAA6M,KAAAoM,YAAA3I,SAAA9H,KAAAuX,IAAAlT,KAAA3H,MAwGsBmL,UAAAnL,MAAAlF,MAAA6M,KAAA3H,MAAAmL,UAAAnL,MAAAoL,UAvGuD,CAAA5G,IAAA,gBAAAnF,MAAA,WAD7E,GAAAsI,KAAAoM,cAAApM,KAAAlH,UAAAkH,KAAAQ,YAAAR,KAAA3H,MAAAmL,UAAA,OAAA,EA8GcK,IAAAA,EAAmB/K,KAAQ4K,QAAAA,iBACrBwP,EAAgB/f,KAAO0Q,MAAAA,UAAYJ,MAA/CzD,KAAA3H,MAAAmL,UAAAC,OAAAzD,KAAA3H,MAAAmL,UAAArQ,MAAA6M,KAAA3H,MAAAmL,UAAAC,OAAAzD,KAAA3H,MAAAmL,UAAAC,OAAAzD,KAAA3H,MAAAmL,UAAArQ,MACH4uB,EAAAle,EAAA1Q,MAAA0Q,EAAAJ,OAAAI,EAAA1Q,MAAA0Q,EAAAJ,OAAAI,EAAAJ,OAAAI,EAAA1Q,MAhHL,OAAAwI,KAAAqmB,IAAAC,EAAAF,GAAA,MAC6E,CAAAllB,IAAA,UAAAnF,MAAA,WAoHpE,OAAAgG,EAAA6hB,UArHTvf,KAAAkiB,aA2HuBliB,KAACpE,WA1HqD,CAAAiB,IAAA,eAAAnF,MAAA,WA6HxE,OAAAsI,KAAA6L,IA9HL,MAAA7L,KAAA3H,MAAAooB,WAiIiBrU,SAER,QAlIoE,CAAAvP,IAAA,aAAAnF,MAAA,WAqI/DqqB,OAAAA,KAAAA,MAAkBI,eArI6C,CAAAtlB,IAAA,mBAAAnF,MAAA,WAD7E,OAAA,IAC6E,CAAAmF,IAAA,eAAAnF,MAAA,WA6IpE,OAAA,IA7IoE,CAAAmF,IAAA,UAAAnF,MAAA,WAiJpE,OAAAsI,KAAAlH,QAAAspB,cAAA9rB,QAAA,SAAAgc,GAAA,QAAAA,EAAA3b,WAAA0lB,UAAA7X,SAAAzN,OAAA,IAjJoE,CAAA8F,IAAA,OAAAnF,MAAA,WAD7E,OAAAsI,KAAAkiB,UAAAxsB,EAAA2sB,UAAA,CAAA7tB,KAAA,iBAwJsBmE,SAAAqH,OAGL3H,KAAMooB,UACX/qB,EAAA6K,aAAAP,WADA,IA1JiE,CAAAnD,IAAA,YAAAnF,MAAA,WAD7E,SAAAsI,KAAA3H,QAAA2H,KAAA3H,MAAAiqB,eAC6E,CAAAzlB,IAAA,UAAAnF,MAAA,WAD7E,SAAAsI,KAAA3H,QAAA2H,KAAA3H,MAqKuBkqB,aApKsD,CAAA1lB,IAAA,eAAAnF,MAAA,WA0KxE,IAAAsI,KAAAhF,WAAAgF,KAAAlH,SAAAkH,KAAAsiB,YA3KL,OAAA,KAAA,IAAAE,EA6Kc,CACCroB,KAAKrB,aAAqCnC,WAAKA,CAAtD4D,WAAAyF,KAAAlH,QAAAkH,KAAAlH,QAAAjB,GAAA,KACHmD,SAAAW,KAAAuX,IAAAlT,KAAAhF,SAAAvI,EAAA8uB,aA/KLkB,YAAAziB,KAAAoM,aAAA,YAAApM,KAAAoM,YAAA4D,eAAA,OAkLiBkS,KAAAA,QAAW3d,SAAAC,OAAAxE,KAAAlH,QAAAyL,SAAAC,MAAAke,eACThtB,EAAW2sB,WAAUM,UAAA,CAClB3iB,KAAAmiB,aACIniB,KAAAmiB,cAEjBniB,KAAAmiB,eAuCGK,EAAa7rB,WAAWisB,SAAW5iB,KAAKmiB,cAnC3CniB,KAAA6L,MACJ2W,EAAA7rB,WAAAkV,IAAA7L,KAAA6L,IAAApG,QAAA,mBAAA,kBA5LL+c,IAC6E,CAAA3lB,IAAA,uBAAAnF,MAAA,WAwOrE,IAAMpB,EAAS,SAACwC,GAvCT,QAAPA,EAAAmG,WAlMRnG,EAAA+pB,OAAA9rB,QAkPQ,MAA8B,WAA1BiJ,KAAKvK,KAAKkF,aAA4C,mBAAhBlI,EAAOqwB,MAA6B9iB,KAAKvK,KAAKoE,MAzCxFmG,KAAAvK,KAAAstB,mBACHzsB,OAAAA,GA1ML0J,KAAAvK,KAAAspB,0BA6MkB/jB,OAAN1E,KA5MiE,CAAAuG,IAAA,oBAAAnF,MAAA,WA0PrD,IAAAqgB,EAAA/X,KA3CZwiB,EAAexiB,KAAAgjB,uBACX,GAAEhjB,KAAAlH,QADS,CAEfnC,IAAYssB,EAAAroB,EAAAnH,MAAA,SAAAqF,GACE,OAAOA,EAAAA,QAAUnC,WAAakB,MADhCiB,EAAAnC,WAAAnC,QAGRiuB,GAAUQ,EAHF,OAAAA,EAyCA,IAAAjsB,GAAA,EAAAC,GAAA,EAAAC,OAAAC,EAAA,IAnCZ,IAAA,IAAAC,EAAAC,EAAsBmN,EAAtBlN,OAAAC,cAAAP,GAAAI,EAAAC,EAAAG,QAAAC,MAAAT,GAAA,EAA+B,CAC/BwrB,OAD+BprB,EAAAM,OAmCnB,MAAAC,GAAAV,GAAA,EAAAC,EAAAS,EAAA,QAAA,IAAAX,GAAA,MAAAK,EAAA,QAAAA,EAAA,SAAA,QAAA,GAAAJ,EAAA,MAAAC,GA7BZsrB,EAAAA,MAAa7rB,iCAA2BwrB,QA7NyB,CAAAtlB,IAAA,aAAAzG,IAAA,WAerE,OAAO4J,KAAKqhB,aAAerhB,KAAK6L,KAfqCqX,IAAA,SAWpErX,GACJ7L,KAAAqhB,YAAAxV,MAZwE/V,EAAA;AChBrF;mZCAAhE,IAAI+kB,QAAQ,mBAAoB,CAC5B,WAEI,OAAA,WACI,SAAAsM,EAAYtmB,EAAKumB,EAAcC,GAASpM,gBAAAjX,KAAAmjB,GACpCnjB,KAAKnD,IAAMA,EACXmD,KAAKojB,aAAeA,EACpBpjB,KAAKqjB,QAAUA,EAJvB,OAAAhM,aAAA8L,EAAA,CAAA,CAAAtmB,IAAA,UAAAnF,MAAA,WAAA,OAAA,IAAA,CAAAmF,IAAA,YAAAnF,MAAA,WAEQ,OAAA,IAFR,CAAAmF,IAAA,YAAAnF,MAAA,WAgBQ,OAAO,IAhBf,CAAAmF,IAAA,cAAAnF,MAAA,WAQQ,OAAA,IARR,CAAAmF,IAAA,WAAAnF,MAAA,WAAA,OAAA,IAAA,CAAAmF,IAAA,WAAAnF,MAAA,WAAA,OAAA,IAAA,CAAAmF,IAAA,aAAAnF,MAAA,WAAA,OAAA,IAAA,CAAAmF,IAAA,aAAAnF,MAAA,WAqBK,OAAAsI,KAAAqjB,UArBL,CAAAxmB,IAAA,SAAAnF,MAAA,WAwBQ,OAAAsI,KAAAojB,iBAxBRD,EAAA;mZCHRrxB,IAAI+kB,QAAQ,OAAQ,CAChB,KACA,aACA,WACA,MACA,YACA,gBACA,eAPAA,mBAiCI,SAvBJ,MAyBI,gBAAU,SAAA,MACN,UAAc,cApBtB,SAqBY3kB,EACAwD,EACAG,EACAlB,EACAwrB,EACAE,EACAvqB,EACAqtB,EACA1wB,EACAsD,EACAutB,EACAC,EACA3uB,EACAqlB,EACA7S,GAEA,IAAKoc,EAAAA,EA+eC/tB,EAAC8I,IA7eFklB,WACAC,SAAAA,IAAczM,gBAAAjX,KAAA2jB,GAEdhpB,KAAAA,UAAqBsL,GApB1BjG,KAAK4jB,OAAS,GAqBTnxB,KAAAyG,QAAWpE,GACP6F,KAAAA,MAAc,KACtBqF,KAAA6jB,iBAAA,KACJ7jB,KAAA8jB,eAAA,GAnBG9jB,KAAKxL,KAAO/B,EAAOwT,WAAW,SAAW,GARvCjG,KAAAgG,MAAAvT,EAAAwT,WAAA,UAAA,GAAAjG,KAAA+jB,MAAAtxB,EAAAwT,WAAA,UAAA,GAAAjG,KAAAgkB,WA6BoB,IA7BpBvxB,EA6BM4H,WAAc,aAClBnC,KAAQ+rB,aAAZxxB,EAA6B4H,WAA7B,iBAAA,GACKJ,KAAAA,YAAeI,EAApB4L,WAAA,gBAAA,GACAvQ,KAAWoK,mBAAWrN,EAAtBwT,WAAA,sBACKhN,KAAAA,cAALxG,EAAAwT,WAAA,kBAAA,GACHjG,KAAAkkB,gBAAAzxB,EAAAwT,WAAA,oBAAA,GAlCKjG,KAAA7J,YAAA,KAAA6J,KAAAwjB,gBAAA,EAAAxjB,KAAAhG,WAAA,KAqCIpB,KAAQ6qB,sBAAuB9qB,KAhBrCqH,KAAK0jB,YAAc,GAkBVzpB,KAAAA,YAAiBrB,EAAtBqN,WAAA,gBAAA,SACWnG,EAAAA,IAAWhL,YAAA6K,qBAAtB9H,KACKoB,KAAAA,YAAL,UArBCwqB,OAAAA,aAAAA,EAAAA,CAAAA,CAAAA,IAAAA,cAAAA,MAAAA,SApBHppB,GAAAzF,EAAAsD,QAAA,gBA6CUmC,GACL2F,KAAK/F,UAAUlD,KAAfsD,GACV3E,EAAAoK,WAAA,iBA/CKE,KAAA/G,kBAoBGwqB,CAAAA,IAAAA,iBAAAA,MAAAA,SA6ByB9qB,GAC1BT,IAAQU,EAAAoH,KAAanG,UAAzBykB,QAAA3lB,IACA,IAAK0d,IACLrW,KAAanG,UAAbsqB,OAAAvrB,EAAA,GAZIlD,EAAWoK,WAAW,iBAafE,KAAA/G,mBAjCNwqB,CAAAA,IAAAA,eAAAA,MAAAA,WAqCOjrB,OAAOwH,KAAA/F,UADFlD,OAAA,IApCZ0sB,CAAAA,IAAAA,WAAAA,MAAAA,SAoCG5pB,GAAA,IAAAuqB,IAAAzU,UAAA5Y,OAAA,QAAAI,IAAAwY,UAAA,KAAAA,UAAA,GAKH/a,EAAAsD,QAAA,YAAA2B,GACJmG,KAAAqW,SAAA,KAVDrW,KAAKnG,MAAQA,EAWRwqB,IACAprB,EAALsF,WAAA,QAAA1E,EAAAhC,IACHusB,GAjEKruB,EAAAhC,KAAA,CAAAyE,MAAA,eAAA8rB,UAmEWzqB,EAAAlD,WAAAnC,KACT+vB,QAAqB1qB,EAArBhC,MALJmI,KAAKqkB,qBAAqB,aASnBrkB,KAAK+e,kBApDP0E,CAAAA,IAAAA,iBAAAA,MAAAA,WApBH,MA2EYK,WA3EZ9jB,KAAArF,aA2E4B4gB,mBAAhBuI,EAAgBvI,MAAgBvb,KAAAnG,MAC9CmG,KAAoBub,mBA5ElBvb,KAAA+e,4BAoBG0E,CAAAA,IAAAA,oBAAAA,MAAAA,SA6DLK,EAA6BU,GACzB3xB,KAAMixB,eAAAvI,GAAoCsI,KAAAA,aAA9CC,GACHlvB,EAAA/B,MAAA,4BAAAmN,KAAA8jB,kBA/DQL,CAAAA,IAAAA,sBAAAA,MAAAA,SApBHI,GAsFEhxB,KAAMgxB,iBAAA7jB,KAAAwkB,aAAVX,GADsBjvB,EAAA/B,MAAA,8BAAAmN,KAAA6jB,oBAjEjBJ,CAAAA,IAAAA,uBAAAA,MAAAA,SAiEYgB,GAAK7vB,EAAA/B,MAAA,0BAAA4xB,GAAA,IAAAztB,GAAA,EAAAC,GAAA,EAAAC,OAAAC,EAAA,IAEtB,IAAA,IAAAC,EAAAC,EAA4B4C,KAAAA,UAA5B3C,OAAAC,cAAAP,GAAAI,EAAAC,EAAAG,QAAAC,MAAAT,GAAA,EAAA,CAAW2B,IAAXvB,EAAAM,MAAuC4pB,sBAAAthB,KAAA0kB,gBAAA,CAE/B,IAAKC,QAAQ,4EADHrD,OAAAA,EAEC,QALG,MAAA3pB,GAAAV,GAAA,EAAAC,EAAAS,EAAA,QAAA,IAAAX,GAAA,MAAAK,EAAA,QAAAA,EAAA,SAAA,QAAA,GAAAJ,EAAA,MAAAC,GAAA,IAAAkK,GAAA,EAAAC,GAAA,EAAAC,OAAAnK,EAAA,IAOd,IAAA,IAAAoK,EAAAC,EAAAxB,KAAA/F,UAAA3C,OAAAC,cAAA6J,GAAAG,EAAAC,EAAAhK,QAAAC,MAAA2J,GAAA,EAAA,CAAA,IAAAzI,EAAA4I,EAAA7J,MACHktB,EAAAjsB,EAAA2oB,oBACJsD,EATqBjsB,EAAAmZ,WAAA8S,GAAA5kB,KAAA0kB,iBAAA1kB,KAAA6kB,eAAAlsB,IAAA,MAAAhB,GAAA0J,GAAA,EAAAC,EAAA3J,EAAA,QAAA,IAAAyJ,GAAA,MAAAI,EAAA,QAAAA,EAAA,SAAA,QAAA,GAAAH,EAAA,MAAAC,GAAA,OAAA,IAjEjBmiB,CAAAA,IAAAA,gBAAAA,MAAAA,WAiEiB,OAAAzjB,KAAAnG,OAAA,UAAAmG,KAAArF,aAAAqF,KAAAnG,MAAAe,SAAA7D,OAAA,IAjEjB0sB,CAAAA,IAAAA,eAAAA,MAAAA,SAiEiB7oB,EAAAkqB,GAAA,IAAAC,EAAA,KA+BtB,IA/BsBA,EAAA,IAAAC,KAAAC,cAAA9tB,EAAA,CAUtB+tB,SAAuB,EAAZvsB,YAA4B,SAC7BisB,MAAAA,IAEFjsB,IAAAA,EAASmZ,KAAW8S,cAUxB,OAXAhqB,EAEYuqB,MAAKT,SAAAA,EAAAA,GAEhB,IAAAU,EAAAjU,EAAA0R,OAAApvB,MAAA,SAAA4xB,GAAA,OAAAA,EAAA1uB,WAAA0f,WAAAA,KACJ+O,EAAAA,GAAAA,EAAAzuB,WAAA4E,MAAA6pB,EAAAzuB,WAAA4E,MAAA,IAjBqB4V,EAAAsM,YAAA2H,GAAAjU,EAAAsM,WAAA,IAAA6H,EAAAC,EAAA1C,OAAApvB,MAAA,SAAA4xB,GAAA,OAAAA,EAAA1uB,WAAA0f,WAAAA,KAAA,GAAAiP,EAAAA,GAAAA,EAAA3uB,WAAA4E,MAAA+pB,EAAA3uB,WAAA4E,MAAA,IAAAgqB,EAAA9H,YAAA6H,GAAAC,EAAA9H,WAAA2H,GAAAE,EAAA,OAAAF,EAAAE,EAAA,IAAAP,EAAA,OAAA,EAkBtB,IAAAS,EAAAV,EAAAA,EAAA3T,GAAAA,EAAAxa,WAAAnC,KACHixB,EAAAX,EAAAA,EAAAS,GAAAA,EAAA5uB,WAAAnC,KAxGK,OAAAuwB,EAAAW,QAAAF,EAAAC,MA4GO5rB,IAxFJ4pB,CAAAA,IAAAA,gBAAAA,MAAAA,WApBH,GAAAzjB,KAAAyjB,sBAmHU5tB,EAAZ8vB,OAAA3lB,KAAAyjB,sBAAAmC,OAwCI5lB,KAAKyjB,sBAAsBmC,MAAQ/vB,EAASmK,KAAK6lB,qBAAqBC,KAAK9lB,MAAO,SAvClF,CACQ,IAAOglB,EAAKC,EAAAA,QACTjlB,KAD6ByjB,sBAAA,CAEzBmC,MAAE/vB,EAAAmK,KAAA6lB,qBAAAC,KAAA9lB,MAAA,KAFjB+lB,MAAAA,GA8CJ,OAAO/lB,KAAKyjB,sBAAsBsC,MAAMC,UA/InCvC,CAAAA,IAAAA,uBAAAA,MAAAA,WA0GD,IAAA1L,EAAA/X,KACIolB,EAAMltB,QAAK2qB,kBAAf,IAAAoD,IAAgCC,EACvBd,EAAiBzuB,EA2C1BwvB,EAAa,EA1CP1I,EAAW,EACHtM,EAAVnR,KAAA1E,cACH0E,KAAA9G,QAAA,CA4CD+N,KAAM,IAjDN,IAAApF,GAAA,EAAAC,GAAA,EAAAC,OAAA5K,EAAA,IAMgC,IAAA,IAAA6K,EAAAC,EAAqBoU,KAAjBpc,UAAJ3C,OAAAC,cAAAsK,GAAAG,EAAAC,EAAAzK,QAAAC,MAAAoK,GAAA,EAAkCwU,CAAAA,IAAxB1f,EAAwB0f,EAAAA,MAAlE1d,EAAA2pB,cAEM7E,EAAW3kB,SAAA,WACD2kB,IAAAA,EAAZ9kB,EAAAG,QAAAqhB,aACHiM,EAAArO,EAAA7e,QAAA+N,KAAAxT,MAAA,SAAA4yB,GAAA,OAAAA,EAAA7xB,MAAAA,KAgDQ4xB,IA/CKd,EAAQ,CACFA,KAAhB9wB,EACHsE,QAAAH,EAAAG,QAiDWkC,SAAU,EAhDPqqB,MAAA,GAGftN,EAAA7e,QAAA+N,KAAAlT,KAAAqyB,IAkDIA,EAAWprB,UAAYrC,EAASqC,SAhDrB,IAAG8pB,EAAAA,EACXC,GAASW,EAAQF,QAAWC,CArBvC,IAAAa,EAAA3tB,EAAAG,QAAA+pB,OAAApvB,MAAA,SAAAuqB,GAAA,OAAAA,EAAArnB,WAAA0f,UAAAA,KAwBAiQ,IACHjB,EAAAiB,EAAA3vB,WAAA4E,MAAA6qB,EAAAprB,UAtJKorB,EAAAf,OAwJUA,EAlBS,GAoBRM,EAAYlC,UAChBA,IAEWtqB,IAGL4sB,GAAAA,EAAAA,WAlCX,MAAApuB,GAAAmK,GAAA,EAAAC,EAAApK,EAAA,QAAA,IAAAkK,GAAA,MAAAI,EAAA,QAAAA,EAAA,SAAA,QAAA,GAAAH,EAAA,MAAAC,GAwCe,GA+CnB/B,KAAK9G,QAAQoD,WAAa,KAlDnB0D,KAAKyjB,QAAAA,cAAsBsC,EACrC/lB,KAAA9G,QAAAC,aAAAA,EApKK6G,KAAA9G,QAAAitB,WAAAA,EAAAnmB,KAAA9G,QAAAqtB,qBAAA,EAsKiBvmB,KAAAwmB,mBACPL,EAAAhtB,EAAZ,IACM6G,KAAA9G,QAAAqtB,qBAAA5qB,KAAAuL,IAAAif,GAAAA,EAAAhtB,GAAA,KAGFgtB,KAAajtB,QAAjButB,gBAAAzmB,KAAA7J,YACIgD,OAAeiD,eAAnB,WAAA,OAAA,GAEAvK,OAAeuK,eAAA,KARIxH,EAAAsD,QAAA,eAAA8H,KAAA9G,SAAA8G,KAAA9G,QAAAutB,cAAA,GAAA,GAAAzmB,KAAA9G,QAAAC,aAAA,CAoEf,GAAwB,YAApB6G,KAAKrF,cApEMqF,KAAA1C,aAAA0C,KAAA7D,UAAA,GAWnB6D,KAAuB1C,aAAvBvG,QA6DY,YA7D2BiJ,KAAA0mB,uBAGlC,IAAAC,EAAA3mB,KAAAvG,cAAA,GA8DD,GAAIktB,EA5EW,OAeH3mB,KAAClH,gBAAS,OAAAnE,EAAAwR,KAAA,kDAAAwgB,GAAArxB,MAAA,SAAAC,GACLoD,GAAAA,GAAiBwhB,EAAjBxhB,CACkCnE,EAAFgvB,gBAAJ,EAmErC,IAnEJ,IAAAoD,EAAA,GAmEaxuB,EAAI,EAAGA,EAAI7C,EAAS2E,SAASnD,OAAQqB,IAlEjC,cAAA7C,EAAA2E,SAAA9B,GAAA+B,MAAA,WACA,IAAA4jB,EAAAxoB,EAAA2E,SAAA9B,GAAAzB,WAAA4D,WAAAssB,EAAAtxB,EAAA2E,SAAAzG,MAAA,SAAA2E,GAAA,MAAA,YAAAA,EAAA+B,MAAA/B,EAAAP,IAAAkmB,KAEAplB,GAASG,EAFT,CAAA,IAAAA,EAAAmhB,EAAA6M,YAAAD,EAAAtxB,EAAA2E,UAIF1F,EAAAsE,EAAAqhB,aAJX4M,EAAAH,EAAAnzB,MAAA,SAAA4yB,GAAA,OAAAA,EAAA7xB,MAAAA,KAyEiBuyB,IAnEMX,EAAvB,CACH5xB,KAAAA,EAqEuBsE,QAASA,EApEDkC,SAAhC,EAEAqqB,MAAA,GACsBuB,EAAA7yB,KAAAgzB,IACgD1Q,EAAYA,OAA7B9gB,EAAA2E,SAAA9B,GAAAzB,WAAA4E,MAAjDwrB,EAAA/rB,UAAAzF,EAAA2E,SAAA9B,GAAAzB,WAAAqE,UAba,GAgBZ+c,EAAA7e,QAAA+N,KAAA2f,EACJ7O,EAAA7e,QAAAY,SAAAvE,EAAAN,KAAA0B,WAAA8E,cAyEGsc,EAAK7e,QAAQmE,iBAAmB9H,EAASN,KAAK0B,WAAWqwB,iBAxElD3B,EAAXnsB,QAAAoD,WAAA/G,EAAAN,KAAA0B,WAAA4E,MArBkBwc,EAAA7e,QAAAkE,cAAA7H,EAAAN,KAAA0B,WAAAswB,iBAAA1xB,EAAAN,KAAA0B,WAAAuwB,kBAsBrBnP,EAAA7e,QAAAc,WAAA+d,EAAA/d,WA2EO+d,EAAKyO,mBA1EAjE,EAATmE,2BAvBkB,OAwBR,SAAAnxB,GACPwiB,EAAAyL,gBAAA,EACSzL,EAAAza,aAAA1I,EAAAY,UAAAD,GACfX,EAAA/B,MAAA,gBAAA0C,EAAAwiB,EAAAza,cA4EOya,EAAKyO,mBA1EAzO,EAAIpf,0BA5CF/D,EAAAsD,QAAA,wCAAAyuB,GAAA3mB,KAAA0mB,yBAlJdjD,CAAAA,IAAAA,uBAAAA,MAAAA,WAkJczjB,KAAAyjB,wBAAAzjB,KAAAyjB,sBAAAsC,MAAA/N,UAAAhY,KAAAyjB,sBAAA,QAlJdA,CAAAA,IAAAA,mBAAAA,MAAAA,WAkMAvqB,IAALiuB,EAA6BV,GAEhBN,EAAaA,KAA1BiB,sBACAC,GAAad,KAAbrtB,QAAAutB,eAAAzmB,KAAA9G,QAAAutB,cAAAY,GAEKb,EAALzyB,KAAKyyB,4CAAAA,OAALa,EAAKb,oBAAAA,OAALxmB,KAAA9G,QAAAutB,cAAAY,EAAKb,kBAGIttB,IAALouB,EAAaf,KAAbgB,mBACHD,GAAAtnB,KAAA9G,QAAAoD,YAAA0D,KAAA9G,QAAAoD,WAAAgrB,GAyFGH,EAAepzB,KAAf,gCAAAuL,OAAoDgoB,EAApD,4CAtFwB,IAAME,EAAN,GAb5BC,GAAA,EAAAC,GAAA,EAAAC,OAAAxwB,EAAA,IAaI,IAAA,IAAAywB,EAAAC,EAAA7nB,KAAA/F,UAAA3C,OAAAC,cAAAkwB,GAAAG,EAAAC,EAAArwB,QAAAC,MAAAgwB,GAAA,EAAA,CAAA,IAAA9uB,EAAAivB,EAAAlwB,MACGiB,EAAAG,SAAAH,EAAAG,QAAAglB,MAAA,IA6FE0J,EAAe7uB,EAASG,QAAQnC,WAAWknB,eAzFxC2J,EAAgB7uB,EAA5BG,QAAAnC,WAAAknB,aAAA,CA2FYhmB,GAAIc,EAASG,QAAQnC,WAAWknB,YAzF3B4I,KAAAA,EAAb3tB,QAAuCI,aAC9ByB,MAAe,EACf2C,MAAe3E,EAAKwD,QAAzB2hB,QAES4I,EAAAA,EAAL5tB,QAAAnC,WAAAknB,aAAAplB,OAAAE,EAAAqC,WAxBZ,MAAArD,GAAA+vB,GAAA,EAAAC,EAAAhwB,EAAA,QAAA,IAAA8vB,GAAA,MAAAI,EAAA,QAAAA,EAAA,SAAA,QAAA,GAAAH,EAAA,MAAAC,GA0BS,IAAA,IAAA9vB,KAAA2vB,EACJA,EAAA3vB,GAAAY,MAAA+uB,EAAA3vB,GAAAimB,OA4FGqJ,EAAepzB,KAAf,yBAAAuL,OAA6CkoB,EAAe3vB,GAAIrD,KAAhE,kBAAA8K,OAAqFkoB,EAAe3vB,GAAIimB,MAAxG,oBAAAxe,OAAgIkoB,EAAe3vB,GAAIY,MAAQ+uB,EAAe3vB,GAAIimB,MAA9K,kBAzFA,IAAK0F,IAAAA,KAAiBxjB,KAAtB0jB,YACA1jB,KAAS0jB,YAAA7mB,GAAAsqB,GAGJnnB,KAAAmnB,eAAAA,IAnOR1D,CAAAA,IAAAA,kBAAAA,MAAAA,WAqOamD,IAAAA,EAAAA,KA+FlB,GAAI5mB,KAAKnG,MAAO,CA9FC,IAAKtD,EAAUhB,EAAS2E,YAAkBxE,EAAIW,YAAA5C,MAAA,SAAA8C,GAAA,OAAAA,EAAAsB,IAAAwhB,EAAAxf,MAAAlD,WAAAqe,gBAAA,KAC3Czf,GAAAA,GAA2C,MAA3CgB,EAAAI,WAA6BC,aAAc,MAAA,MAEC,OAAAoJ,KAAAnJ,gBAAA,MAAcmJ,KAAAnJ,eAAsBknB,WAApCnnB,aAA5C,MACA,aA1Of6sB,CAAAA,IAAAA,cAAAA,MAAAA,WA6OkE,GAAAzjB,KAAAqW,SAAA,OAA/CrW,KAAAqW,SACA,IAAAyR,EAAKf,KAAkBgB,uBACnBhB,EAAAA,KAAgBiB,gBAAGF,GAEfhvB,OAAAA,GACAkC,EAAAA,QAAAA,sBAHeitB,GAIf5C,KAAAA,SAAO4C,EAJXjoB,KAAAqW,UA8GxByR,EAAkB,IAtGEf,EAAAA,QAAAA,gCAA0Be,GAC1Bf,KAAAA,SAAAA,EAA6BxxB,GAChCyK,KAAAqW,UAER5jB,EAAA+D,OAAA6f,UAyGTzhB,EAAIsD,QAAQ,wBAAyBzF,EAAO+D,OAAO6f,UAxGtCnd,KAAAA,SAAe0tB,EAAAA,OAAAA,SACpB5mB,KAAalG,WAGblF,EAAKsE,MAAAA,qEACL8G,KAAK9G,SAAQc,MA0GlBgG,KAAKqW,YA3WPoN,CAAAA,IAAAA,kBAAAA,MAAAA,SAmQYiD,GAnCT,IAAA1mB,KAoCSnJ,iBAAcmJ,KAAAnJ,eAAAF,WAAAC,aACd4sB,OAAAA,KAEL5uB,IAAI/B,EAAM0wB,EAAiBhuB,mBAAe+H,KAAAA,eAA1C3G,WAAAC,cA4GZ,OAAiD,IAA7CkxB,EAAkBxJ,QAAQ2J,GA3GbzB,EACAE,OAzQZjD,CAAAA,IAAAA,uBAAAA,MAAAA,WA6QOvrB,IAAAA,EAAQ,GACfgwB,EAAA,KACJloB,KAAAnG,OAAAmG,KAAAnG,MAAAlD,WAAAuE,cA8GGgtB,EAAaloB,KAAKnG,MAAMlD,WAAWuE,aAAe,MA5GzDtG,EAAAsD,QAAA,iBAAAgwB,EAAAloB,KAAAnG,OALc,IAAAsuB,GAAA,EAAAC,GAAA,EAAAC,OAAAlxB,EAAA,IAhST,IAAA,IAAAmxB,EAAAC,EAAAvoB,KAAA/F,UAAA3C,OAAAC,cAAA4wB,GAAAG,EAAAC,EAAA/wB,QAAAC,MAAA0wB,GAAA,EAAA,CAAA,IAAAxvB,EAAA2vB,EAAA5wB,MAAA,GAAAiB,EAAAG,QAAA,CAAA,IAAA0vB,GAAA,EAAAC,GAAA,EAAAC,OAAAvxB,EAAA,IAySOssB,IAAAA,IAAAA,EAAAA,EAAsBsC,EAAM/N,QAAjC6K,OAAKY,OAAAA,cAAAA,GAAAA,EAAAA,EAAAA,QAAAA,MAAAA,GAAAA,EAAL,CAAA,IAAKA,EAALkF,EAAAjxB,MACK+rB,IAAL4B,EAAA1uB,WAAAuE,aAAA,OAAAmqB,EAAA1uB,WAAA0f,WA1SFuS,EAAAvD,EAAA1uB,WAAA0f,YAAAuS,EAAAvD,EAAA1uB,WAAA0f,UAAA,GA+SE8Q,EAAJ9B,EAAA1uB,WAAA0f,cA/SE,MAAA1e,GAAA8wB,GAAA,EAAAC,EAAA/wB,EAAA,QAAA,IAAA6wB,GAAA,MAAAK,EAAA,QAAAA,EAAA,SAAA,QAAA,GAAAJ,EAAA,MAAAC,MAgSS,MAAA/wB,GAAAywB,GAAA,EAAAC,EAAA1wB,EAAA,QAAA,IAAAwwB,GAAA,MAAAI,EAAA,QAAAA,EAAA,SAAA,QAAA,GAAAH,EAAA,MAAAC,GAmBPlB,OADAE,EAAAA,QAAgB,aAASnuB,GACzBiuB,OAAApc,KAAA6d,GAAAzD,MAAA,SAAAhU,EAAAoU,GAAA,OAAAqD,EAAAzX,GAAAyX,EAAgEvB,QA/R/D5D,CAAAA,IAAAA,sBAAAA,MAAAA,WAmZL,OAAOzjB,KAAK8oB,6BAA6Br2B,EAAOs2B,uBAAwBt2B,EAAOu2B,4BAnZ1EvF,CAAAA,IAAAA,mBAAAA,MAAAA,WAuZL,OAAOzjB,KAAK8oB,6BAA6Br2B,EAAOw2B,oBAAqBx2B,EAAOy2B,yBAvZvEzF,CAAAA,IAAAA,+BAAAA,MAAAA,SA0RU0F,EAAAC,GAAA,MAAA,UAAAppB,KAAArF,aAAAwuB,EAkIJA,IApHiBlvB,YAA5B+F,KAAArF,cAAAyuB,IAAuCA,IAxSlC3F,CAAAA,IAAAA,WAAAA,MAAAA,WAoagB,IAAhB4F,EAAgB1Z,UAAA5Y,OAAA,QAAAI,IAAAwY,UAAA,IAAAA,UAAA,GAxHZ6X,EAAc,GAwBnB,OAvBoC7wB,GAAhC6wB,KAAAA,QAAe7uB,eACPA,EAAAA,KAASG,+CAERuwB,GAHiDrpB,KAAAxL,MAItDspB,EAAOnlB,KAASG,+BAEvBuwB,IA0HIrpB,KAAK+jB,MAnJC/jB,KAAAspB,oBAAAtpB,KAAA+jB,QAAAhoB,EAAAhI,KAAA,iCA0BXyzB,EAAe7uB,KAASG,mCA1BbuwB,IAAArpB,KAAAgG,MAAAhG,KAAAupB,cAAAvpB,KAAAgG,QAAAjK,EAAAhI,KAAA,0BAAAgI,EAAAhI,KAAA,oCAoKS,YAApBiM,KAAKrF,cAxIQ6sB,KAAAA,cACTA,EAAczzB,KAAK0E,sCAEtBuH,KAAAwpB,aACJztB,EAAAhI,KAAA,2CAEiBiM,KAAK0jB,iBACdA,EAAL3vB,KAAsBozB,+CA2IjBnnB,KAAKypB,eAxITtC,EAAiBA,KAAAA,mDApVpBnnB,KAAAnJ,gBAAAmJ,KAAAnJ,eAAAgB,IAAAkE,EAAAhI,KAAA,+CAmeFa,EAAIsD,QAAQ,kBAAmB6D,GA3I/BA,IApUK0nB,CAAAA,IAAAA,gBAAAA,MAAAA,SAqUDzd,GACIzP,MA8IC,wJA9IQkpB,KAAIlpB,KAtUhBktB,CAAAA,IAAAA,sBAAAA,MAAAA,SAyUJiG,GAgJD,OAAO1pB,KAAK2pB,iBAAiBD,GAAa3yB,OAAS,IAzd9C0sB,CAAAA,IAAAA,mBAAAA,MAAAA,SA4UJiG,GAiJD,OAAOA,EAAYjkB,QAAQ,WAAY,MA7dlCge,CAAAA,IAAAA,eAAAA,MAAAA,WApBH,IAAA4F,IAAA1Z,UAAA5Y,OAAA,QAAAI,IAAAwY,UAAA,KAAAA,UAAA,GAAAia,EAAAja,UAAA5Y,OAAA,EAAA4Y,UAAA,QAAAxY,EAAA,GAAA,UAAA6I,KAAArF,cAAAqF,KAAAnG,MAqWOwc,OArWPzhB,EAAAsD,QAAA,8CAqWiB,KAqJnBzF,EAAO8L,WAAW,OAAQyB,KAAKxL,MAlJzBszB,EAAAA,WAAoB,QAAKC,KAAAA,OACzBE,EAAAA,WAAoBD,QAAAA,KAAgBF,OAoJ1Cr1B,EAAO8L,WAAW,YAAayB,KAAKgkB,WAlJhCiE,EAAAA,WAAc,eAAAjoB,KAAAikB,cAET5N,EAAL9X,WAAgB0pB,cAAhBjoB,KAAAwpB,aACA/2B,EAAY4jB,WAAZ,qBAAArW,KAAAnJ,eAAAmJ,KAAAnJ,eAAAgB,GAAA,MACHpF,EAAA8L,WAAA,gBAAAyB,KAAAypB,eAoJDh3B,EAAO8L,WAAW,kBAAmByB,KAAKkkB,iBAlJtC4D,IAAAA,EAAsB,CAClB5vB,MAAQmxB,EAAA,aAAArpB,KAAiC8nB,iBAA7C9nB,KAAA+jB,OACK1N,MAAWyR,EAAAA,qBAAhB9nB,KAAAgG,MACOxR,KAAK6hB,EAAZ,UAAArW,KAAAxL,MAqJoB,YAApBwL,KAAKrF,cAlJEnE,EAAO6f,OAAUrW,KAAAikB,aACpB/rB,EAAQumB,KAAAze,KAAAwpB,YACPnT,EAAiBtQ,MAAQsQ,KAAAA,eAA9BrW,KAAAypB,cAAA/yB,KAAAsJ,KAAAypB,cAAA/yB,KAAAsJ,KAAAypB,cACOI,EAAPlL,SAAA3e,KAAAkkB,gBACH2F,EAAA7U,aAAAhV,KAAAnJ,eAAAmJ,KAAAnJ,eAAAgB,GAAA,MAEGhE,IAAMqhB,EAAA,CACLmB,aAAL5jB,EAAA6T,YACY+P,OAAZgT,EACHS,cAAAT,GAhYKrpB,KAAAhG,aAAAkb,EAAA6U,YAkYUjC,KAAAA,YAER,IAAApuB,EAAA,CACHwb,KAAAA,EAqJGjgB,KAAM,CApJQkF,KAAGopB,SAsJb5sB,WAAY,CArJhBmxB,eAA0BG,EAA1B+B,QAAJnvB,WACWotB,YAAPx1B,EAAAkC,IAAAG,YAAAC,WACHshB,SAAArW,KAAA1E,cAuJW2uB,aAAcL,EAtJ1BM,WAAAlqB,KAAAgkB,WAAAhkB,KAAAuD,0BAAAygB,WA1YE1M,cAAA,CAAA6S,cAAA,CAAAl1B,KAAA,CA8YF4C,GAAA,UAAAmI,KAAArF,YAAAqF,KAAAnG,MAAA0hB,eAAA9oB,EAAAkC,IAAAG,YAAA6K,qBAAA9H,GACAsC,KAAA,mBAEsBN,WAAMlD,CAC3B1B,KAAA+K,KAAA/F,UA0JoBsP,KAAI,SAAA5Q,GAAQ,OAAIA,EAASc,kBAzJ9CnD,QAA8B4xB,SAAAA,GAAY,OAA1C,MAA+CruB,MAN5B+gB,QAAA,CAAA3lB,KAAA,CAoKCkF,KAAM,YApKPxD,WAAAkzB,OAW8B,MAD5C,UAAA7pB,KAAArF,aAAAqF,KAAAnG,QAkKDH,EAAMzE,KAAKqiB,cAAczd,MAAQ,CArKE5E,KAAA,CAAAkF,KAAA,SAAAtC,GAAAmI,KAAAnG,MAAAhC,MAIxBwtB,EAAkCpwB,KAAAqiB,cAAA8S,WAAAn1B,MAAAyE,EAAAzE,KAAAqiB,cAAA8S,WAAAn1B,KAAA8B,OAGxC2C,GAsKL9E,EAAIsD,QAAQ,2CAxKJgwB,QArYPzE,CAAAA,IAAAA,eAAAA,MAAAA,WA0YI,WAAAzjB,KAAArF,cAEJqF,KAAAqW,SAAA,KAZkCrW,KAAArF,YAAA,SAAAqF,KAAAqkB,qBAAA,iBAAA5xB,EAAA8L,WAAA,cAAAyB,KAAArF,aAAAqF,KAAArF,YAAA,cAhYlC8oB,CAAAA,IAAAA,iBAAAA,MAAAA,WAgYkC,aAAAzjB,KAAArF,cAAAqF,KAAAqW,SAAA,KAAArW,KAAArF,YAAA,WAatCqF,KAAAqkB,qBAAA,mBApBkB5xB,EAAA8L,WAAA,cAAAyB,KAAArF,aAAAqF,KAAArF,YAAA,YAzXd8oB,CAAAA,IAAAA,mBAAAA,MAAAA,WAyXc,IAAA4G,EAAArqB,KAAA,OAAAA,KAAA8jB,eAAA9jB,KAAAnG,MAAA0hB,gBAAAjlB,QAAA,SAAA0oB,GAAA,OAAAqL,EAAAxwB,MAAAe,SAAAnH,MAAA,SAAA62B,GAAA,OAAAA,EAAAzyB,IAAAmnB,EAAAnnB,WAzXd4rB,CAAAA,IAAAA,0BAAAA,MAAAA,WAyXc,IAAA8G,EAAAvqB,KAAA,MAAA,YAAAA,KAAArF,YA4NRlI,EAAOkC,IAAIG,YAAY6K,qBAtME,GAA7B9D,EAAY+sB,IAAAA,YAAZlpB,oBAA6B3I,OAAoBtE,EAAMm2B,IAAAA,YAA1BlpB,oBAAA,GACvCM,KAAAnG,MApaKpH,EAAAkC,IAAAG,YAAA4K,oBAAAjM,MAAA,SAAAgL,GAAA,OAAAA,EAAA5G,IAAA0yB,EAAA1wB,MAAA0hB,uBAoaL,IAhZQkI,CAAAA,IAAAA,0BAAAA,MAAAA,WApBH,GAAA,WAAAzjB,KAAArF,YAAA,CAAA,IAAA,IAAA4gB,KAAAvb,KAAA8jB,eAAA,OAAA9jB,KAAA8jB,eA0aavI,GA1ab,OA4aL3mB,EAAA/B,MAAA,wCAAAmN,KAAA8jB,gBA5aK,GAAA,OAAA9jB,KAAA6jB,mBAoBGJ,CAAAA,IAAAA,mBAAAA,MAAAA,WA2mBL,IAAIhrB,EAAQ,EA9MX+xB,GAAA,EAAAC,GAAA,EAAAC,OAAAvzB,EAAA,IACG,IAAA,IAAAwzB,EAAAC,EAAoB5qB,KAApB/F,UAAA3C,OAAAC,cAAAizB,GAAAG,EAAAC,EAAApzB,QAAAC,MAAA+yB,GAAA,EAAkCpB,CAAAA,EAAAA,MAClC9G,aACH7pB,KAHA,MAAAd,GAAA8yB,GAAA,EAAAC,EAAA/yB,EAAA,QAAA,IAAA6yB,GAAA,MAAAI,EAAA,QAAAA,EAAA,SAAA,QAAA,GAAAH,EAAA,MAAAC,GAKJ,OAAAjyB,IAlaQgrB,CAAAA,IAAAA,WAAAA,MAAAA,SApBH5e,GAAA,IAAAgmB,EAAA7qB,KAwbGqpB,IAAgBxkB,EAAA1K,KAAAhG,WAAA,UAmNjB,OAlNQuB,EAAZyC,aAAApE,KAAA,oBAAA8Q,EAAArQ,KAAA,+CAkNW,EAhND,IAAMqI,EAAAuK,EAAA0jB,WAAAjmB,GAMZ,OALH7E,KAAA4jB,OAAA/mB,IAAAmD,KAAA4jB,OAAA/mB,GAAAylB,oBAmNUtiB,KAAK4jB,OAAO/mB,GAjNnBmD,KAAY4jB,OAAA/mB,KACfmD,KAAA4jB,OAAA/mB,GAAA,IAAAsjB,EAAAtjB,EAAAgI,EAAAye,EAAA5Q,QAAA7N,GAAAuC,EAAAsL,QAAA7N,IAoNG7E,KAAK4jB,OAAO/mB,GAAKyjB,OAAOnO,KAAxB,SAAqC,WAnN5B0Y,EAAA5xB,oBAGF+G,KAAA4jB,OAAA/mB,KA/aN4mB,CAAAA,IAAAA,eAAAA,MAAAA,SAkbIxuB,EAAAT,EAAAu2B,GAAA,IAAAC,EAAAhrB,KACJnD,EAAAouB,IAAAh2B,GAGI,GAFR+K,KAAA4jB,OAAA/mB,IAAAmD,KAAA4jB,OAAA/mB,GAAAylB,oBAqNUtiB,KAAK4jB,OAAO/mB,IAnNTmJ,KAAV4d,OAAiB/mB,GAAA,CACN9I,IAAK8Q,EAAA,IAAAqmB,KAAA,CAAAj2B,GAAA,CACTkF,KAAA4wB,EACOxB,aAAc,IAAKvjB,OAE5BnB,EAAArQ,KAAAA,EACJwL,KAAA4jB,OAAA/mB,GAAA,IAAAwjB,EAAAxjB,EAAA5H,EAAAquB,EAAA5Q,QAAA7N,IACJ7E,KAAA4jB,OAAA/mB,GAAAyjB,OAAAnO,KAAA,SAAA,WAsNO6Y,EAAK/xB,mBAnNL8C,OAAAiE,KAAY4jB,OAAA/mB,KAhcf4mB,CAAAA,IAAAA,cAAAA,MAAAA,SAkcS+F,UACNxpB,KAAY4jB,OAAAvrB,EAAAwE,KACfmD,KAAA/F,UAAA+F,KAAA/F,UAAA3D,QAAA,SAAAqC,GAAA,OAAAA,EAAAN,OAAAM,EAAAN,MAAAwE,KAAAxE,EAAAwE,OAwNLmD,KAAK/G,kBA5pBAwqB,CAAAA,IAAAA,iBAAAA,MAAAA,WAgqBL,IAAIhrB,EAAQ,EAzNP0yB,GAAA,EAAAC,GAAA,EAAAC,OAAAl0B,EAAA,IACI,IAAA,IAAAm0B,EAAAC,EAAoBvrB,KAAA/F,UAApB3C,OAAAC,cAAA4zB,GAAAG,EAAAC,EAAA/zB,QAAAC,MAAA0zB,GAAA,EAAoB,CAAAG,EAAA5zB,MACT8zB,YACf/yB,KAHA,MAAAd,GAAAyzB,GAAA,EAAAC,EAAA1zB,EAAA,QAAA,IAAAwzB,GAAA,MAAAI,EAAA,QAAAA,EAAA,SAAA,QAAA,GAAAH,EAAA,MAAAC,GAKGtvB,OAAAtD,IA5cHgrB,CAAAA,IAAAA,UAAAA,MAAAA,SAyqBD/nB,GAAS,IAAA+vB,EAAAzrB,KA1NDtG,EAAAjH,EAAZwT,WAAA,WACOlK,GAAAA,EAAPlE,IAAA6D,EAAOK,CApeLtJ,EAAAkC,IAAAG,YAAA4K,oBAAAjM,MAAA,SAAAgL,GAAA,OAAAA,EAAA5G,IAAA6B,EAAA6hB,mBAweOvb,KAAA0rB,eAEZhyB,EAAA6hB,gBAAA9oB,EAAAkC,IAAAG,YAAA6K,qBAAA9H,IA1eKmI,KAAA2rB,iBAAA3rB,KAAAxL,KAAAkF,EAAAlF,MA4eck1B,KAAAA,KACT1pB,KAAK2pB,MAAAA,EAAAA,cAA8B5yB,KAAnCiP,MACVhG,KAAA+jB,MAAArqB,EAAAgwB,aAAA1pB,KAAA+jB,MA+MgB,IAAA6H,GAAA,EAAAC,GAAA,EAAAC,OAAA30B,EAAA,IA7rBX,IA6rBW,IA7rBX40B,EA6rBW3xB,EAAA,WAAA,IA7rBXzB,EA6rBWozB,EAAAr0B,MA7rBXmF,EAAAlE,EAAAqzB,SAAAP,EAAA7H,OAAA/mB,KAifK6sB,EAAYjkB,OAAQ5I,GAAA,IAAYsmB,EAAvCtmB,EAAAlE,EAAA6K,UAAA7K,EAAA0qB,UAjfE,IAAAvqB,EAAA2yB,EAAA1M,0BAAAtrB,MAAA,SAAAqF,GAAA,OAAAA,EAAAjB,IAAAc,EAAAolB,aAofmC,IAAAjlB,EAAA,MAAA,WAC5B6B,EAAAA,UAAe5G,KAApB,IAAgC+B,EAAa,CACjCL,KAAAA,EACZqD,QAAAA,EACHT,MAAAozB,EAAA7H,OAAA/mB,GAmOO7B,SAAUrC,EAASqC,aA3tBzBixB,EAAAvyB,EAAAO,UAAA3C,OAAAC,cAAAq0B,GAAAG,EAAAE,EAAAz0B,QAAAC,MAAAm0B,GAAA,EAAAxxB,IA6rBW,MAAAzC,GAAAk0B,GAAA,EAAAC,EAAAn0B,EAAA,QAAA,IAAAi0B,GAAA,MAAAK,EAAA,QAAAA,EAAA,SAAA,QAAA,GAAAJ,EAAA,MAAAC,GAjMNvtB,EAAWuB,WAAS,iBACpBvB,KAAAA,qBAzeFklB,EAAAA,IAgfL,OAFAhxB,EAAO8L,KAAW9I,EAClBhD,OAAO8L,KAAAA,EACDsrB;mZCviBtB/3B,IAAI+kB,QAAQ,SAAU,CAClB,MACA,SACIjiB,GAEA,OAAO,IAAA,WACH,SAAAs3B,IANA,IAAZ,IACIrvB,KAKsBoa,gBAAAjX,KAAAksB,GACVt3B,EAAI/B,MAAM,SAAUD,QALhCA,OAGWoN,KAAAnD,GAAAjK,OAAAiK,GACH,IAAcsvB,EAAAnsB,KAAArL,IAAAG,YAAAojB,SAAA,IAAAlY,KAAAgqB,QAAAoC,EAAApsB,KAAAiG,WAAA,WAQV,IAAKmmB,GAAkBA,IAAmBD,EAAgB,CAPhD,IAAV,IAAoBv5B,EAApB,EAAAwF,EAAAi0B,aAAAt1B,OAAAqB,IAAA,CASQ,IAAIyE,EAAMwvB,aAAaxvB,IAAIzE,GART,IAA1ByE,EAA0ByhB,QAAAte,KAAAssB,mBAAA,MACHzvB,aAAnB0vB,WAAA1vB,GAGEsvB,KAAc5tB,WAAYzJ,UAATq3B,GAElBC,KAAAA,YAAkBA,KAAAA,WAAmBD,eACzBnsB,KAAIsG,cACNtG,KAAGqsB,YAAA,CAWV1wB,KAAKkL,SAAShM,SAAS,IAAIiM,OAAO,EAAG,GAV7BwX,KAAQzX,SAAKylB,SAAAA,IAALxlB,OAAZ,EAAA,GACYnL,KAAC4wB,SAAW1vB,SAAxB,IAAAiK,OAAA,EAAA,GACHnL,KAAAkL,SAAAhM,SAAA,IAAAiM,OAAA,EAAA,IACJ7K,KAAA,KAYD+D,KAAKzB,WAAW,cAAeyB,KAAKsG,cA3BzC,OAAA+Q,aAAA6U,EAAA,CAAA,CAAArvB,IAAA,aAAAnF,MAAA,SAmBCmF,EAAmB5H,GAAgB,IAAXgR,IAAW0J,UAAA5Y,OAAA,QAAAI,IAAAwY,UAAA,KAAAA,UAAA,QAatBxY,IAATlC,IAZMqR,EAAV,MAOS/H,aAAWiuB,QAAhBxsB,KAA+BysB,cAA/B5vB,EAAA6vB,GAAAC,KAAAC,UAAA33B,MA3BL,CAAA4H,IAAA,aAAAnF,MAAA,SAsCQmF,GAAoB,IAAf6vB,IAAe/c,UAAA5Y,OAAA,QAAAI,IAAAwY,UAAA,KAAAA,UAAA,GAtC5Bkd,EAAA7sB,KAAAysB,cAAA5vB,EAAA6vB,GAAA,IAAA,IAAAI,EA+BQjwB,aAA0BkwB,QAAAF,GAAA,YAAA11B,IAAA21B,EAYlB,KAVXH,KAAAK,MAAAF,GACH,MAAApuB,GAlCF,OA+CKuuB,QAAQp5B,MAAM,+BAAgCg5B,GAZtCI,QAAZp5B,MAA0B44B,GAC7BJ,aAAAE,WAAAM,GApCE,QAAA,CAAAhwB,IAAA,gBAAAnF,MAAA,SAuCoBmF,GAAmBA,IAAd4vB,IAAc5vB,UAAAA,OAAAA,QAAAA,IAAAA,UAAAA,KAAAA,UAAAA,GAgBtCwvB,aAAaE,WAAWvsB,KAAKysB,cAAc5vB,EAAK6vB,MAvDjD,CAAA7vB,IAAA,gBAAAnF,MAAA,SA0DWmF,GAAoB,IAAf6vB,IAAe/c,UAAA5Y,OAAA,QAAAI,IAAAwY,UAAA,KAAAA,UAAA,GAhBtBmd,OAAS31B,EAAb6I,KAAwBssB,mBAAA,IAAA,IAAAzvB,IA1C7B,CAAAA,IAAA,MAAAnF,MAAA,SA8DCw1B,GAhBE,OADEA,EAAYF,EAAMF,QAAlB,OAAA,IACQ/5B,EAAA,QAAAW,KAAA,QAAAw5B,MA9CbhB,EAAA;aCLfp6B,IAAI+kB,QAAQ,cAAe,CACvB,SADAA,cAOI,SAgBAhR,EACIlB,GAEI,IAASwoB,EAAa,0bAAA7tB,OAcrBzN,OAAAc,kBAdqB,uDAkBlBmZ,MAAKrI,CAFTkB,OAESlB,SACF9K,GACExF,IAAQwF,EAAQ5F,EAACsF,SAAMmL,OAAUrQ,EAAAA,UAAtCg6B,IACcx0B,EAAAA,EAASN,KAAMmL,OAChCnL,EAAAyM,EAAArR,KAAA,iBApBK2Y,EAAczT,EAASyX,aAAe,IAAIA,EAqBlCtE,EAAL,CACKE,EAACvI,EAENwI,EAAA,EACE9Y,MAAK2Y,EACA3Y,OAFP,GAMEiZ,EAAA4D,cACP5D,EAAuB/T,YAAgBA,EADhCA,MAAAmL,UAAArQ,MAAAwF,EAAAN,MAAAmL,UAAAC,OAESpL,YACCA,WAGQM,GAAhByT,EAAA4C,UAAiD,GAAxB3W,EAAMmL,UAN5CsI,EAAA3Y,MAAAwF,EAAAN,MAAAmL,UAAAC,OASYI,EAAAA,OAAclL,EAASG,MAAQ4K,UAAAA,QAE7BoI,EAAGA,MAAKrI,EAAtBpL,MAAAmL,UAAArQ,MACc2Y,EAAK3Y,OAAQ2Y,EAA3BzT,MAAAmL,UAAAC,QArBAqI,EAAKE,GAAKF,EAAK3Y,MAAQ,EAuBd2Y,EAAGhI,GAAAA,EAAZL,OAA0B,EAEnBoI,EAAAnY,KAAA,CACS0Y,QAAAA,GAAAA,OAAY+C,EAAAA,EAAZ/C,KAAAA,OAAY+C,EAAe/C,EAA3BA,KAAAA,OAA2BA,EAAAA,MAA3BA,KAAAA,OAAuCgD,EAAAA,QACtDjc,MAAA2Y,EAAA3Y,MArBGsQ,OAAQqI,EAAKrI,SAwBb2I,EAAYuB,KAAZ,CACYL,aAASlB,EAAYsB,MAAZlK,UAArBnL,MAAA6W,IACYrB,MAAZlV,EAAqByT,MAAYuB,UAAS2B,MAC7C7L,OAAA9K,EAAAN,MAAAmL,UAAAC,SApBE2J,IAAI,CAsBQhB,gBAAYe,GAAAA,OAAAA,EAA3B9U,MAAAmL,UAAArQ,MAAA,EAA2Bga,OAAAA,OAA3BxU,EAAAN,MAAAmL,UAAAC,OAAA,EAA2B0J,MAC3BE,UAAA,cAAA/N,OAAA3G,EAAAN,MAAAmL,UAAArQ,MAAA,EAAA,SAAAmM,OAAA3G,EAAAN,MAAAmL,UAAAC,OAAA,EAAA,eAAAnE,OAAA,GAAA8M,EAAA4C,SAAA,UAIS5C,EAASyD,YAAlBlX,EAAAG,QAAA4K,iBACH,IAAA2L,EAAAvD,EAAA3Y,MAnELmc,EAAAxD,EAAArI,OAvBRqI,EAAA3Y,MAAA2Y,EAAArI,OAuEqC2I,EAAY+C,aAAe/C,EAAYgD,cAExDE,EAAalD,EAAYgD,cAAgBhD,EAAY+C,aAAerD,EAAK3Y,MAEzEkc,EAAYjD,EAAY+C,aAAe/C,EAAYgD,cAAgBtD,EAAKrI,OAEvE2I,EAAYsB,QAAWtB,EAAYuB,QAAWvB,EAAYkB,QAAWlB,EAAYyB,SAClFzB,EAAYsB,QAAU2B,EAAY,EAClCjD,EAAYuB,QAAU2B,EAAa,EACnClD,EAAYkB,OAASlB,EAAYsB,OAAS2B,EAC1CjD,EAAYyB,OAASzB,EAAYuB,OAAS2B,GAG9C,IAAMhD,EAASF,EAAYe,gBAK3B,OAJAtB,EAAI4D,WAAW,SACf5D,EAAI4D,WAAW,UACf5D,EAAInY,KAAK,UAAT,GAAA4L,OAAuBgN,EAAON,EAA9B,KAAA1M,OAAmCgN,EAAOL,EAA1C,KAAA3M,OAA+CgN,EAAOnZ,MAAtD,KAAAmM,OAA+DgN,EAAO7I,SAE/D1Q,EAAE,SAAS8c,OAAOhE,GAAK/G;mZCzF9ChT,IAAI+kB,QAAQ,cAAe,CAAC,WACxB,OAAA,WACI,SAAAzG,IAAc6G,gBAAAjX,KAAAoQ,GACVpQ,KAAK0N,OAAS,KACd1N,KAAK2N,OAAS,KACd3N,KAAKsN,OAAS,KACdtN,KAAK6N,OAAS,KACd7N,KAAKgP,SAAW,EAPhBhP,KAAA6D,YAAgB,KACxB7D,KAAAgQ,YAAA,KAAA,OAAAqH,aAAAjH,EAAA,CAAA,CAAAvT,IAAA,gBAAAnF,MAAA,WA+CQ,IAAUvE,EAAOsQ,EA/CzB,OAkEQtQ,EAASua,KAALva,OAEG,KAENA,EAFM,KADH6Y,EAAS0B,KAAAA,QACN,KAKCjK,EALD,IAQNtQ,EAAAsQ,EAjBoBzD,KAAKmP,aAAenP,KAAKoP,cAmBvC3L,EAAAzD,KAAAoP,cAAApP,KAAAmP,aAAAhc,EAGHA,EAHG6M,KAAAmP,aAAAnP,KAAAoP,cAAA3L,EA9Ef,CAWQuI,EAyEHhM,KAAA0N,OAAA1N,KAAAsN,OApFLtN,KAAA0N,OAAA1N,KAAA0N,OAsFava,EA1ER8Y,EA4EOjM,KAAKgP,OAAWhP,KAAG6N,OACdmB,KAALrB,OAEP3N,KAAA2N,OAAAlK,EA3FLtQ,MAAAA,EAAAsQ,OAAAA,KAAA,CAAA5G,IAAA,SAAAnF,MAAA,WAAAsI,KAAAgP,WAAAhP,KAAAgP,SAkBgB,IACRhP,KAAWgP,SAAUtB,KAnB7B,CAAA7Q,IAAA,IAAAzG,IAAA,WACI,OAAAuF,KAAAuX,IAAAlT,KAAc0N,OAAA1N,KAAAsN,UADlB,CAAAzQ,IAAA,IAAAzG,IAAA,WAGQ,OAAAuF,KAAcuX,IAAdlT,KAAA2N,OAAA3N,KAAA6N,UAHR,CAAAhR,IAAA,QAAAzG,IAAA,WAOQ,OAAKyN,KAALme,IAAmBhiB,KAAnB0N,OAAA1N,KAAAsN,UAPR,CAAAzQ,IAAA,SAAAzG,IAAA,WAAA,OAAAuF,KAAAqmB,IAAAhiB,KAAA2N,OAAA3N,KAAA6N,UAAA,CAAAhR,IAAA,eAAAzG,IAAA,WAgDQjD,OAAK6M,KAAG6D,YAlBgB,aAApB7D,KAAKgQ,YAqBGod,KAAAA,YAASj6B,MAAA6M,KAAA6D,YAAAJ,OAAAzD,KAAA6D,YAAA1Q,MAAA6M,KAAA6D,YAAAJ,OAEpBzD,KAAA6D,YAAA1Q,MAAA6M,KAAA6D,YAAAJ,OAAAzD,KAAA6D,YAAAJ,OAAAzD,KAAA6D,YAAA1Q,MAJQ,OAjDjB,CAAA0J,IAAA,gBAAAzG,IAAA,WAwDS,OAAA4J,KAAA6D,YAGyBsL,aAApBrL,KAAAA,YAlBK9D,KAAK6D,YAAY1Q,MAAQ6M,KAAK6D,YAAYJ,OAASzD,KAAK6D,YAAYJ,OAASzD,KAAK6D,YAAY1Q,MAoB/F6M,KAAG6D,YAAKuL,MAAgBpP,KAAKmP,YAA1B1L,OAATzD,KAAA6D,YAAA1Q,MAAA6M,KAAA6D,YAAAJ,OAvBO,SAtCnB2M,EAAA;mZCDJte,IAAI+kB,QAAQ,YAAa,CACrB,WACA,SACIhhB,GAEA,OAAA,WACI,SAAAw3B,IAAyB,IAAbC,EAAa3d,UAAA5Y,OAAA,QAAAI,IAAAwY,UAAA,GAAAA,UAAA,GAAL,IAAKsH,gBAAAjX,KAAAqtB,GACrBrtB,KAAKutB,QAAU,KAPnBvtB,KAAAstB,MACRA,EAII,OAAAjW,aAAAgW,EAAA,CAAA,CAAAxwB,IAAA,UAAAnF,MAAA,SAAA81B,GAAA,IAAAzV,EAAA/X,KAAAA,KAAAutB,SACI13B,EAAyB8vB,OAAA3lB,KAAAutB,SAQrBvtB,KAAKutB,QAAU13B,GAAS,WARHkiB,EAAAwV,QAAA,KAUjBC,MATCD,KAAUD,WAFvBD,EAAA;aCLRv7B,IAAI+kB,QAAQ,YAAa,CACrB,QADAA,SAKU4W,GAEAC,IAAAA,EAAa,0BACbC,EAAiB,0GACjBC,EAAqB,4EACrBC,EAAa,uCACbC,EAAa,uEACbC,EAAiB,8BACjBC,EAAqB,8BACrBC,EAAkB,2BAClBC,EAAiB,gEACjBC,EAAqB,qBAEpBD,EAAA,qBAAAC,EACQz5B,0BAEPA,MAAO,CACPA,UADO,SACUA,GAmBT,OARG05B,GADDA,GADI15B,GADJA,GADAA,GADAA,GADAA,GADAA,GADAA,GADAA,GADAA,EAAQ+Q,EAAQooB,QAAhBH,EAAV,WAC0BI,QAAhBH,EAAV,gBAC0BK,QAAAA,EAAoB,oBACpBC,QAAAA,EAAiB,WACjBC,QAAAA,EAAgB,WAChBH,QAAAA,EAA1B,mBAC0BI,QAAAA,EAAoB,gBACpBE,QAAhBH,EAA4BI,eACrB7oB,QAAgBgoB,EAA7B,MACyBhoB,QAAQynB,EAAjC,mBACAznB,QAAA4oB,GAAA,SAAAC,GAHJ,IAAApB,EAAAoB,EAAA7oB,QAAAgoB,EAAA,IAZD,OAkB0B/4B,EAAzB+Q,QAAAynB,EAAA,aAKQqB,EAAAC,YAAA95B,IAGAu4B,OAvBD,SAuBSp5B,EAAMA,GACjB,GAAA,iBAAAA,EACJ,IAJOA,EAAQ84B,KAAKC,UAAU/4B,GAMhB,MAAA6K,GACJuuB,QADIp5B,MAAA,4BAAAA,GAKlBC,UAAAC,KAAA,CAnCLyE,MAAA,kBAlBRi2B,OAAAC,EAAA,IAAA1uB,KAAA2uB,UAAA96B,GAmDoB+6B,MAAOF,EAAM,IAAM76B;mZCnDvC/B,IAAI+kB,QAAQ,UAAW,CACnB,MACA,MACA,SACIjiB,EACAiX,GAEA,OAAA,WAAA,SAAAgjB,IAAA5X,gBAAAjX,KAAA6uB,GAAA,OAAAxX,aAAAwX,EAAA,KAAA,CAAA,CAAAhyB,IAAA,UAAAnF,MAAA,SANJmZ,EADmBie,EAIfl6B,EAEFm6B,GAAA,IAAAC,EAAArf,UAAA5Y,OAAA,QAAAI,IAAAwY,UAAA,GAAAA,UAAA,GAAA,SACE,GAAA/a,EAAAsD,QAAA,WAAA2Y,EAAAie,EAAAG,EAAAF,EAAAC,GAAAD,GAAAA,EAAAh4B,OAAA,CAAA,IAAA8Z,EAQY,OARZjc,EAAAf,MAAA,6BAQmB,GARnB,KAAAgd,EAAAqe,YAAAre,EAAAse,YAAAte,EAC4Bie,YAapB,IAAI7f,EAAU,EAXC8f,UAAXC,EACA/f,EAAA6f,EAAA37B,MAAA,EACH,QAAA67B,EAaG/f,EAAU,EAZA,SAAA+f,IACNn7B,EAAMi7B,EAAA37B,OAEb,IAAA2b,EAAA,EAcKsgB,EAAoBN,EAAYrrB,OAbtC7O,EAAOic,QAAQqe,kBAAYjgB,EAAAH,GAiB3B,IAhBI+B,IAAQse,EAAAA,GACXE,EAAA,IAeQj3B,EAAI,EAAGA,EAAI22B,EAAMh4B,OAAQqB,IAAK,CAbnC6W,IAAUqgB,EAAdpvB,SAAAqvB,gBAAA,6BAAA,QAeQC,EAAWT,EAAM32B,IAAM,IAdtBxD,EAAIsD,QAAb,WAAuBs3B,EAAAV,EAAA7f,EAAAH,GACZwgB,EAAGR,YAAAU,EACPF,EAAIN,aAAiB,QAAA,oBAAA52B,EAAA,IACjBk3B,EAAPG,aAAA,IAAAX,EAAA9iB,EAAAiD,GACGqgB,EAAIN,aAAJ,IAAsBF,EAAA7iB,EAAA6C,GAClBwgB,EAAGR,aAAY37B,QAAtB,cAAAwI,KAAAuX,IAAA+b,EAAAG,EAAAL,EAAAh4B,QAAA,MACH24B,EAAA37B,KAAAu7B,GAgBGze,EAAQhB,OAAOyf,GAffxgB,IAAUuF,EAAdlM,SAAAwnB,iBAAAL,GAAAjb,UAEInc,EAAQyD,KAAZuX,IAA+BjE,EAASH,GAEpCugB,IADK,IAATva,EAAAjJ,EAAA+jB,QAAAN,GACexa,EAAGrR,OAAlB2rB,EAAAL,EAAAh4B,QAAA+d,EAAA3hB,MAAA27B,EAAA37B,OAAA,CAGgB,GAcRkhB,IAhBKib,EAAIvoB,MAAGgoB,SAAc32B,EAAK,KACxB8H,EAASqvB,KAAAA,IAATF,EAAyBhb,GACrB0a,GAAY,EAAA,CACfn6B,EAAAsD,QAAYs3B,yBACxB,MAEKC,EAAa5jB,EAAlB+jB,QAAuBd,GAGjB/6B,GAAN+gB,EAAArR,OAEI4Q,IAAAA,IAAQjc,EAAG+P,EAAAA,EAASwnB,EAAAA,OAAAA,IAExBN,EAAc1zB,GAAAA,MAAS0zB,SAATA,EAAd,KAkBJ,IAAIQ,EAAahkB,EAAI+jB,QAAQ/e,GAdrBye,OAFJze,EAAWpN,MAAJ4J,UAAP,gBAAA/N,OAA8CvI,EAAa0M,OAASqrB,EAAAA,EAApErrB,OAAuF,EAAvF,OACI4Q,EAAQyb,cAAAjf,GACH9J,CACLsoB,MAAAA,EAkBJA,YAAAA,MA/DZ,CAAAxyB,IAAA,gBAAAnF,MAAA,SAiDiBmZ,GACDiE,IAkBR,IAAM4a,EAAQ7e,EAAQkf,iBAAiB,QAlBrBH,EAAAA,EAAQN,EAAZI,EAAN34B,OAAAqB,IAAA,CACH,IAAA43B,EAAAnkB,EAAA+jB,QAAAF,EAAAt3B,EAAA,IAoBSyT,EAAI+jB,QAAQF,EAAMt3B,IAlB5B6T,GAAA+jB,EAAA/jB,EAAA+jB,EAAAvsB,QACH,IAoBOisB,EAAMt3B,GAAGq3B,aAAa,IAAKO,EAAY/jB,EAAI+jB,EAAYvsB,OAAS,SA1EhForB,EAAA;aCPR/8B,IAAI+kB,QAAQ,eAAgB,CACxB,SADAA,SAKIhR,GAEUqJ,SAAMvW,EAAes3B,EAAAA,GAE3B,IAAArqB,EAAAC,EAAAgB,SA4CHqI,EAAAvW,EAAAN,MAAA43B,qBAAAt3B,EAAAN,MAAAoM,SAEM,MAAA,4DAAAnF,OAEyB8iB,EAAAA,MAFzB,KAAA9iB,OAEQkF,EACKf,OAHb,uQAAAnE,OAQSsG,EART,8EAAAtG,OAAAkF,EAAA3S,OAAAma,EAAA,0CAAA1M,OAAAkF,EAAA3S,OAYa8G,EAZb,8CAAA2G,OAa0BkF,EAAA3S,OAAAsB,MAb1B,+CAAAmM,OAcKkF,EAAA3S,OAAA4R,OAdL,oUAAAnE,OAAAkF,EAAAf,OAAA,0CAAAnE,OAwBCkF,EAAArR,MAxBD,+CAAAmM,OAyBYkF,EAAA0K,IAzBZ,2GAAA5P,OA0BoCpM,EA1BpC,oMAAAoM,OAiC6BzN,EAAY2S,SAAArR,MAjCzC,2CAAAmM,OAkCkCnM,EAAjC6F,SAAAyK,OAlCD,+CAAAnE,OAmCmCmE,EAnCnC,6NAAAnE,OAyCC3G,EAAAK,SAAAgT,EAzCD,QAAA1M,OAyCC3G,EAAAK,SAAAiT,EAzCD,cAAA3M,OAyCC3G,EAAAK,SAAA6Q,MAzCD,aAAAvK,OAyCC3G,EAAAK,SAAAuW,OAzCD,2IAiDKpc,MAAK,CACLsQ,UADK,SACIysB,GACZ,OAAAv3B,EAAAG,QAAAspB,cAhDI9rB,QAAO,SAAAgc,GAAG,QAAMA,EAAI/N,SAASC,SAkD3B+E,KAAA,SAAA+I,GAAA,OAAAA,EAAA/N,SAAAC,MAAAuN,WAAAO,EAAA/N,SAAAC,MAAAf,OAAA6O,EAAA/N,SAAAC,MAAArR,MAAAmf,EAAA/N,SAAAC,MAAAwL,YAAAsC,EAAA/N,SAAAC,MAAAuN,WAAA,WAAA,YAAAO,EAAA/N,SAAAC,MAAA0K,IAAAoD,EAAA3b,WAAA6M,UAAA8O,EAAA/N,SAAAC,UArDRgN,gBAiDU,SAjDV7Y,EAAAw3B,GAAAx3B,EA+DKA,WACWK,EAAfA,SAAyB,IA/CzB,IAAMwX,EAASxQ,KAAKgS,UAAUrZ,GAmDhBqX,EAAKwB,GAAnB7Y,EAAAK,SAAAgX,aAAArX,EAAAN,MAAA2X,aAAArX,EAAAN,MAAA+3B,iBAEMz3B,OAASK,EAAfvF,MAA2B,SAAA+Q,GAAA,OAAAA,EAAAwL,cAAAA,MAAAQ,EAAA,IAIvB7X,gBAzBK,SAyBLkT,EAAsB6F,GACd,IAAC1Y,EAAS7F,EAAlB0Y,GAA0B6F,QAKjB,OAJDpB,EAACtX,KAASyK,CAAAA,QAAAA,GAAAA,OAAiBe,EAACf,OAApCuI,EAAkBvI,KAAAA,OAAlBe,EAAA3S,OAAAoa,EAAkBxI,KAAAA,OAAlBe,EAAA3S,OAAAsB,MAAkBsQ,KAAAA,OAAlBe,EAAA3S,OAAA4R,UACQ6M,EAACtX,KAAS6Q,wBAAlB3W,SAAA0c,SAGYygB,EAAAA,SAAe13B,OAAD2X,GAAAxL,QAG1BnM,iBAlCK,SAkCL6L,EAAuBnM,GACnB2X,IAAWsgB,EAAQve,EAAalgB,OAAAma,EAAaxH,EAAA3S,OAAAsB,MAAA,EADjDo9B,EAAA/rB,EAAA3S,OAAAoa,EAAAzH,EAAA3S,OAAA4R,OAAA,EAGA+sB,EAAAhsB,EAAA3S,OAAAsB,MACH+8B,EAAA1rB,EAAA3S,OAAA4R,OAnDKgtB,EAAcD,EAAcN,EAsDrC/8B,EAAA,EA1FLsQ,EAAA,EAyCcitB,EAAar4B,EAAMlF,OAASkF,EAAMqoB,WAClCiQ,EAAct4B,EAAMoL,QAAUpL,EAAMsoB,YAW1C,OARI8P,EAFeC,EAAaC,GAG5Bx9B,EAAQq9B,EACR/sB,EAAU+sB,EAAcE,EAAcC,IAEtCx9B,EAAS+8B,EAAeS,EAAeD,EACvCjtB,EAASysB,GAGN,CACH/8B,MAAAA,EACAsQ,OAAAA,EACAoG,MAAO,EACP0F,OAAQ,EACRvD,EAAGskB,EAAiBn9B,EAAQ,EAC5B8Y,EAAGskB,EAAiB9sB,EAAS,IAIrCkB,OAda,SAcLhM,GACEA,EAASK,WACXL,EAASK,SAAW,IAGxB,IAAMwL,EAAQxE,KAAKwR,gBAAgB7Y,GAEnC,IAAMA,EAASK,SAASgT,EAAG,CACvB,IAAM0F,EAAW1R,KAAKuS,iBAAiB/N,EAAO7L,EAASN,OAEvDM,EAASK,SAASgT,EAAI0F,EAAS1F,EAC/BrT,EAASK,SAASiT,EAAIyF,EAASzF,EAC/BtT,EAASK,SAAS7F,MAAQue,EAASve,MACnCwF,EAASK,SAASyK,OAASiO,EAASjO,OACpC9K,EAASK,SAAS6Q,MAAQ6H,EAAS7H,MACnClR,EAASK,SAASuW,OAASmC,EAASnC,OAEpC,IAAM1D,EAAMwkB,EAAe13B,EAAU6L,GAMrC,OALA7L,EAASkT,IAAM7L,KAAK4R,gBAAgB/F,EAAKrH,GAEzC7L,EAASyT,YAAc,CACnB4D,YAAaxL,EAAMuN,WAAa,WAAa,aAE1ClG,EAGX,OAAOwkB,EAAe13B,EAAU6L;mZChJhD1S,IAAI+kB,QAAQ,MAAO,CACf,MACA,SACIjiB,GAEA,OAAO,IAAA,WACH,SAAAg8B,IAAc3Z,gBAAAjX,KAAA4wB,GACV5wB,KAAK/K,KAAO,GAFb,OAAAoiB,aAAAuZ,EAAA,CAAA,CAAA/zB,IAAA,OAAAnF,MAAA,SAAAzC,GAAA+K,KAAA/K,KAAAlB,KAAAkB,GACHnB,UAAcC,KAAAkB,GAAAL,EAAAsD,QAAA,YAAA8H,KAAA/K,KAAA8B,OAAAjD,UAAAiD,YADX65B,EAAA;kxBCLf9+B,IAAI+kB,QAAQ,gBAAiB,CACzB,KACA,aACA,MACA,SACA,MACA,MACA,SACA,SACI3kB,EACAwD,EACAf,EAXJkiB,EAiBI9gB,EAAOnB,EAAAi8B,GACW,OAAA,IAAA,WAAd,SAAAC,IAAc7Z,gBAAAjX,KAAA8wB,GACLC,KAAUA,QAAf,GACKC,KAAAA,eAAL,EACKC,KAALA,WAAsBC,EAAAA,gBAHZ,IAAAC,EAAAC,EAAAC,EAAA,OAAAha,aAAAyZ,EAAA,CAAA,CAAAj0B,IAAA,UAAAnF,MAAA,SADXmN,GAAA,IAAAkhB,EAAA7zB,EAAA6zB,QAAAzF,EAOKzb,CACU3S,KAAG6zB,EACLvF,SAAG,KAAAnoB,MAAA,KAED8Z,KAFC4T,EAAAC,QAGJD,MAHIA,GAOVgL,OAFI/wB,KAAE+lB,QAAAA,KAAAA,GALX/lB,KAAAsxB,cAOav9B,IAfH,CAAA8I,IAAA,cAAAnF,MAAA,WAkBb,IAAAqgB,EAAA/X,KAnBE,GAAApL,EAAAsD,QAAA,eAAA8H,KAAA+wB,QAAA/wB,KAAAgxB,eAAAv+B,EAAA8+B,gBAAAvxB,KAAA+wB,QAAAh6B,OAAA,GAAAiJ,KAAAgxB,eAAAv+B,EAAA8+B,eAAA,CAAA,IAAAjR,EAAAtgB,KAqBW+wB,QAAAS,QAAAxxB,KAAAgxB,iBAKNlwB,YAAW,WAJHiX,EAAAuI,OAAgBA,KAMC,GAAtBtgB,KAAKgxB,mBA3BF,CAAAn0B,IAAA,SAAAnF,OAAA25B,EAAAlW,kBAAAC,mBAAAC,MAAA,SAAAoW,EAyBKnR,GAzBL,IAAAzb,EAAA6sB,EAAAC,EAAAC,EAAA/0B,EAAAwc,EAAArZ,KAAA,OAAAob,mBAAAM,MAAA,SAAAmW,GAAA,OAAA,OAAAA,EAAAjW,KAAAiW,EAAAr6B,MAAA,KAAA,EAAA,OA0BF8oB,EAAKA,SAAL,EACDA,EAAK0Q,SAAL,EACN1Q,EAAAwR,UAAA,IAAAjzB,KA7BFjK,EAAAsD,QAAA,sBAAA2M,GAAAA,EAAA,KACWgtB,EAAAjW,KAAA,EAAAiW,EAAAr6B,KAAA,EADXq5B,EAAAkB,kBAAAzR,EAAAzb,MACW,KAAA,EADXA,EACWgtB,EAAA9V,KAAA8V,EAAAr6B,KAAA,GAAA,MAAA,KAAA,GAAA,OAAAq6B,EAAAjW,KAAA,GAAAiW,EAAAG,GAAAH,EAAA,MAAA,GADX7xB,KAAAiyB,kBAAA,2BAAAJ,EAAAG,GAAA1R,EAAAzb,EAAA,MACWgtB,EAAA5V,OAAA,UAAA,KAAA,GAAA,OADXyV,EAAA,KACWG,EAAAjW,KAAA,GAAAiW,EAAAr6B,KAAA,GADXwI,KAAAixB,WACW,KAAA,GADXS,EACWG,EAAA9V,KAAA8V,EAAAr6B,KAAA,GAAA,MAAA,KAAA,GAAA,OAAAq6B,EAAAjW,KAAA,GAAAiW,EAAAK,GAAAL,EAAA,MAAA,IAiCVvR,KAAM2R,kBAAN,4BAAA3R,EAAAA,GAAAA,EAAAzb,EAAA,MAjCUgtB,EAAA5V,OAAA,UAAA,KAAA,GAAA,OADX0V,EAAA,KACWE,EAAAjW,KAAA,GAAAiW,EAAAr6B,KAAA,GAwCcu6B,KAAAA,QAAAA,GAxCd,KAAA,GADXJ,EACWE,EAAA9V,KAAA8V,EAAAr6B,KAAA,GAAA,MAAA,KAAA,GAAA,OAAAq6B,EAAAjW,KAAA,GAAAiW,EAAAM,GAAAN,EAAA,MAAA,IADX7xB,KAAAiyB,kBAAA,0BAAAJ,EAAAM,GAAA7R,EAAAzb,EAAA,MACWgtB,EAAA5V,OAAA,UAAA,KAAA,GA8DJ2V,EAAY/sB,EAAKrQ,KAAKiR,QAAQ,OAAQ,IA/D7C5I,EACW,GAAAyC,OADXoyB,EAAA/9B,UACW2L,OADXqyB,EACW,KAAAryB,OADXuF,EAAAd,KACW,KAAAzE,OADXsyB,GAAAtR,EAAA8R,kBAAA,GAAA9yB,OAAAqyB,EAAA,KAAAryB,OAAAuF,EAAAd,KAAA,KAAAzE,OAAAsyB,GAAAtR,EAAA+R,WAAA,WAAAX,EAAAY,OAAA,yBAAAz1B,EA2CKyjB,EAAK2R,IAAAA,EA0BTr9B,EAAIsD,QAAQ,YAAa2M,GArE1BgsB,EAAAvQ,OAAA,CAAA9tB,IA+CU,WA/CVk/B,EAAAY,OAAA,oCAAAxa,OAAA,OAAA7iB,KAAA,CAAA4H,IAiDgByjB,EAAK2Q,IA0BZsB,eAAgBb,EAAGc,YA3E5BC,OAAAf,EAAAe,OAAAC,UAAAhB,EAAAgB,UAAAC,IAAA,cAAAC,eAAA,IAAA/tB,EAAA1K,KAAA0K,EAAA1K,KAAA,2BAgFS04B,SAAUvS,EAAO8R,kBAhF1B59B,KAAA,GAAAqQ,KAAAA,KAmDKvP,KAnDL,WAAA,IAAAqL,EAAAwa,kBAAAC,mBAAAC,MAmDU4W,SAAAA,EAAAA,GAAAA,OAAAA,mBAAAA,MAAAA,SAAAA,GAAAA,OAAAA,OAAAA,EAAAA,KAAAA,EAAAA,MAAAA,KAAAA,EAAAA,OAnDVr9B,EAAAsD,QAAA,kBAAA3C,GAsFK+qB,EAAOwS,QAAUv9B,EAtFtB+qB,EAAAyS,QAAA,IAAAl0B,KAmDUozB,EAAAA,KAAAA,EAAAA,EAAAA,KAAAA,EAnDV5Y,EAAA2Z,SAAA1S,EAAAA,EAAA+R,YAmDUJ,KAAAA,EAAAA,EAAAA,KAAAA,GAAAA,MAAAA,KAAAA,EAAAA,OAAAA,EAAAA,KAAAA,EAAAA,EAAAA,GAAAA,EAAAA,MAAAA,GAyCD5Y,EAAK4Y,kBAAkB,uBAAvBtW,EAAAqW,GAAsD1R,EAAQzb,EAAM,MAzCnEotB,EAAAA,OAAAA,UAAAA,KAAAA,GAnDVr9B,EAAAsD,QAAA,2BAAAooB,EAAAyF,MAAA/N,UAAAqB,EAAA2X,iBAAA3X,EAAAiY,cA2DKv7B,EAAKk8B,KAAAA,CA3DVz5B,MAAA,iBAuGSuF,KAAMuiB,EAAOyS,QAAUzS,EAAOwR,YApD7BG,KAAAA,GAAAA,IAAAA,MAAAA,OAAAA,EAAAA,UAAAA,EAAAA,KAAAA,CAAAA,CAAAA,EAAAA,SAnDV,OAAA,SAAAgB,GAAA,OAAAtyB,EAAAyK,MAAApL,KAAA2P,YAAA,IA+DOiiB,SAAAA,GACA/0B,EAhEPo1B,kBAgEmBt+B,iBAhEnB,KAAA2sB,EAgEsCzb,EAhEtCtP,MAiEC+qB,SAAAA,GACAA,EAAO+R,SAAPh/B,EAAoB6/B,OAAA7/B,EAAgBi/B,SAjE1B,KAAA,GAAA,IAAA,MAAA,OAAAT,EAAA3V,UAAAuV,EAAAzxB,KAAA,CAAA,CAAA,EAAA,IAAA,CAAA,GAAA,IAAA,CAAA,GAAA,UAAA,SAAAmc,GAAA,OAAAkV,EAAAjmB,MAAApL,KAAA2P,cAAA,CAAA9S,IAAA,oBAAAnF,MAAA,SAsEDhD,EAAag9B,EAAGY,EAASztB,EAAAtP,GAC9BuiB,EAAAA,MAAM,yBAFIpjB,EAAAb,EAAAysB,EAAAzb,EAAAtP,GAGVN,EAAAA,MAAM,yBAAAP,EAAAb,EAAAysB,EAAAzjB,IAAAyjB,EAAAzjB,IAAA,gBAAAgI,GAAAA,EAAA1K,KAAA0K,EAAA1K,KAAA,uBACF0C,EAAAA,MAAKyjB,4BADHzb,GAAAA,EAAArQ,KAAAqQ,EAAArQ,KAAA,qBAAA,iCAEF+9B,EAAAA,aAAkBx+B,KAACy+B,4BAFjB3tB,GAAAA,EAAArQ,KAAAqQ,EAAArQ,KAAA,qBAAA,kCAGFi+B,EAAAA,MAAMxa,SACNya,KAAAA,iBACAC,KAAAA,gBA7EE,CAAA91B,IAAA,UAAAnF,OAAA05B,EAAAjW,kBAAAC,mBAAAC,MAAA,SAAA8X,EAgFEtuB,GAhFF,OAAAuW,mBAAAM,MAAA,SAAA0X,GAAA,OAAA,OAAAA,EAAAxX,KAAAwX,EAAA57B,MAAA,KAAA,EAAA,OAAA47B,EAAAnX,OAAA,SAiFFpX,GAAI,SAAAmT,EAAEnT,GATJ,IAAAwuB,EAAA,IAAAC,WAHVD,EAAAz/B,QAAA,WAAAqkB,EAAA,wBAAAob,EAAAE,QAAA,WAAAtb,EAAA,0BAcQob,EAAAG,UAAA,SAAAh7B,GAAAA,EAAAmJ,OAAA8xB,YAAAH,WAAAI,MAAA1b,EAAAiT,IAAAzyB,EAAAmJ,OAAAjF,UAEJ4jB,EAAAA,kBAAAzb,OArFM,KAAA,EAAA,IAAA,MAAA,OAAAuuB,EAAAlX,UAAAiX,OAAA,SAAAQ,GAAA,OAAAvC,EAAAhmB,MAAApL,KAAA2P,cAAA,CAAA9S,IAAA,WAAAnF,OAAAy5B,EAAAhW,kBAAAC,mBAAAC,MAAA,SAAAuY,EAmFFtT,EAAAuT,GAnFE,OAAAzY,mBAAAM,MAAA,SAAAoY,GAAA,OAAA,OAAAA,EAAAlY,KAAAkY,EAAAt8B,MAAA,KAAA,EAAA,OAAAs8B,EAAA7X,OAAA,SA4IHtnB,EAAIwR,KAAK,iBAAkB,CAzD1B+O,KAAA,CAAA6e,aAAAthC,EAAA6T,aA6DJrR,KAAM,CA7DFkF,KAAA,SAAAxD,WAAA,CAAAq9B,aAAAH,MAmELv+B,MAAK,SAACC,GAnED+qB,EAAAjoB,MAAA9C,MAnFE,KAAA,EAAA,IAAA,MAAA,OAAAu+B,EAAA5X,UAAA0X,OAAA,SAAAK,EAAAC,GAAA,OAAA/C,EAAA/lB,MAAApL,KAAA2P,gBAAAmhB,EAAA;mZClB1Bh/B,IAAI+kB,QAAQ,SAAU,CAClB,WAEI,IAAMsd,EAAoB,CACtBC,GAAI,MACJC,GAAI,MACJC,GAAI,MACJC,GAAI,MAPJC,GAAA,MAGEL,GAAAA,MACEM,GADkB,MAElBC,GAFkB,MAGlBC,GAHkB,MAIlBC,GAJkB,MAKlBC,GALkB,MAMlBC,GANkB,MAOlBC,GAPkB,MAQlBC,GARkB,MASlBC,GATkB,MAUlBC,GAVkB,MAWlBC,GAXkB,MAYlBC,GAZkB,MAalBC,GAbkB,MAclBC,GAdkB,MAelBC,GAfkB,MAgBlBC,GAhBkB,MAiBlBC,GAjBkB,MAkBlBC,GAlBkB,MAmBlBC,GAnBkB,MAoBlBC,GApBkB,MAqBlBC,GArBkB,MAsBlBC,GAtBkB,MAuBlBC,GAvBkB,MAwBlBC,GAxBkB,MAyBlBC,GAzBkB,MA0BlBC,GA1BkB,MA2BlBC,GA3BkB,MA4BlBC,GA5BkB,MA6BlBC,GA7BkB,MA8BlBC,GA9BkB,MA+BlBC,GA/BkB,MAgClBC,GAhCkB,MAiClBC,GAjCkB,MAkClBC,GAlCkB,MAmClBC,GAnCkB,MAoClBC,GApCkB,MAqClBC,GArCkB,MAsClBC,GAtCkB,MAuClBC,GAvCkB,MAwClBC,GAxCkB,MAyClBC,GAzCkB,MA0ClBC,GA1CkB,MA2ClBC,GA3CkB,MA4ClBC,GA5CkB,MA6ClBC,GA7CkB,MA8ClBC,GA9CkB,MA+ClBC,GA/CkB,MAgDlBC,GAhDkB,MAiDlBC,GAjDkB,MAkDlBC,GAlDkB,MAmDlBC,GAnDkB,MAoDlBC,GApDkB,MAqDlBC,GArDkB,MAsDlBC,GAtDkB,MAuDlBC,GAvDkB,MAwDlBC,GAxDkB,MAyDlBC,GAzDkB,MA0DlBC,GA1DkB,MA2DlBC,GA3DkB,MA4DlBC,GA5DkB,MA6DlBC,GA7DkB,MA8DlBC,GA9DkB,MA+DlBC,GA/DkB,MAgElBC,GAhEkB,MAiElBC,GAjEkB,MAkElBC,GAlEkB,MAmElBC,GAnEkB,MAoElBC,GApEkB,MAqElBC,GArEkB,MAsElBC,GAtEkB,MAuElBC,GAvEkB,MAwElBC,GAxEkB,MAyElBC,GAzEkB,MA0ElBC,GA1EkB,MA2ElBC,GA3EkB,MA4ElBC,GA5EkB,MA6ElBC,GA7EkB,MA8ElBC,GA9EkB,MA+ElBC,GA/EkB,MAgFlBC,GAhFkB,MAiFlBC,GAjFkB,MAkFlBC,GAlFkB,MAmFlBC,GAnFkB,MAoFlBC,GApFkB,MAqFlBC,GArFkB,MAsFlBC,GAtFkB,MAuFlBC,GAvFkB,MAwFlBC,GAxFkB,MAyFlBC,GAzFkB,MA0FlBC,GA1FkB,MA2FlBC,GA3FkB,MA4FlBC,GA5FkB,MA6FlBC,GA7FkB,MA8FlBC,GA9FkB,MA+FlBC,GA/FkB,MAgGlBC,GAhGkB,MAiGlBC,GAjGkB,MAkGlBC,GAlGkB,MAmGlBC,GAnGkB,MAoGlBC,GApGkB,MAqGlBC,GArGkB,MAsGlBC,GAtGkB,MAuGlBC,GAvGkB,MAwGlBC,GAxGkB,MAyGlBC,GAzGkB,MA0GlBC,GA1GkB,MA2GlBC,GA3GkB,MA4GlBC,GA5GkB,MA6GlBC,GA7GkB,MA8GlBC,GA9GkB,MA+GlBC,GA/GkB,MAgHlBC,GAhHkB,MAiHlBC,GAjHkB,MAkHlBC,GAlHkB,MAmHlBC,GAnHkB,MAoHlBC,GApHkB,MAqHlBC,GArHkB,MAsHlBC,GAtHkB,MAuHlBC,GAvHkB,MAwHlBC,GAxHkB,MAyHlBC,GAzHkB,MA0HlBC,GA1HkB,MA2HlBC,GA3HkB,MA4HlBC,GA5HkB,MA6HlBC,GA7HkB,MA8HlBC,GA9HkB,MA+HlBC,GA/HkB,MAgIlBC,GAhIkB,MAiIlBC,GAjIkB,MAkIlBC,GAlIkB,MAmIlBC,GAnIkB,MAoIlBC,GApIkB,MAqIlBC,GArIkB,MAsIlBC,GAtIkB,MAuIlBC,GAvIkB,MAwIlBC,GAxIkB,MAyIlBC,GAzIkB,MA0IlBC,GA1IkB,MA2IlBC,GA3IkB,MA4IlBC,GA5IkB,MA6IlBC,GA7IkB,MA8IlBC,GA9IkB,MA+IlBC,GA/IkB,MAgJlBC,GAhJkB,MAiJlBC,GAjJkB,MAkJlBC,GAlJkB,MAmJlBC,GAnJkB,MAoJlBC,GApJkB,MAqJlBC,GArJkB,MAsJlBC,GAtJkB,MAuJlBC,GAvJkB,MAwJlBC,GAxJkB,MAyJlBC,GAzJkB,MA0JlBC,GA1JkB,MA2JlBC,GA3JkB,MA4JlBC,GA5JkB,MA6JlBC,GA7JkB,MA8JlBC,GA9JkB,MA+JlBC,GA/JkB,MAgKlBC,GAhKkB,MAiKlBC,GAjKkB,MAkKlBC,GAlKkB,MAmKlBC,GAnKkB,MAoKlBC,GApKkB,MAqKlBC,GArKkB,MAsKlBC,GAtKkB,MAuKlBC,GAvKkB,MAwKlBC,GAxKkB,MAyKlBC,GAzKkB,MA0KlBC,GA1KkB,MA2KlBC,GA3KkB,MA4KlBC,GA5KkB,MA6KlBC,GA7KkB,MA8KlBC,GA9KkB,MA+KlBC,GA/KkB,MAgLlBC,GAhLkB,MAiLlBC,GAjLkB,MAkLlBC,GAlLkB,MAmLlBC,GAnLkB,MAoLlBC,GApLkB,MAqLlBC,GArLkB,MAsLlBC,GAtLkB,MAuLlBC,GAvLkB,MAwLlBC,GAxLkB,MAyLlBC,GAzLkB,MA0LlBC,GA1LkB,MA2LlBC,GA3LkB,MA4LlBC,GA5LkB,MA6LlBC,GA7LkB,MA8LlBC,GA9LkB,MA+LlBC,GA/LkB,MAgMlBC,GAhMkB,MAiMlBC,GAjMkB,MAkMlBC,GAlMkB,MAmMlBC,GAnMkB,MAoMlBC,GApMkB,MAqMlBC,GArMkB,MAsMlBC,GAtMkB,MAuMlBC,GAvMkB,MAwMlBC,GAxMkB,MAyMlBC,GAzMkB,MA0MlBC,GA1MkB,MA2MlBC,GA3MkB,MA4MlBC,GA5MkB,MA6MlBC,GA7MkB,MA8MlBC,GA9MkB,MA+MlBC,GA/MkB,MAgNlBC,GAhNkB,MAiNlBC,GAjNkB,MAkNlBC,GAlNkB,MAmNlBC,GAnNkB,MAoNlBC,GApNkB,MAqNlBC,GArNkB,MAsNlBC,GAtNkB,MAuNlBC,GAvNkB,MAwNlBC,GAxNkB,MAyNlBC,GAzNkB,MA0NlBC,GA1NkB,MA2NlBC,GA3NkB,MA4NlBC,GA5NkB,MA6NlBC,GA7NkB,MA8NlBC,GA9NkB,MA+NlBC,GA/NkB,MAgOlBC,GAhOkB,MAiOlBC,GAjOkB,MAkOlBC,GAlOkB,MAmOlBC,GAnOkB,MAoOlBC,GApOkB,MAqOlBC,GArOkB,MAsOlBC,GAtOkB,MAuOlBC,GAvOkB,MAwOlBC,GAxOkB,MAyOlBC,GAzOkB,MA0OlBC,GA1OkB,MA2OlBC,GA3OkB,MA4OlBC,GA5OkB,MA6OlBC,GA7OkB,MA8OlBC,GA9OkB,MA+OlBC,GA/OkB,MAgPlBC,GAhPkB,MAiPlBC,GAjPkB,MAkPlBC,GAlPkB,MAmPlBC,GAnPkB,OAsPlB,OAAA,WAAA,SAAApgB,IAAAtM,gBAAAjX,KAAAujB,GAAA,OAAAlM,aAAAkM,EAAA,KAAA,CAAA,CAAA1mB,IAAA,qBAAAnF,MAAA,SAtPkBksC,GAAA,OAAAzP,EAAAyP,IAAA,SAsPlBrgB,EAAA;mZCzPhBzxB,IAAI+kB,QAAQ,MAAO,CACf,YACA,SACIa,GAEA,IAAMmsB,EAAS5W,QAEf,OAAO,IAAA,WAAA,SAAA6W,IAAA7sB,gBAAAjX,KAAA8jC,GAAA,OAAAzsB,aAAAysB,EAAA,CAAA,CAAAjnC,IAAA,QAAAnF,MAAA,WAFQu1B,GAAAA,OAAfp6B,MAAA,CAAA,IAAA,IAAAkxC,EAAAp0B,UAAA5Y,OAJJitC,EAII,IAAA1qB,MAAAyqB,GAAAE,EAAA,EAAAA,EAAAF,EAAAE,IAJJD,EAIIC,GAAAt0B,UAAAs0B,GAEOJ,EAAAjvC,IAAAwW,MAAAy4B,EAAA,CAAA,UAAAvkC,OAAA0kC,OAAA,CAAAnnC,IAAA,UAAAnF,MAAA,WAAA,GAAA9E,OAAAsF,QAAA,CAAA,IAAA,IAAAgsC,EAAAv0B,UAAA5Y,OAAAitC,EAAA,IAAA1qB,MAAA4qB,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAAH,EAAAG,GAAAx0B,UAAAw0B,GASKN,EAAOjvC,IAAPwW,MAAAy4B,EAAM,CAAK,YAALvkC,OAAoB0kC,OAT/B,CAAAnnC,IAAA,QAAAnF,MAAA,SAEWhD,GAAQ,IAAA,IAAA0vC,EAAAz0B,UAAA5Y,OAAAstC,EAAA,IAAA/qB,MAAA8qB,EAAA,EAAAA,EAAA,EAAA,GAAAE,EAAA,EAAAA,EAAAF,EAAAE,IAAAD,EAAAC,EAAA,GAAA30B,UAAA20B,GAAAT,EAAAhwC,MAAAuX,MAAAy4B,EAAA,CAAA,SAAAnvC,GAAA4K,OADb0kC,IACatvC,GAedgjB,EAAUiB,OAAVvN,MAAAsM,EAAS,CAAQhjB,GAAR4K,OAAoB+kC,MAjBlC,CAAAxnC,IAAA,YAAAnF,MAAA,SAAAnC,GAAA,OAAAA,EAAAb,QAAA,CAAAa,EAOkBb,SACGa,EAAAN,MAAAM,EADbyuC,KAAAA,OACazuC,EAAAN,KAAA8G,OAAAwN,KAAA,SAAA1V,GAAA,OAAAA,EAAA0wC,SAoBhBhvC,EAASN,MAAQM,EAASN,KAAKuvC,MAAQjvC,EAASN,KAAKuvC,KAAKzoC,OAnB1D8nC,EAAW5uC,KAAAuvC,KAALzoC,OAAAwN,KAAoBy6B,SAAAA,GAAAA,OAA1BnwC,EAAA0wC,SAEP,OAXET,EAAA;mZCPfhyC,IAAI+kB,QAAQ,QAAS,CACjB,SACA,SACIpkB,GAEA,OAAO,IAAA,WACH,SAAAgyC,IAAcxtB,gBAAAjX,KAAAykC,GACVzkC,KAAKuG,WAAa9T,EAAOwT,WAAW,cAPxCjG,KAAS0kC,aAEjB1kC,KAAAuG,WAGWvG,KAAAxL,KAAA/B,EAAAwT,WAAA,cAAA,aAAA,OAAAoR,aAAAotB,EAAA,CAAA,CAAA5nC,IAAA,QAAAnF,MAAA,SACH6O,EAAc/R,GAAAwL,KAAA0kC,YAAA,EACLn+B,EAALhI,WAAyB0H,aAAWM,GAC/Bm+B,KAALn+B,WAAyBA,EAE5B9T,EAAA8L,WAAA,YAAA/J,GASGwL,KAAKxL,KAAOA,GAAQ,eAdrB,CAAAqI,IAAA,SAAAnF,MAAA,WAQMgtC,KAAAA,YAAL,EAGKn+B,EAALhI,WAAkBgI,aAAlB,MAEOhI,KAAAA,WAAW,KAErB9L,EAAA8L,WAAA,YAAA,MAfEyB,KAAAxL,KAAA,OAAA,CAAAqI,IAAA,UAAAnF,MAAA,SAkBMgtC,GAEEnmC,EAAAA,WAAW,YAAlB/J,GACK+R,KAAAA,KAAa/R,GAAlB,eArBD,CAAAqI,IAAA,QAAAnF,MAAA,WAAA,IAAA6O,EAAA9T,EAAAwT,WAAA,cAAA,GAAAM,EA8BF,OAAAA,EA9BE1U,OAAA8B,SA2BWlB,EAAAD,IAAA,gBA3BXiyC,EAAA;aCLf3yC,IAAI+kB,QAAQ,QAAS,CACjB,WAEI,OAAyB,SAAnB8tB,GACO,IAATC,EAAA,GACa5uC,EAAMsoB,EAAQA,QAA3B,KACetoB,EAAM8Q,EAAO+9B,OAAUt/B,EAAM,GAA5CA,MAAA,KACQu/B,EAAO/tC,EAAPA,OAAR,EACA,IAAc,IAAV8tC,IAAuC,IAAxB7uC,EAAMsoB,QAAQ,KAAzB,KAAWtoB,GAAK,EAACsoB,IAAN,CACf,IAAAymB,EAAoBD,EAAA1sC,GAAAmN,MAAA,KACRu/B,EAAME,SAAUD,EAAhB,KAARA,EAAAvmC,eAAA,GAAAwmC,SAAAD,EAAA,IAAA,KAGP,OAAAH,EAVLD,CAAA9yC,OAAA8B,SAAAsxC;aCHRnzC,IAAI+kB,QAAQ,MAAO,CACf,OADAA,MAOI,SACIphB,EADJb,GAIIqd,IAAAA,EAAc,SAAAizB,GACNrwB,OAAK9hB,EAAAmN,SAAYqvB,gBAAA,6BAAA2V,KAD7Br5B,EAAAoG,YAAA,SAAAxQ,EAAAjP,GACIiP,EAAQoT,MAAK,WAKbswB,KAAcC,eAAC3jC,+BAAgB,aAAAjP,OAC/BqZ,EAAAs5B,YAAA,SAAA1jC,EAAA5J,GADJ4J,EAAAoT,MAAA,WAEQ7U,KAAK+G,MAAMs+B,SAAX,QAAA/lC,OAA8BzH,EAA9B,KAKMmI,KAAA+G,MAACuoB,eAAD,QAAAhwB,OAAUzH,EAAV,SAINgU,EAAA+jB,QAAO,SAAAN,GAAA,IAAA,OAAAA,EAAAM,UAGE,MAHFlY,GAIK,MAAA,CAJZ1L,EAAA,EAMHC,EAAA,EAVL9Y,MAAA,EAQYsQ,OAAQ,KAOZoI,EAAAy5B,WAAO,SAAa7jC,GAA0B,IAAvC8jC,EAAuC51B,UAAA5Y,OAAA,QAAAI,IAAAwY,UAAA,IAAAA,UAAA,GAAC,GAAI2K,EAAAA,KAAJ,WAA/C,OAAA7Y,EAAAxM,KAAA,WAAAsQ,MAAA,KAAAgE,KAAA,SAAAi8B,GAAA,OAAAlrB,WAAAkrB,MAEJ,IAAM11B,EAAUrO,EAAQ/N,KAAK,WAAW6R,MAAM,KAAKgE,KAAI,SAAAi8B,GAAC,OAAIlrB,WAAWkrB,MAIvE,OAJaD,GAA+CjrB,EAAWkrB,KAAf,gBAAA11B,EAAA7T,KAAA,MAIjD6T,GADN,IAAA21B,EAAA,CAKDC,KAAM,QAJC51B,IAAAA,QARX61B,GAAA,QAeIC,GAAI,QAJFH,MAAW,SACPI,OADO,SAERC,KAFQ,SAGTC,KAHS,SAITC,MAJS,SAKNC,KAAA,UACCC,KAAA,UACFC,OAPO,UAQPC,KARO,UASNC,IAAA,UACDC,IAAA,UACAC,IAAA,UACEC,MAAA,UACFC,MAbO,UAcRC,MAdQ,UAeRC,MAfQ,UAgBRC,MAhBQ,UAiBNC,MAAA,UACAC,MAAA,UACAC,MAAA,UACAC,OApBM,UAqBNC,OArBM,UAsBNC,OAtBM,UAuBNC,OAvBM,UAwBNC,KAAA,UACCC,KAAA,SACAC,MAAA,SACAC,KAAA,SACAC,MAAA,SACFC,MA7BO,SA8BPC,QA9BO,SA+BNC,KAAA,SACDC,IAAA,SACCC,MAjCM,SAkCNC,KAAA,SACAC,MAAE,SACHC,OApCO,SAqCRC,GAAA,SACEC,GAAA,SACDC,GAAA,SACCC,QAxCM,SAyCLC,GAAA,SACJC,IA1CS,SA2CTC,MA3CS,SA4CTC,IA5CS,SA6CNC,QA7CM,SA8CTC,IA9CS,SA+CRC,IA/CQ,SAgDNC,IAAA,SACFC,MAjDQ,SAkDNC,OAAE,SACJC,SAnDQ,SAoDRC,MApDQ,SAqDRC,IArDQ,SAsDNC,KAAA,UACCC,OAvDK,UAwDLC,MAAE,UACHC,MAzDM,UA0DRC,MA1DQ,UA2DPC,OA3DO,UA4DLlxC,MAAA,UACDmxC,KAAA,UACAC,MAAA,UACAC,QA/DM,UAgELC,KAAA,UACDC,KAAA,UACDC,KAAA,UACCC,KAAA,UACAC,KAAE,UACHC,MArEO,UAsEPC,OAtEO,UAuEPprB,KAAA,UACAqrB,MAxEO,UAyEPC,MAzEO,UA0ENC,MAAA,UACCC,KAAA,UACFC,MA5EO,UA6ENC,GAAA,UACAC,KAAA,UACAC,IAAA,UACDC,MAhFO,UAiFNC,OAjFM,UAkFTC,MAlFS,UAmFPC,KAAA,UACDC,MApFQ,UAqFNC,IAAA,UACCC,IAAA,UACDC,GAAA,UACDC,IAAA,UACCC,IAAA,UACFC,IAAA,UACAC,OA3FQ,UA4FTC,IA5FS,UA6FRC,KA7FQ,UA8FRC,MA9FQ,UA+FRC,GAAA,UACGC,MAAA,UACHC,GAAA,UACCC,GAAA,UACCC,IAAA,UACHC,IApGS,UAqGNC,KAAA,UACHC,KAtGS,UAuGTC,KAvGS,UAwGRC,MAxGQ,UAyGRC,OAzGQ,UA0GPC,KAAA,UACAC,KAAA,UACAC,MA5GO,UA6GNC,MAAA,UACCC,OAAA,UACFC,OA/GO,UAgHP9tC,KAAA,UACC+tC,KAAA,UACAC,IAAA,UACCC,OAAA,UACAC,MAAA,UACFC,OArHO,UAsHPC,MAtHO,UAuHRC,KAvHQ,SAwHLC,MAAA,SACDC,KAAA,SACCC,MAAA,SACDC,OA3HM,SA4HPC,IAAA,SACCC,OA7HM,SA8HPC,KA9HO,SA+HNC,IAAA,SACCC,KAAA,SACHC,KAjIQ,SAkILC,MAAA,SACFC,IAAA,SACDC,IApIQ,SAqIPC,IAAA,SACAC,KAtIO,SAuINC,IAAA,SACFC,OAxIQ,SAyIRC,KAzIQ,SA0IRC,KA1IQ,SA2IPC,MA3IO,SA4IRC,MA5IQ,SA6ILC,KAAA,SACFC,OA9IO,SA+IPC,MA/IO,SAgJNC,KAAA,SACAC,KAAA,SACDC,MAlJO,SAmJLC,OAnJK,SAoJNC,OApJM,SAqJPC,OArJO,SAsJPC,OAtJO,SAuJNC,OAvJM,SAwJLC,OAxJK,SAyJLC,MAAA,SACAC,OA1JK,SA2JLC,KAAA,SACAC,MAAA,SACAC,MAAA,SACDC,OA9JM,SA+JLC,OA/JK,SAgKPC,OAhKO,SAiKNC,MAjKM,SAkKNC,KAAA,SACCC,OAnKK,SAoKLC,OApKK,SAqKLC,MAAA,SACDC,KAAA,SACDC,IAAA,SACEC,OAxKK,SAyKLC,OAzKK,SA0KNC,OA1KM,SA2KPC,MA3KO,SA4KRC,OA5KQ,SA6KLC,KAAA,SACAC,MAAA,SACAC,OA/KK,SAgLNC,OAhLM,SAiLLC,OAjLK,SAkLPC,MAlLO,SAmLNC,KAAA,SACCC,OApLK,SAqLLC,MAAA,SACAC,MAAA,SACDC,OAvLM,UAgOjB,OAtCIF,EAAOG,yBA1LM,SAAAC,GA2LN,OA3LMA,EAAAzrC,QAAA,yBAAA,SAAA0rC,EAAAC,GA4LL,OAAA3L,EAAA2L,IAAAD,MAIRtlC,EAAOqlC,SAAOzrC,SAAAA,GACV,IAAOggC,EAAS2L,EAAAA,SAAeD,KAA/BE,GAMAn5C,OAPJtD,EAAAsD,QAAA,uBAAA2Y,EAAApd,KAAA,qBADJod,EAAApd,KAAA,oBAAAohB,MAAA,WAUQhJ,EAAIoG,YAAYlf,EAAEiN,MAAOvK,EAAKmuB,OAAO7wB,EAAEiN,MAAM/K,KAAK,aAAaqrB,OAAO+R,eAHpExhB,EAAYpd,KAAA,kBAAc49C,SACpBxgC,GACZhF,EAAAylC,SAAA,SAAAC,GAQA,OALAA,IANJA,EAAA1lC,EAAAolC,yBAOWpgC,EAAP,0CAAA0gC,IAISA,GAGR1lC,EAAA2lC,iBAAA,SAAAC,GAMD,IAAIC,GAAY,IAAIC,eAAgBC,kBAAkB7+C,EAAE0+C,GAAK,IAJ7DI,EAAA7M,SAAA8M,mBAAAJ,IANJK,EAAAC,KAAAH,GASIL,MAAAA,6BAAAA,OAA4BO,IAGxBA,EAAAA,KAASC,SAAAA,GAEb,OAAAnmC,EAAAylC,SALJv+C,EAAA,SAAA8c,OAAAqhC,GAAApsC,SAQA+G;mZChRR/Z,IAAI+kB,QAAQ,cAAe,CACvB,KACA,MACA,SACA,SACI3kB,EACA0C,EACAi8B,GAGA,OAAO,IAAA,WAAA,SAAAohB,IAAAh7B,gBAAAjX,KAAAiyC,GAAAjyC,KAAAkyC,WAAA,GACHlyC,KAAAmyC,eAAc,GAAAnyC,KAAAoyC,kBAAA,EADX,OAAA/6B,aAAA46B,EAAA,CAAA,CAAAp1C,IAAA,UAAAnF,MAAA,SAGMy6C,GACAC,IAAAA,EAALlgD,EAAA6zB,QACHviB,EAAA,CAKOqB,KAAMA,EAVXsN,KAAA4T,EAAAC,QAAAD,MAAAA,GAUWlhB,OAFJkhB,KAAQ7zB,WAAd6B,KAAAyP,GACMA,KAAS6uC,oBAAG7uC,IATnB,CAAA3G,IAAA,oBAAAnF,MAAA,WAcMw6C,GAAAA,KAAWn+C,WAAKyP,OAArB,GAAAxD,KAAAoyC,kBAAA,EAAA,CACKC,IAAAA,EAALryC,KAAAkyC,WAAA1gB,QACOhuB,KAAPA,UAAAA,MAhBD,CAAA3G,IAAA,YAAAnF,MAAA,SAAA8L,GAAA,IAAAuU,EAAA/X,KAoBKA,KAAKkyC,oBAEA1uC,IAAAA,EAAUA,EAAfqB,KACHhI,EAAAmD,KAAA8qB,WAAAjmB,GAvBF,GAwBFjQ,EAAAsD,QAAA,eAAA2E,EAAA2G,GAxBExD,KAAAmyC,eAAAt1C,GA2BMu1C,OA3BNx9C,EAAAsD,QAAA,mBAAA2E,GAAA2G,EAAAhR,IA0BOgR,KAAAA,eAAW3G,GAAAmD,KAAAoyC,yBAUbpyC,KAAKqyC,oBALLn6C,IAAQ2M,EAAA1K,KAAAhG,WAAqBqP,UAGpB,OAOT5O,EAAIsD,QAAQ,4BAA6B2M,EAAK1K,KAAM0C,EAAK2G,GATpD2uC,KAAAA,yBACDj6C,KAAQm6C,oBAgBhBxhB,EAAOxtB,OAAOwB,EAAM,CATV1K,MAzClB,IA0CgBjC,OA1ChB,MA2CiBk6C,MAAAA,SAAAA,GACAC,OAAAA,EAALtgB,kBAAAltB,MACAvP,MAAA,SAAAuP,GACH,OAAAkT,EAAAu6B,SAAAztC,MAWEvP,MAAK,SAAC9C,GATGuR,OAAZgU,EAAAw6B,UAAA//C,MACU8C,MAAGyO,SAAb1L,GACOgL,EAAahL,MAAAA,EAChBlF,EADgBA,MAAAkF,EAAAlF,MAEhBsQ,EAAAA,OAAAA,EAAAA,OACID,EAAAgvC,OAAU,KAHlB,OAIkBzgB,SAAAA,GACVvuB,EAAA3P,OAAU,EACP2P,EAAK8uC,UAAZz+C,EACIe,EAAAf,MAAAA,MAPR,SAQgB0+C,WACRx6B,EAAAq6B,oBACKr6B,EAAC1f,oBACDmL,EAASnL,MAAMlF,eA5D7B,CAAA0J,IAAA,WAAAnF,MAAA,SAgEe7D,GACV2P,OAAUivC,IAAAA,SAAY5+C,SAAAA,EAAtBokB,GACUpkB,IAAVw/B,EAAA,IAAAC,WAjBJD,EAkBWqf,OAAM,SAAAh0C,GACR0zC,EAAAA,EAALzwC,OAAAjF,SACK21C,EAAAA,QAAL,SAAA3zC,GAYI9J,EAAIf,MAAM,sBAAuB6K,GAX3BqnB,KAEjBsN,EAAAsf,cAAA9tC,QAxEE,CAAAhI,IAAA,YAAAnF,MAAA,SA2EYvF,GACDkhC,OAAS,IAAIC,SAAAA,SAAAA,EAAnBrb,GAcA,IAAM5f,EAAQ,IAAI2hB,MAbX04B,EAASA,OAAA,WACF/wC,EAAOjF,IAgBrBrE,EAAMzE,QAAU,SAAC8K,GAdjB9J,EAAiBf,MAAA,4BAAO6K,EAAAA,EAAAhK,SACVujB,KADd5f,EAAA6W,IAAA2kB,OAhFL,CAAAh3B,IAAA,iBAAAnF,MAAA,SAsFF4P,EAAAjP,GAtFE,GAAAA,EAAA,CA0FWA,IACAq6C,EAANprC,EAAeD,OAAMlU,MACTkF,EAAAA,EAARgP,OAAA5D,OADJwL,EAAA,GAqBAH,EAAU,GAhBAG,EAAA,IAAAA,EAAA,GAFVH,EAAA,IAAAA,EAAA,GAuBAG,EAAU,IAAGA,EAAU,GAnBvBH,EAAA,IAAAA,EAAA,GAEP,IAIO8jC,EAAAC,EAAAC,EAAAC,EAJPC,EAAA36C,EAAAlF,MApGE8/C,EAAA56C,EAAAoL,OAAA4iB,EAAA1qB,KAAAuX,IAAAggC,EAAAF,EAAAG,EAAAF,GAAAG,EAAAJ,EAAA3sB,EAuGagtB,EAAAJ,EAAA5sB,EACRitB,EAAA,EAGJF,EAAAF,IAAAI,EAAAJ,EAAAE,GACAz3C,KAAAqmB,IAAAsxB,EAAA,GAAA,OAAAD,EAAAF,IAAAG,EAAAH,EAAAE,IASIpkC,GAAU+jC,GAiBdF,EAAKE,IAzBG1rC,GAAAA,GAyBQ4rC,KAjBQjkC,GAKPikC,IAACN,EAAOO,IAJrBrkC,GAAUmkC,GAHVhkC,EAAOgkC,IALH3rC,GAAAA,GAKgB6rC,KAGArkC,GAExB,IAAA+jC,EAAA,GAGmBC,EAAAE,IAAAF,EAAAE,GAHnBD,EAAAE,IAAAF,EAAAE,GAAA3rC,EAAAisC,UAAAl7C,EAAAu6C,EAAAC,EAAAC,EAAAC,EA9BkB,EAkBV,EAYRG,EAAAC,MAxHD,CAAAt2C,IAAA,aAAAnF,MAAA,SA+HCmN,GAwBA,MAAO,CAACA,EAAKrQ,KAAMqQ,EAAKd,KAAMc,EAAK2uC,cAAcv3C,KAAK,SAvJvDg2C,EAAA;aCVfngD,IAAI+kB,QAAQ,SAAU,CAClB,WAEU48B,IAAQA,EAAd,GACA,MAAO,CACK5sC,OAAA,WAAoB,IAAAjB,EAApB8mB,EAAoB/c,UAAA5Y,OAAA,QAAAI,IAAAwY,UAAA,GAAAA,UAAA,GAAA,MACxB,EAAA,CAEI,IAAM+jC,EAAS/3C,KAAKkL,SAAShM,WAAW4K,QAAQ,MAAO,IADxDG,EAAA8mB,EAAA,IAAAgnB,QACoBD,EAAC5sC,IAEf4sC,OADC/mB,EAAM9mB,IAAS8tC,EACV9tC,GAEfE,IAAA,WAAA,IAAA4mB,EAAA/c,UAAA5Y,OAAA,QAAAI,IAAAwY,UAAA,GAAAA,UAAA,GAAA,MARDuW,EAAA,EAWE,GAAoBA,UACrButB,EAAA/mB,EAAA,IAAAxG,IACG,OAGHutB,EAAM/mB,EAAS,IAAMxG,IAAU,EAH5BwG,EAAA,IAAAxG;aChBnBp0B,IAAI+kB,QAAQ,YAAa,CAArBA,WAIc,MAAN,CAAoB,CAAAngB,KAAA,KAAAlC,KAAA,WACpB,CAAAkC,KAAA,KAAAlC,KAAA,UAAQ,CAARkC,KAAA,KAAAlC,KAAA,kBAAoB,CAAAkC,KAAA,KAAAlC,KAAA,WACpB,CAAAkC,KAAA,KAAAlC,KAAA,YAAQ,CAARkC,KAAA,KAAAlC,KAAA,cAAoB,CAAAkC,KAAA,KAAAlC,KAAA,YACpB,CAAAkC,KAAA,KAAAlC,KAAA,eAAQ,CAARkC,KAAA,KAAAlC,KAAA,YAAoB,CAAAkC,KAAA,KAAAlC,KAAA,wBACpB,CAAAkC,KAAA,KAAAlC,KAAA,kCAAQ,CAARkC,KAAA,KAAAlC,KAAA,WAAoB,CAAAkC,KAAA,KAAAlC,KAAA,WACpB,CAAAkC,KAAA,KAAAlC,KAAA,WAAQ,CAARkC,KAAA,KAAAlC,KAAA,UAAoB,CAAAkC,KAAA,KAAAlC,KAAA,SACpB,CAAAkC,KAAA,KAAAlC,KAAA,YAAQ,CAARkC,KAAA,KAAAlC,KAAA,WAAoB,CAAAkC,KAAA,KAAAlC,KAAA,QACpB,CAAAkC,KAAA,KAAAlC,KAAA,UAAQ,CAARkC,KAAA,KAAAlC,KAAA,YAAoB,CAAAkC,KAAA,KAAAlC,KAAA,aACpB,CAAAkC,KAAA,KAAAlC,KAAA,SAAQ,CAARkC,KAAA,KAAAlC,KAAA,oBAAoB,CAAAkC,KAAA,KAAAlC,KAAA,YACpB,CAAAkC,KAAA,KAAAlC,KAAA,iBAAQ,CAARkC,KAAA,KAAAlC,KAAA,YAAoB,CAAAkC,KAAA,KAAAlC,KAAA,aACpB,CAAAkC,KAAA,KAAAlC,KAAA,eAAQ,CAARkC,KAAA,KAAAlC,KAAA,YAAoB,CAAAkC,KAAA,KAAAlC,KAAA,WACpB,CAAAkC,KAAA,KAAAlC,KAAA,YAAQ,CAARkC,KAAA,KAAAlC,KAAA,UAAoB,CAAAkC,KAAA,KAAAlC,KAAA,iBACpB,CAAAkC,KAAA,KAAAlC,KAAA,cAAQ,CAARkC,KAAA,KAAAlC,KAAA,cAAoB,CAAAkC,KAAA,KAAAlC,KAAA,YACpB,CAAAkC,KAAA,KAAAlC,KAAA,kBAAQ,CAARkC,KAAA,KAAAlC,KAAA,gBAAoB,CAAAkC,KAAA,KAAAlC,KAAA,4BACpB,CAAAkC,KAAA,KAAAlC,KAAA,QAAQ,CAARkC,KAAA,KAAAlC,KAAA,YAAoB,CAAAkC,KAAA,KAAAlC,KAAA,UACpB,CAAAkC,KAAA,KAAAlC,KAAA,SAAQ,CAARkC,KAAA,KAAAlC,KAAA,gBAAoB,CAAAkC,KAAA,KAAAlC,KAAA,eACpB,CAAAkC,KAAA,KAAAlC,KAAA,gBAAQ,CAARkC,KAAA,KAAAlC,KAAA,kBAAoB,CAAAkC,KAAA,KAAAlC,KAAA,gBACpB,CAAAkC,KAAA,KAAAlC,KAAA,aAAQ,CAARkC,KAAA,KAAAlC,KAAA,SAAoB,CAAAkC,KAAA,KAAAlC,KAAA,QACpB,CAAAkC,KAAA,KAAAlC,KAAA,WAAQ,CAARkC,KAAA,KAAAlC,KAAA,kBAAoB,CAAAkC,KAAA,KAAAlC,KAAA,YACpB,CAAAkC,KAAA,KAAAlC,KAAA,cAAQ,CAARkC,KAAA,KAAAlC,KAAA,iBAAoB,CAAAkC,KAAA,KAAAlC,KAAA,aACpB,CAAAkC,KAAA,KAAAlC,KAAA,WAAQ,CAARkC,KAAA,KAAAlC,KAAA,uDAAoB,CAAAkC,KAAA,KAAAlC,KAAA,wCACpB,CAAAkC,KAAA,KAAAlC,KAAA;aC1BZ1C,IAAI+kB,QAAQ,QAAS,CAAC,WAClB,MAAO,CADPA,eACO,SADW1jB,EAAAsQ,GAAY,IAAAkwC,EAAAhkC,UAAA5Y,OAAA,QAAAI,IAAAwY,UAAA,GAAAA,UAAA,GAAA,IACvBikC,EAAA,SAAAA,EAAAziC,EAAAoU,GAAA,OAAA,GAAAA,EAAApU,EAAAyiC,EAAAruB,EAAApU,EAAAoU,IAAAlV,EAAAujC,EAAAzgD,EAAAsQ,GAKC,OAAQtQ,EAAQkd,EAASsjC,EAAalwC,EAAS4M,GAH/CwjC,gBAFD,SAECC,GAOA,OAAOA,EAAMx1B,QAAQ3iB,KAAKuX,IAAI9H,MAAMzP,KAAMm4C,KAT3CtlB,YAAA,SAAAuW,GASC,OAAazmB,EAAAA,QAAQ3iB,iBAAA","file":"../app.min.js","sourcesContent":["window.app = angular.module('app', [\n 'ngFileUpload',\n]);\n\napp.run(['$window', '$q', function ($window, $q) {\n $window.Promise = $q;\n}]);\n\napp.config(['$provide', function ($provide) {\n $provide.decorator('$browser', ['$delegate', function ($delegate) {\n $delegate.onUrlChange = function () {\n };\n $delegate.url = function () {\n return '';\n };\n return $delegate;\n }]);\n}]);\n\napp.config(['$compileProvider', function ($compileProvider) {\n $compileProvider.debugInfoEnabled(CONFIG.debug);\n}]);\n\nwindow.TRANSPARENT_PIXEL = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';\n\n// Global jQuery bindings\n$('body').tooltip({ selector: '[data-toggle=\"tooltip\"]' });\n\n\nconst adjustCartSize = () => {\n $('.p-cart-images').width(Math.floor($('.p-cart-images').parent().width() / 90) * 90);\n};\n$(window).resize(adjustCartSize);\n$(adjustCartSize);\nadjustCartSize();\n\n\n// temporary fix for blogs\n$('.p-blog-list-single').on('click', evt => {\n evt.preventDefault();\n\n const href = $(evt.currentTarget).find('.p-blog-list-single-feature').attr('href');\n\n window.location.href = href;\n});\n","window.onerror = function(error) {\n dataLayer.push({\n event:'Unhandled error',\n message: error,\n });\n};\n\nwindow.addEventListener('unhandledrejection', function(error) {\n dataLayer.push({\n event: 'Unhandled error',\n message: error,\n });\n});\n\n","if (!String.prototype.startsWith) {\n String.prototype.startsWith = function (searchString, position) {\n position = position || 0;\n return this.indexOf(searchString, position) === position;\n };\n}\n","app.controller('ContactController', [\n '$scope',\n 'config',\n 'api',\n 'log',\n function (\n $scope,\n config,\n api,\n log,\n ) {\n $scope.contactMessage = {\n app: config.api.printicular.clientName,\n name: '',\n emailAddress: '',\n message: '',\n data: {},\n };\n $scope.submitContact = ($event) => {\n $event.preventDefault();\n $scope.contactLoading = true;\n api.post('contact', {\n data: {\n type: 'contact',\n attributes: $scope.contactMessage,\n },\n }).then(() => {\n $scope.contactLoading = false;\n $scope.contactSuccess = 'Successfully sent contact message.';\n }).catch((response) => {\n $scope.contactLoading = false;\n $scope.contactError = 'Failed to send contact message. ' + log.mapErrors(response);\n });\n };\n },\n]);\n","app.controller('PrintController', [\n '$interpolate',\n '$rootScope',\n '$sce',\n '$scope',\n '$timeout',\n 'api',\n 'cart',\n 'CartLineItem',\n 'config',\n 'gtm',\n 'log',\n 'query',\n function (\n $interpolate,\n $rootScope,\n $sce,\n $scope,\n $timeout,\n api,\n cart,\n CartLineItem,\n config,\n gtm,\n log,\n query,\n ) {\n window.PRINT = $scope;\n\n if (query.thanks) {\n cart.orderNumber = 1;\n }\n\n api.get('territories').then((response) => {\n $rootScope.territories = response.data.filter((territory) => {\n if (config.locale.defaultDeliveryCountry && config.locale.defaultDeliveryCountry.code == territory.attributes.country_code) {\n cart.addressCountry = territory;\n }\n if (!config.locale.deliveryCountries || !config.locale.deliveryCountries.length) {\n return true;\n }\n for (const deliveryCountry of config.locale.deliveryCountries) {\n if (deliveryCountry.code == territory.attributes.country_code) {\n return true;\n }\n }\n return false;\n });\n const defaultCountry = $rootScope.territories.find(territory => territory.id == cart.addressTerritoryId);\n if (defaultCountry) {\n cart.addressCountry = defaultCountry;\n }\n });\n\n\n $scope.files = [];\n $scope.displayUploadZone = false;\n\n $scope.$watch('files', (files) => {\n log.verbose('Added files', files.length);\n\n $rootScope.uploadErrors = [];\n for (let i = 0; i < files.length; i++) {\n const image = cart.addImage(files[i]);\n\n if (image) {\n cart.addLineItem(new CartLineItem({ cart, image }));\n }\n }\n\n if (files.length) {\n gtm.push({\n event: 'Add files',\n count: files.length,\n });\n }\n });\n\n $scope.duplicateLineItem = (lineItem, index) => {\n const duplicate = new CartLineItem({ cart, image: lineItem.image, product: lineItem.product });\n\n if (lineItem.settings) {\n duplicate.settings = $.extend({}, lineItem.settings);\n }\n\n cart.lineItems.splice(index, 0, duplicate);\n cart.updateSummary();\n };\n\n const checkWaitingUpload = () => {\n if (cart.summary.totalUnready > 0) {\n $timeout(checkWaitingUpload, 300);\n return;\n }\n sendOrder();\n };\n\n const gaProcessOrder = (response) => {\n let gaProducts = {};\n let lineItems = response.included.filter(included => included.type == 'line_items');\n for (let i = 0; i < lineItems.length; i++) {\n const lineItem = lineItems[i];\n const cartLineItem = cart.lineItems[i] || null;\n const lineItemKey = lineItem.attributes.product_id + ':' + (cartLineItem ? cartLineItem.variant : 'none');\n if (!gaProducts[lineItemKey]) {\n let product = null;\n if (cart.fulfillment == 'delivery') {\n product = cart.deliveryProducts.find(product => product.id == lineItem.attributes.product_id);\n } else {\n product = cart.store.products.find(product => product.id == lineItem.attributes.product_id);\n }\n gaProducts[lineItemKey] = {\n id: lineItem.attributes.product_id.toString(),\n name: product ? product.attributes.name : null,\n category: product ? product.attributes.category_name : null,\n variant: cartLineItem ? cartLineItem.variant : null,\n price: lineItem.attributes.unit_price,\n quantity: 0,\n brand: cart.store.attributes.retailer_id,\n };\n }\n gaProducts[lineItemKey].quantity += lineItem.attributes.quantity;\n }\n const transactionData = {\n event: 'purchase',\n ecommerce: {\n currencyCode: cart.getCurrency(),\n purchase: {\n actionField: {\n id: response.data.id.toString(),\n revenue: response.data.attributes.total,\n affiliation: cart.store ? cart.store.attributes.name : 'Delivery',\n tax: response.data.attributes.tax_total,\n shipping: response.data.attributes.freight_total,\n coupon: cart.couponCode,\n },\n products: Object.values(gaProducts),\n },\n },\n };\n log.debug('Ecommerce data', transactionData);\n\n gtm.push(transactionData);\n gtm.push({\n event: 'Submit order',\n fulfillment: cart.store ? cart.store.attributes.name : 'Delivery',\n orderId: response.data.id,\n orderValue: Math.round(response.data.attributes.total * 100),\n });\n };\n\n const paymentComplete = (token) => {\n const order = cart.getOrderJson(false, token);\n api.post('users/0/orders?include=store,lineItems', order).then((response) => {\n window.onbeforeunload = null;\n const orderNumber = response.data.id;\n $scope.placingOrder = false;\n cart.orderNumber = orderNumber;\n $(window).scrollTop(0);\n gaProcessOrder(response);\n }).catch((response) => {\n log.debug('Error placing order', response, log.mapErrors(response));\n $scope.placingOrder = false;\n $scope.errors = log.mapErrors(response);\n gtm.push({\n event: 'Submit order failed',\n errorMessage: $scope.errors.join('\\n'),\n fulfillment: cart.store ? cart.store.attributes.name : 'Delivery',\n orderValue: Math.round(cart.summary.totalPrice * 100),\n });\n });\n };\n\n const sendOrder = () => {\n $scope.waitingUpload = false;\n $scope.errors = cart.validate();\n if ($scope.errors.length > 0) {\n gtm.push({\n event: 'Submit order failed',\n errorMessage: $scope.errors.join('\\n'),\n fulfillment: cart.store ? cart.store.attributes.name : 'Delivery',\n orderValue: Math.round(cart.summary.totalPrice * 100),\n });\n return;\n }\n $scope.placingOrder = true;\n\n if (cart.fulfillment == 'pickup') {\n paymentComplete();\n return;\n }\n\n $rootScope.stripe.createToken($rootScope.card).then((result) => {\n if (result.error) {\n $scope.errors = [result.error.message];\n $scope.placingOrder = false;\n gtm.push({\n event: 'Payment failed',\n errorMessage: result.error.message,\n fulfillment: cart.store ? cart.store.attributes.name : 'Delivery',\n orderValue: Math.round(cart.summary.totalPrice * 100),\n });\n } else {\n paymentComplete(result.token.id);\n }\n $scope.$apply();\n });\n };\n\n $scope.placeOrder = ($event) => {\n $event.preventDefault();\n if (cart.summary.totalUnready > 0) {\n $scope.waitingUpload = true;\n $timeout(checkWaitingUpload, 300);\n return;\n }\n sendOrder();\n };\n\n $scope.content = {};\n $scope.$watch('cart.orderNumber', () => {\n for (const key in config.content) {\n $scope.content[key] = $sce.trustAsHtml($interpolate(config.content[key])($scope));\n }\n });\n\n $scope.reload = () => {\n location.reload();\n };\n\n $scope.coupon = {\n code: null,\n };\n $scope.applyCoupon = () => {\n log.debug('Applying coupon', $scope.coupon.code);\n $scope.couponErrors = [];\n\n if (!$scope.coupon.code) {\n $scope.couponErrors = ['Please enter a coupon code.'];\n return;\n }\n cart.couponCode = $scope.coupon.code;\n cart.updateSummary().then(() => {\n if (!cart.summary.couponCode) {\n cart.couponCode = null;\n $scope.couponErrors = cart.dryRunErrors;\n cart.updateSummary();\n gtm.push({\n event: 'Invalid coupon',\n fulfillment: cart.store ? cart.store.attributes.name : 'Delivery',\n orderValue: Math.round(cart.summary.totalPrice * 100),\n couponCode: cart.couponCode,\n });\n } else {\n gtm.push({\n event: 'Apply coupon',\n totalDiscount: Math.round(cart.summary.totalDiscount + cart.summary.shippingDiscount * 100),\n fulfillment: cart.store ? cart.store.attributes.name : 'Delivery',\n orderValue: Math.round(cart.summary.totalPrice * 100),\n couponCode: cart.couponCode,\n });\n }\n });\n };\n\n $scope.removeCoupon = () => {\n cart.couponCode = null;\n cart.updateSummary();\n };\n\n $scope.updateCustomer = () => {\n if (cart.fulfillment == 'delivery') {\n cart.updateSummary();\n }\n };\n },\n]);\n","app.controller('RootController', [\n '$rootScope',\n '$sce',\n 'browser',\n 'cart',\n 'config',\n 'gtm',\n 'log',\n 'login',\n 'PrintService',\n 'query',\n 'US_STATES',\n function (\n $rootScope,\n $sce,\n browser,\n cart,\n config,\n gtm,\n log,\n login,\n PrintService,\n query,\n US_STATES,\n ) {\n window.ROOT = $rootScope;\n\n $rootScope.US_STATES = US_STATES;\n\n const abSource = document.cookie.match(/X-Source=(.*?)(;|$)/);\n log.debug('AB test', abSource);\n if (abSource) {\n gtm.push({\n abTest: abSource[1],\n });\n }\n\n if (query.store) config.storageSet('store', query.store);\n if (query.hasOwnProperty('lat') || query.hasOwnProperty('lon')) {\n config.storageSet('address', {\n lat: query.lat || 0,\n lon: query.lon || 0,\n });\n }\n\n $rootScope.config = config;\n $rootScope.lang = LANG;\n $rootScope.time = new Date().getTime();\n $rootScope.printServices = {};\n $rootScope.login = login;\n $rootScope.uploadErrors = [];\n $rootScope.browser = browser;\n\n $rootScope.showPromo = config.promo.enabled && $rootScope.time >= config.promo.from && $rootScope.time <= config.promo.to;\n $rootScope.promoContent = $sce.trustAsHtml(config.promo.banner);\n\n const promises = [];\n const productTags = (config.promo.productTags || []).concat(CONFIG.api.printicular.tags || []);\n for (const printService of config.api.printicular.pickUpPrintServices) {\n log.debug('Fetching products for print service', printService.id);\n promises.push(PrintService.findById(printService.id, productTags).then((printService) => {\n $rootScope.printServices[printService.id] = printService;\n cart.setPickupProducts(printService.products, printService.id);\n }).catch((e) => {\n log.error('Could not find pick up products for ' + printService.id, e);\n }));\n }\n if (config.api.printicular.deliveryPrintService.id) {\n log.debug('Fetching products for delivery service', config.api.printicular.deliveryPrintService.id);\n promises.push(PrintService.findById(config.api.printicular.deliveryPrintService.id, productTags).then((printService) => {\n $rootScope.printServices[config.api.printicular.deliveryPrintService.id] = printService;\n cart.setDeliveryProducts(printService.products);\n }).catch((e) => {\n log.error('Could not find delivery products.', e);\n }));\n }\n\n Promise.all(promises).finally(() => {\n $rootScope.$broadcast('loadedProducts');\n if (query.reorder) {\n cart.reorder(query.reorder);\n }\n });\n\n $('body').on('click', 'a', function () {\n const href = $(this).attr('href');\n if (href && href[0] !== '#') {\n if (cart.lineItems.length) {\n window.open(href);\n return false;\n }\n }\n });\n\n $(document).on('keydown', (event) => {\n log.verbose('Key press', event.keyCode);\n switch (event.keyCode) {\n case 27:\n $rootScope.$broadcast('escape');\n break;\n }\n $rootScope.$apply();\n });\n\n $(window).resize(() => {\n $rootScope.$broadcast('resize');\n });\n\n $rootScope.showImageModal = (image) => {\n if (!image.canEnlarge()) {\n return false;\n }\n $rootScope.modalImage = image;\n return true;\n };\n\n $rootScope.cropLineItem = (lineItem) => {\n if (!lineItem.canCrop()) {\n return false;\n }\n $rootScope.modalCrop = lineItem;\n return true;\n };\n\n $rootScope.closeModal = () => {\n $rootScope.modalImage = null;\n $rootScope.modalCrop = null;\n $rootScope.modalFrameFlow = null;\n };\n\n $rootScope.openModal = ({ name, lineItem }) => {\n $rootScope.closeModal();\n $rootScope[name] = lineItem;\n };\n\n $rootScope.$on('escape', () => {\n $rootScope.closeModal();\n });\n\n $rootScope.goto = (id) => {\n setTimeout(() => {\n const offset = $(`#${id}`).offset();\n log.verbose('Goto', id, offset, $(`#${id}`));\n if (offset && offset.top) {\n // Scroll after element becomes visible\n $('html, body').animate({\n scrollTop: offset.top,\n }, 500);\n }\n }, 1);\n };\n\n $rootScope.gotoNext = ($event) => {\n let next = false;\n let nextSection = null;\n for (const element of $('.p-btn-next, .p-next-target')) {\n if (next && $(element).is('.p-next-target') && $(element).is(':visible')) {\n nextSection = element;\n break;\n } else if (element == $event.target) {\n next = true;\n }\n }\n if (nextSection) {\n $('html, body').animate({\n scrollTop: $(nextSection).offset().top,\n }, 500);\n }\n };\n\n $rootScope.gotoPrevious = ($event) => {\n let previousSection = null;\n for (const element of $('.p-btn-next, .p-next-target')) {\n if (element == $event.target) {\n break;\n }\n if ($(element).is('.p-next-target') && $(element).is(':visible')) {\n previousSection = element;\n }\n }\n if (previousSection) {\n $('html, body').animate({\n scrollTop: $(previousSection).offset().top,\n }, 500);\n } else {\n $('html, body').animate({\n scrollTop: 0,\n }, 500);\n }\n };\n },\n]);\n","app.directive('pAppBanner', [\n '$templateCache',\n 'browser',\n 'config',\n 'query',\n function (\n $templateCache,\n browser,\n config,\n query,\n ) {\n return {\n template: $templateCache.get('app-banner'),\n link: function (scope) {\n scope.isMobile = browser.isIos || browser.isAndroid;\n scope.isAndroid = browser.isAndroid || !!query.android;\n scope.isIos = browser.isIos || !!query.ios;\n scope.banner = {\n visible: false,\n brand: config.brandName,\n url: null,\n };\n\n if (!query['no-app-banner']) {\n if (scope.isIos && !config.disableAppleAppStoreMobileBanner && config.appleAppStoreUrl) {\n scope.banner.url = config.appleAppStoreUrl;\n scope.banner.visible = true;\n }\n if (scope.isAndroid && !config.disableGooglePlayMobileBanner && config.googlePlayUrl) {\n scope.banner.url = config.googlePlayUrl;\n scope.banner.visible = true;\n }\n }\n\n scope.dismiss = () => {\n scope.banner.visible = false;\n };\n\n scope.install = () => {\n scope.banner.visible = false;\n window.open(scope.banner.url);\n };\n },\n };\n },\n]);\n","app.directive('pAutoSizeImg', [\n 'log',\n 'cart',\n function (\n log,\n cart,\n ) {\n const size = 200;\n return {\n restrict: 'A',\n scope: {\n lineItem: '=pAutoSizeImg',\n },\n link: function (scope, element) {\n const resize = () => {\n const squareImageAutoCrop = cart.getPrintServiceSettings().squareImageAutoCrop || 'landscape';\n const image = scope.lineItem.image.thumbnail && scope.lineItem.image.thumbnail.image;\n const product = scope.lineItem.product;\n\n if (image && product) {\n const imageRatio = scope.lineItem.image.thumbnail.width / scope.lineItem.image.thumbnail.height;\n const productSize = scope.lineItem.product.getProductSize();\n\n let cropOrientation = null;\n if (imageRatio == 1) {\n cropOrientation = squareImageAutoCrop;\n } else if (imageRatio > 1) {\n cropOrientation = 'landscape';\n } else {\n cropOrientation = 'portrait';\n }\n\n if (cropOrientation == 'portrait') {\n // Image is portrait\n const productRatio = productSize.width < productSize.height ? productSize.width / productSize.height : productSize.height / productSize.width;\n log.verbose('Auto cropping portrait', imageRatio, productRatio, size * productRatio);\n element.width(size * productRatio);\n element.height(size);\n } else if (cropOrientation == 'landscape') {\n // Image is landscape\n const productRatio = productSize.width > productSize.height ? productSize.width / productSize.height : productSize.height / productSize.width;\n log.verbose('Auto cropping landscape', imageRatio, productRatio, size / productRatio);\n element.width(size);\n element.height(size / productRatio);\n }\n } else {\n log.verbose('Cannot auto crop, falling back to square', image, product);\n element.width(size);\n element.height(size);\n }\n };\n scope.$watch('[lineItem.product, lineItem.image.thumbnail.image, cart.fulfillment, cart.store]', resize);\n scope.$on('resize', resize);\n resize();\n },\n };\n },\n]);\n","app.directive('pCartItemPreview', [\n 'cropHelpers',\n 'frameHelpers',\n 'cart',\n function (\n cropHelpers,\n frameHelpers,\n cart,\n ) {\n return {\n restrict: 'A',\n scope: {\n lineItem: '=',\n },\n link: function (scope, element) {\n scope.cart = cart;\n\n const maxHeight = element.height();\n\n element.html(getPreviewHtml());\n resize();\n\n scope.$on('resize', () => {\n resize();\n scope.$digest();\n });\n\n scope.$watch('[lineItem.previewSvg, lineItem.image.thumbnail.image.src, lineItem.product, cart.fulfillment, cart.store]', () => {\n setTimeout(() => {\n element.html(getPreviewHtml());\n resize();\n }, 1);\n });\n\n function resize () {\n const el = element.children().first();\n\n if (el.height() > maxHeight) {\n el.height(maxHeight);\n }\n }\n\n function getPreviewHtml () {\n if (scope.lineItem) {\n // Designer prints\n if (scope.lineItem.previewImage) {\n return scope.lineItem.previewImage;\n }\n\n // Framed Products\n if (scope.lineItem.product &&\n scope.lineItem.product.metaData.frame &&\n scope.lineItem.image &&\n scope.lineItem.image.getSrc()) {\n return frameHelpers.render(scope.lineItem);\n }\n\n // Cards, Calendars, Canvas, etc\n if (scope.lineItem.previewSvg) {\n return scope.lineItem.previewSvg;\n }\n\n // Print Products\n if (scope.lineItem.image) {\n // Manually add cart image data\n if (!scope.lineItem.image.file && scope.lineItem.image.data) {\n return scope.lineItem.image.data;\n }\n // Uploaded photo\n if (scope.lineItem.image.getSrc()) {\n return cropHelpers.render(scope.lineItem);\n }\n }\n }\n\n return '
';\n }\n },\n };\n }]);\n","app.directive('pCategories', [\n 'log',\n 'query',\n function (\n log,\n query,\n ) {\n return {\n restrict: 'A',\n scope: {\n categories: '=pCategories',\n change: '&pCategoriesChange',\n },\n template: `\n
\n \n
\n `,\n link: function (scope) {\n const cleanCategoryName = (categoryName) => {\n return categoryName.toLowerCase().replace(/[^a-z0-9]/g, '');\n };\n\n if (query.categories) {\n for (const queryCategory of query.categories.split(',')) {\n const queryCategoryName = cleanCategoryName(queryCategory);\n const category = scope.categories.find(c => cleanCategoryName(c.name) == queryCategoryName);\n if (category) {\n log.debug('Enabling category by query string', queryCategoryName, category);\n category.selected = true;\n } else {\n log.debug('Could not find query category', queryCategoryName);\n }\n }\n }\n\n scope.toggleCategory = (category) => {\n log.debug('Toggling category');\n category.selected = !category.selected;\n scope.change();\n };\n\n scope.change();\n },\n };\n },\n]);\n","app.directive('pClientNavMenu', [\n '$rootScope',\n 'config',\n 'apiv2',\n 'login',\n 'Unique',\n function (\n $rootScope,\n config,\n apiv2,\n login,\n Unique,\n ) {\n return {\n restrict: 'A',\n replace: true,\n scope: {\n },\n template: `\n
  • \n \n Sign In\n {{ login.name }}\n \n \n
    \n \n My Account\n My Orders\n Sign Out\n \n
  • \n `,\n link: function (scope) {\n scope.uid = Unique.inc();\n scope.state = 'logged-out';\n scope.email = config.storageGet('email') || '';\n scope.loading = false;\n scope.error = null;\n scope.login = $rootScope.login;\n\n scope.submit = ($event) => {\n $event.preventDefault();\n scope.loading = true;\n scope.error = null;\n apiv2.post('client/account/login', {\n data: {\n type: 'AccountLogin',\n attributes: {\n emailAddress: scope.email,\n password: scope.password,\n deviceId: config.deviceToken,\n },\n },\n }).then((response) => {\n scope.loading = false;\n login.login(response.data.attributes.loginToken, response.data.attributes.name);\n }).catch((error) => {\n scope.loading = false;\n scope.error = error;\n });\n };\n\n scope.logout = () => {\n login.logout();\n window.location = config.url('/');\n };\n },\n };\n },\n]);\n","app.directive('pEditableInput', function () {\n return {\n restrict: 'EA',\n replace: true,\n scope: {\n model: '=pEditableInput',\n editing: '=?pEditableInputEditing',\n required: '=?pEditableInputRequired',\n label: '@?pEditableInputLabel',\n type: '@?pEditableInputType',\n inputId: '@?pEditableInputId',\n },\n template: `\n \n \n {{ label | trustedHtml }}\n \n \n \n `,\n link: function ($scope) {\n $scope.inputId = $scope.inputId || Math.random().toString(36).substr(2, 9);\n $scope.type = $scope.type || 'text';\n if (typeof $scope.editing === 'undefined') {\n $scope.editing = false;\n }\n if (typeof $scope.required === 'undefined') {\n $scope.required = false;\n }\n },\n };\n});\n","app.directive('pElastic', ['$timeout', function ($timeout) {\n return {\n restrict: 'A',\n link: function link($scope, element, attributes) {\n\n $scope.initialHeight = $scope.initialHeight || element[0].style.height;\n var resize = function resize() {\n element[0].rows = Math.max(attributes.pElastic || 3, element[0].value.split(/\\r*\\n/).length);\n };\n element.on('input change', resize);\n $timeout(resize, 0);\n },\n };\n}]);\n","app.directive('pImagePreview', [\n 'thumbnailer',\n function (\n thumbnailer,\n ) {\n return {\n restrict: 'A',\n replace: true,\n scope: {\n lineItem: '=pImagePreview',\n },\n link: function (scope, element) {\n scope.$watch('lineItem.thumbnail', (thumbnail) => {\n if (!thumbnail || !thumbnail.canvas) {\n return;\n }\n thumbnail.load.then(() => {\n const context = element[0].getContext('2d');\n element[0].width = 80;\n element[0].height = 80;\n thumbnailer.drawImageCover(context, thumbnail.canvas);\n });\n });\n },\n };\n }]);\n","app.directive('pLoader', [\n function () {\n return {\n restrict: 'EA',\n replace: true,\n template: `\n
    \n
    \n
    \n
    \n
    \n
    \n
    \n `,\n };\n },\n]);\n","app.directive('pMap', [\n 'Debouncer',\n 'log',\n function (\n Debouncer,\n log,\n ) {\n const MARKER_WIDTH = 50;\n const MARKER_HEIGHT = 62;\n\n return {\n restrict: 'A',\n scope: {\n markers: '=pMapMarkers',\n bounds: '=pMapBounds',\n infoWindow: '=pMapInfoWindow',\n minZoom: '@pMapMinZoom',\n maxZoom: '@pMapMaxZoom',\n onBoundsChanged: '&pMapOnBoundsChanged',\n onClickMarker: '&pMapOnClickMarker',\n },\n link: function (scope, element) {\n element.height(550);\n scope.minZoom = parseInt(scope.minZoom) || 10;\n scope.maxZoom = parseInt(scope.maxZoom) || 16;\n\n const boundsChangeEventDebouncer = new Debouncer();\n const boundsChangeExternalDebouncer = new Debouncer();\n const map = new google.maps.Map(element.get(0), {\n center: {\n lat: -37.7862694,\n lng: 175.2807603,\n },\n zoom: scope.minZoom,\n minZoom: scope.minZoom,\n maxZoom: scope.maxZoom,\n streetViewControl: false,\n scaleControl: true,\n });\n const markerQueue = [];\n let markerQueueInterval = null;\n function processMarkerQueue() {\n for (let i = 0; i < 10; i++) {\n if (markerQueue.length > 0) {\n const {\n id,\n latitude,\n longitude,\n iconUrl,\n data,\n } = markerQueue.pop();\n if (!markers[id]) {\n markers[id] = new google.maps.Marker({\n position: new google.maps.LatLng(latitude, longitude),\n icon: getScaledIcon(map.getZoom(), iconUrl),\n map,\n data,\n });\n if (scope.infoWindow && scope.infoWindow.markerId == id) {\n infoWindow.open(map, markers[id]);\n }\n google.maps.event.addListener(markers[id], 'click', () => {\n log.verbose('Clicked marker', id, markers[id]);\n scope.onClickMarker({\n id: id,\n marker: markers[id],\n });\n });\n }\n } else {\n clearInterval(markerQueueInterval);\n markerQueueInterval = null;\n return;\n }\n }\n }\n\n // For debugging\n window.MAP = map;\n\n const markers = {};\n const infoWindow = new google.maps.InfoWindow({\n content: '',\n });\n\n google.maps.event.addListener(map, 'bounds_changed', () => {\n log.verbose('Map bounds changed event');\n boundsChangeEventDebouncer.trigger(() => {\n const bounds = map.getBounds();\n\n // Hide markers out of bounds\n for (const markerId in markers) {\n const marker = markers[markerId];\n marker.setVisible(bounds.contains(marker.getPosition()));\n }\n\n log.verbose('Map bounds changed internally', bounds);\n scope.onBoundsChanged({\n bounds: bounds,\n });\n });\n });\n\n google.maps.event.addListener(map, 'zoom_changed', () => {\n for (const markerId in markers) {\n const marker = markers[markerId];\n marker.setIcon(getScaledIcon(map.getZoom(), marker.icon.url));\n }\n });\n\n function getScaledIcon(zoom, url) {\n const scale = zoom / scope.maxZoom;\n return {\n url: url,\n scaledSize: new google.maps.Size(MARKER_WIDTH * scale, MARKER_HEIGHT * scale),\n origin: new google.maps.Point(0, 0),\n anchor: new google.maps.Point(MARKER_WIDTH * scale / 2, MARKER_HEIGHT * scale),\n };\n }\n\n function addMarker(marker) {\n markerQueue.push(marker);\n if (!markerQueueInterval) {\n markerQueueInterval = setInterval(processMarkerQueue, 1);\n }\n }\n\n function zoomToFitPoints(points) {\n log.verbose('Zooming map to fix points', points);\n var bounds = new google.maps.LatLngBounds();\n for (const point of points) {\n bounds.extend(new google.maps.LatLng(point[0], point[1]));\n }\n map.fitBounds(bounds);\n }\n\n function zoomToBox(latitude1, longitude1, latitude2, longitude2) {\n log.verbose('Zooming map to fix box', latitude1, longitude1, latitude2, longitude2);\n var bounds = new google.maps.LatLngBounds();\n bounds.extend(new google.maps.LatLng(latitude1, longitude1));\n bounds.extend(new google.maps.LatLng(latitude2, longitude2));\n map.fitBounds(bounds);\n }\n\n scope.$watch(() => Object.keys(scope.markers).length, () => {\n log.verbose('Map markers changed', scope.markers);\n const newMarkers = [];\n for (const markerId in scope.markers) {\n const newMarker = addMarker(scope.markers[markerId]);\n if (newMarker) {\n newMarkers.push(newMarker);\n }\n }\n });\n scope.$watch('bounds', () => {\n boundsChangeExternalDebouncer.trigger(() => {\n if (scope.bounds.bounds) {\n log.verbose('Map bounds changed bounds', scope.bounds);\n zoomToBox(...scope.bounds.bounds);\n } else if (scope.bounds.marker) {\n log.verbose('Map bounds changed marker', scope.bounds);\n map.setCenter(markers[scope.bounds.marker].getPosition());\n map.setZoom(scope.maxZoom);\n } else if (scope.bounds.points) {\n log.verbose('Map bounds changed points', scope.bounds);\n zoomToFitPoints(scope.bounds.points);\n } else if (scope.bounds.point) {\n log.verbose('Map bounds changed point', scope.bounds, scope.minZoom + (scope.maxZoom - scope.minZoom) / 2);\n map.setCenter(new google.maps.LatLng(scope.bounds.point[0], scope.bounds.point[1]));\n map.setZoom(Math.round(scope.minZoom + (scope.maxZoom - scope.minZoom) / 2));\n }\n });\n }, true);\n\n scope.$watch('infoWindow', () => {\n log.verbose('Update map info window', scope.infoWindow);\n if (!scope.infoWindow) {\n infoWindow.close();\n return;\n }\n infoWindow.setContent(scope.infoWindow.content);\n if (scope.infoWindow.markerId && markers[scope.infoWindow.markerId]) {\n infoWindow.open(map, markers[scope.infoWindow.markerId]);\n } else {\n infoWindow.close();\n }\n }, true);\n },\n };\n },\n]);\n","app.directive('pModalCrop', [\n '$rootScope',\n 'CropRectPos',\n function (\n $rootScope,\n CropRectPos,\n ) {\n return {\n restrict: 'A',\n scope: {\n },\n template: `\n
    \n
    \n
    \n \n

    Crop Photo

    \n
    \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n \n
    \n
    \n `,\n link: function (scope, element) {\n scope.lang = $rootScope.lang;\n const svg = element.find('svg');\n const image = svg.find('image');\n\n let view = {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n };\n let resizing = false;\n let moving = false;\n let movingOffset = null;\n let cropRectPos = null;\n\n const cropRect = element.find('.p-crop-rect');\n const cropRectDebug = element.find('.p-crop-rect-debug');\n const cropRectGrid = element.find('.p-crop-grid');\n const cropOverlay = element.find('.p-crop-overlay');\n const cropRectTl = element.find('.p-crop-rect-handle-tl');\n const cropRectTr = element.find('.p-crop-rect-handle-tr');\n const cropRectBl = element.find('.p-crop-rect-handle-bl');\n const cropRectBr = element.find('.p-crop-rect-handle-br');\n const updateCropRect = () => {\n cropRectDebug.attr({\n x: cropRectPos.x,\n y: cropRectPos.y,\n width: cropRectPos.width,\n height: cropRectPos.height,\n }).show();\n const aspect = cropRectPos.getAspectRect();\n cropRect.attr({\n x: aspect.x,\n y: aspect.y,\n width: aspect.width,\n height: aspect.height,\n });\n cropRectGrid.css({\n transform: `translate(${aspect.x}px, ${aspect.y}px) scale(${aspect.width / 100}, ${aspect.height / 100})`,\n });\n const handleSize = 25;\n const padding = 7;\n cropRectTl.css({\n transform: `translate(${aspect.x - padding}px, ${aspect.y - padding}px) scaleX(1)`,\n });\n cropRectTr.css({\n transform: `translate(${aspect.x + aspect.width - handleSize + padding}px, ${aspect.y - padding}px) scaleX(-1)`,\n });\n cropRectBl.css({\n transform: `translate(${aspect.x - padding}px, ${aspect.y + aspect.height - handleSize + padding}px) scaleY(-1)`,\n });\n cropRectBr.css({\n transform: `translate(${aspect.x + aspect.width - handleSize + padding}px, ${aspect.y + aspect.height - handleSize + padding}px) scaleX(-1) scaleY(-1)`,\n });\n };\n\n const transformEventPos = (e) => {\n const point = svg[0].createSVGPoint();\n if (e.originalEvent.touches) {\n point.x = e.originalEvent.touches[0].clientX;\n point.y = e.originalEvent.touches[0].clientY;\n } else {\n point.x = e.clientX;\n point.y = e.clientY;\n }\n return point.matrixTransform(svg[0].getScreenCTM().inverse());\n };\n\n const pointDistance = (x1, y1, x2, y2) => {\n return Math.sqrt((x2 -= x1) * x2 + (y2 -= y1) * y2);\n };\n\n const isCloseTo = (x1, y1, x2, y2, smallestSide) => {\n const distance = pointDistance(x1, y1, x2, y2);\n const percent = distance / smallestSide;\n return percent < 0.25;\n };\n\n const getDraggableRegion = (point) => {\n const aspect = cropRectPos.getAspectRect();\n const smallestSide = aspect.width > aspect.height ? aspect.height : aspect.width;\n\n if (isCloseTo(point.x, point.y, aspect.x, aspect.y, smallestSide)) {\n return 'top-left';\n }\n if (isCloseTo(point.x, point.y, aspect.x + aspect.width, aspect.y, smallestSide)) {\n return 'top-right';\n }\n if (isCloseTo(point.x, point.y, aspect.x, aspect.y + aspect.height, smallestSide)) {\n return 'bottom-left';\n }\n if (isCloseTo(point.x, point.y, aspect.x + aspect.width, aspect.y + aspect.height, smallestSide)) {\n return 'bottom-right';\n }\n if (point.x >= aspect.x &&\n point.y >= aspect.y &&\n point.x <= aspect.x + aspect.width &&\n point.y <= aspect.y + aspect.height) {\n return 'center';\n }\n\n return null;\n };\n\n svg.on('mousedown touchstart', (e) => {\n if (e.type != 'touchstart' && e.which != 1) {\n return;\n }\n const point = transformEventPos(e);\n const draggableRegion = getDraggableRegion(point);\n\n switch (draggableRegion) {\n case 'center':\n moving = true;\n movingOffset = {\n x: (cropRectPos.width) / 2 - (point.x - cropRectPos.x),\n y: (cropRectPos.height) / 2 - (point.y - cropRectPos.y),\n };\n break;\n case 'top-left':\n resizing = true;\n cropRectPos.fixedX = cropRectPos.x + cropRectPos.width;\n cropRectPos.fixedY = cropRectPos.y + cropRectPos.height;\n cropRectPos.floatX = point.x;\n cropRectPos.floatY = point.y;\n updateCropRect();\n break;\n case 'top-right':\n resizing = true;\n cropRectPos.fixedX = cropRectPos.x;\n cropRectPos.fixedY = cropRectPos.y + cropRectPos.height;\n cropRectPos.floatX = point.x;\n cropRectPos.floatY = point.y;\n updateCropRect();\n break;\n case 'bottom-left':\n resizing = true;\n cropRectPos.fixedX = cropRectPos.x + cropRectPos.width;\n cropRectPos.fixedY = cropRectPos.y;\n cropRectPos.floatX = point.x;\n cropRectPos.floatY = point.y;\n updateCropRect();\n break;\n case 'bottom-right':\n resizing = true;\n cropRectPos.fixedX = cropRectPos.x;\n cropRectPos.fixedY = cropRectPos.y;\n cropRectPos.floatX = point.x;\n cropRectPos.floatY = point.y;\n updateCropRect();\n break;\n default:\n if (point.x > view.x && point.y > view.y && point.x < view.x + view.width && point.y < view.y + view.height) {\n resizing = true;\n cropRectPos.fixedX = point.x;\n cropRectPos.fixedY = point.y;\n cropRectPos.floatX = point.x + 1;\n cropRectPos.floatY = point.y + 1;\n updateCropRect();\n }\n break;\n }\n });\n\n const endDrag = () => {\n if (resizing) {\n const aspect = cropRectPos.getAspectRect();\n cropRectPos.fixedX = aspect.x;\n cropRectPos.fixedY = aspect.y;\n cropRectPos.floatX = aspect.x + aspect.width;\n cropRectPos.floatY = aspect.y + aspect.height;\n updateCropRect();\n }\n moving = false;\n resizing = false;\n cropRectDebug.hide();\n };\n\n $('.p-modal-crop').on('mousemove touchmove', (e) => {\n if (e.buttons !== undefined && e.buttons !== 1 && e.type != 'touchmove') {\n endDrag();\n }\n const point = transformEventPos(e);\n const draggableRegion = getDraggableRegion(point);\n switch (draggableRegion) {\n case 'center':\n svg.css('cursor', 'move');\n break;\n case 'top-left':\n svg.css('cursor', 'nwse-resize');\n break;\n case 'top-right':\n svg.css('cursor', 'nesw-resize');\n break;\n case 'bottom-left':\n svg.css('cursor', 'nesw-resize');\n break;\n case 'bottom-right':\n svg.css('cursor', 'nwse-resize');\n break;\n default:\n if ($(e.target).closest('.p-crop-image, .p-crop-ui').length) {\n svg.css('cursor', 'crosshair');\n } else {\n svg.css('cursor', '');\n }\n break;\n }\n\n if (moving) {\n const pointOffset = {\n x: point.x + movingOffset.x,\n y: point.y + movingOffset.y,\n };\n const aspect = cropRectPos.getAspectRect();\n const offsetX = aspect.width / 2;\n const offsetY = aspect.height / 2;\n cropRectPos.fixedX = pointOffset.x - offsetX;\n cropRectPos.fixedY = pointOffset.y - offsetY;\n cropRectPos.floatX = pointOffset.x + offsetX;\n cropRectPos.floatY = pointOffset.y + offsetY;\n if (cropRectPos.fixedX < view.x) {\n cropRectPos.floatX = view.x + aspect.width;\n cropRectPos.fixedX = view.x;\n }\n if (cropRectPos.fixedY < view.y) {\n cropRectPos.floatY = view.y + aspect.height;\n cropRectPos.fixedY = view.y;\n }\n if (cropRectPos.floatX > view.x + view.width) {\n cropRectPos.fixedX = view.x + view.width - aspect.width;\n cropRectPos.floatX = view.x + view.width;\n }\n if (cropRectPos.floatY > view.y + view.height) {\n cropRectPos.fixedY = view.y + view.height - aspect.height;\n cropRectPos.floatY = view.y + view.height;\n }\n updateCropRect();\n } else if (resizing) {\n if (point.x < view.x) {\n point.x = view.x;\n }\n if (point.y < view.y) {\n point.y = view.y;\n }\n if (point.x > view.x + view.width) {\n point.x = view.x + view.width;\n }\n if (point.y > view.y + view.height) {\n point.y = view.y + view.height;\n }\n cropRectPos.floatX = point.x;\n cropRectPos.floatY = point.y;\n updateCropRect();\n }\n });\n\n $(document).on('mouseup touchend', endDrag);\n\n scope.rotate = () => {\n cropRectPos.rotate();\n scope.updateImage(true);\n };\n\n scope.updateImage = (resetPosition = false) => {\n if (cropRectPos.rotation == 1 || cropRectPos.rotation == 3) {\n view.width = scope.lineItem.image.thumbnail.height;\n view.height = scope.lineItem.image.thumbnail.width;\n } else {\n view.width = scope.lineItem.image.thumbnail.width;\n view.height = scope.lineItem.image.thumbnail.height;\n }\n view.x = -view.width / 2;\n view.y = -view.height / 2;\n svg.attr({\n viewBox: `${view.x} ${view.y} ${view.width} ${view.height}`,\n width: view.width,\n height: view.height,\n });\n cropOverlay.attr({\n x: view.x,\n y: view.y,\n width: view.width,\n height: view.height,\n });\n image.attr({\n 'xlink:href': scope.lineItem.image.thumbnail.image.src,\n width: scope.lineItem.image.thumbnail.width,\n height: scope.lineItem.image.thumbnail.height,\n }).css({\n transformOrigin: `${scope.lineItem.image.thumbnail.width / 2}px ${scope.lineItem.image.thumbnail.height / 2}px`,\n transform: `translate(-${scope.lineItem.image.thumbnail.width / 2}px, -${scope.lineItem.image.thumbnail.height / 2}px) rotate(${cropRectPos.rotation * 90}deg)`,\n });\n\n cropRectPos.productSize = scope.lineItem.product.getProductSize();\n let cropWidth = view.width;\n let cropHeight = view.height;\n const ratio = view.width / view.height;\n const productRatio = cropRectPos.productWidth / cropRectPos.productHeight;\n if (ratio < productRatio) {\n cropHeight = cropRectPos.productHeight / cropRectPos.productWidth * view.width;\n } else {\n cropWidth = cropRectPos.productWidth / cropRectPos.productHeight * view.height;\n }\n if (resetPosition || (!cropRectPos.fixedX && !cropRectPos.fixedY && !cropRectPos.floatX && !cropRectPos.floatY)) {\n cropRectPos.fixedX = -cropWidth / 2;\n cropRectPos.fixedY = -cropHeight / 2;\n cropRectPos.floatX = cropRectPos.fixedX + cropWidth;\n cropRectPos.floatY = cropRectPos.fixedY + cropHeight;\n }\n updateCropRect();\n };\n\n scope.apply = () => {\n const aspect = cropRectPos.getAspectRect();\n let processedSvg = svg.clone();\n processedSvg.removeAttr('width');\n processedSvg.removeAttr('height');\n processedSvg.attr('viewBox', `${aspect.x} ${aspect.y} ${aspect.width} ${aspect.height}`);\n processedSvg.find('.p-crop-ui').remove();\n processedSvg = $('
    ').append(processedSvg).html();\n processedSvg = processedSvg.replace(/\\s+/g, ' ');\n scope.lineItem.svg = processedSvg;\n scope.lineItem.previewSvg = processedSvg;\n scope.lineItem.cropRectPos = cropRectPos;\n scope.closeModal();\n };\n\n scope.closeModal = () => {\n $rootScope.modalCrop = null;\n $rootScope.modalFrameFlow = null;\n };\n\n scope.togglePortrait = () => {\n cropRectPos.orientation = 'portrait';\n scope.updateImage(true);\n };\n\n scope.toggleLandscape = () => {\n cropRectPos.orientation = 'landscape';\n scope.updateImage(true);\n };\n\n $rootScope.$watch('modalCrop', (lineItem) => {\n scope.lineItem = lineItem;\n if (lineItem) {\n cropRectPos = scope.lineItem.cropRectPos || new CropRectPos();\n scope.cropRectPos = cropRectPos;\n if (!cropRectPos.orientation) {\n if (scope.lineItem.image.thumbnail.width > scope.lineItem.image.thumbnail.height) {\n cropRectPos.orientation = 'landscape';\n } else {\n cropRectPos.orientation = 'portrait';\n }\n }\n scope.updateImage();\n element.modal('show');\n } else {\n element.modal('hide');\n }\n });\n },\n };\n },\n]);\n","app.directive('pModalFrameFlow', [\n '$rootScope',\n 'cart',\n 'svg',\n 'frameHelpers',\n function (\n $rootScope,\n cart,\n svg,\n frameHelpers,\n ) {\n return {\n restrict: 'A',\n scope: {\n },\n template: window.appTemplates.FRAME_FLOW_MODAL,\n link: function (scope, element) {\n scope.lineItem = null;\n scope.file = null;\n scope.showProductsDraw = false;\n scope.frames = [];\n scope.products = [];\n\n scope.rotate = function () {\n if (scope.lineItem.settings.rotate === 360) {\n scope.lineItem.settings.rotate = 90;\n } else {\n scope.lineItem.settings.rotate += 90;\n }\n\n applyImageUpdates();\n };\n\n scope.rotateFrame = function (orientation) {\n const frame = frameHelpers.getCurrentFrame(scope.lineItem, orientation);\n\n if (! frame || frame.orientation == scope.lineItem.settings.orientation) {\n return;\n }\n\n scope.lineItem.settings.orientation = frame.orientation;\n wrapper.html(frameHelpers.render(scope.lineItem));\n };\n\n scope.reset = function () {\n scope.lineItem.settings.x = scope.defaults.x;\n scope.lineItem.settings.y = scope.defaults.y;\n scope.lineItem.settings.width = scope.defaults.width;\n scope.lineItem.settings.height = scope.defaults.height;\n scope.lineItem.settings.scale = scope.defaults.scale;\n scope.lineItem.settings.rotate = scope.defaults.rotate;\n applyImageUpdates();\n };\n\n scope.close = function close() {\n let frame = frameHelpers.getCurrentFrame(scope.lineItem);\n let processedSvg = frameHelpers.extractPhotoSvg(wrapper.find('svg'), frameHelpers.getCurrentFrame(scope.lineItem));\n processedSvg = processedSvg.replace(/\\s+/g, ' ');\n scope.lineItem.previewSvg = frameHelpers.render(scope.lineItem);\n scope.lineItem.svg = processedSvg;\n // FIX: make sure orientation is correct when sent to server\n scope.lineItem.cropRectPos = {\n orientation: frame.isPortrait ? 'portrait' : 'landscape',\n };\n $rootScope.closeModal();\n };\n\n scope.selectProduct = function (product) {\n scope.lineItem.setProduct(product);\n scope.frames = frameHelpers.getFrames(scope.lineItem);\n\n wrapper.html(frameHelpers.render(scope.lineItem));\n };\n\n scope.$watch('lineItem.settings.scale', () => {\n applyImageUpdates();\n });\n\n scope.$watch('file', file => {\n if (!file) return;\n\n const image = cart.addImage(file);\n\n if (! image) {\n return;\n }\n\n scope.lineItem.loading = true;\n scope.lineItem.setImage(image);\n image.thumbnail.load.then(() => {\n scope.lineItem.loading = false;\n svg.setImageUrl(wrapper.find('[data-element=photo]'), scope.lineItem.image.getSrc());\n scope.reset();\n });\n });\n\n $rootScope.$watch('modalFrameFlow', lineItem => {\n if (! lineItem) {\n scope.lineItem = null;\n element.modal('hide');\n return;\n }\n\n element.modal('show');\n scope.products = getProducts(lineItem);\n scope.frames = frameHelpers.getFrames(lineItem);\n scope.defaults = frameHelpers.getPhotoDefaults(frameHelpers.getCurrentFrame(lineItem), lineItem.image);\n scope.lineItem = lineItem;\n\n wrapper.html(frameHelpers.render(lineItem));\n });\n\n let mouseDown, mouseX, mouseY, offset, wrapper;\n\n $(document).on('mouseup touchend', () => {\n mouseDown = false;\n });\n wrapper = $('#p-frame-editor-wrapper');\n wrapper.on('mousedown touchstart', evt => {\n if (('which' in evt && evt.which == 1) || evt.button == 1 || evt.originalEvent.touches[0]) {\n if (evt.target.getAttribute('data-element') == 'photo') {\n evt.preventDefault();\n mouseDown = true;\n\n offset = getMousePosition(evt);\n\n offset.x -= scope.lineItem.settings.x;\n offset.y -= scope.lineItem.settings.y;\n }\n }\n });\n wrapper.on('mousemove touchmove', evt => {\n if (mouseDown) {\n evt.preventDefault();\n const { x, y } = getMousePosition(evt);\n\n scope.lineItem.settings.x = (x - offset.x);\n scope.lineItem.settings.y = (y - offset.y);\n\n applyImageUpdates();\n }\n });\n\n function getProducts (lineItem) {\n return lineItem.getAvailableProducts().filter(product => {\n return product.productImages.filter(img => img.metaData.frame).length > 0;\n });\n }\n\n function applyImageUpdates() {\n wrapper.find('svg [data-element=photo]').css({\n transformOrigin: 'center center',\n transformBox: 'fill-box',\n transform: `\n translate(${scope.lineItem.settings.x}px, ${scope.lineItem.settings.y}px)\n scale(${scope.lineItem.settings.scale})\n rotate(${scope.lineItem.settings.rotate}deg)\n `,\n });\n }\n\n function getMousePosition(evt) {\n mouseX = evt.pageX || evt.originalEvent.touches[0].pageX;\n mouseY = evt.pageY || evt.originalEvent.touches[0].pageY;\n\n const CTM = wrapper.find('svg')[0].getScreenCTM();\n\n return {\n x: (mouseX - CTM.e) / CTM.a,\n y: (mouseY - CTM.f) / CTM.d,\n };\n }\n },\n };\n },\n]);\n\n","app.directive('pModalImage', [\n 'thumbnailer',\n function (\n thumbnailer,\n ) {\n return {\n restrict: 'A',\n replace: true,\n scope: {\n image: '=pModalImage',\n },\n link: function (scope, element) {\n scope.$watch('image', (image) => {\n element.hide();\n if (!image) {\n return;\n }\n let resized = thumbnailer.addFile(image.file);\n resized.load.then(() => {\n let width = resized.width;\n let height = resized.height;\n if (resized.width > 800) {\n height = (height / width) * 800;\n width = 800;\n }\n if (resized.height > 800) {\n width = (width / height) * 800;\n height = 800;\n }\n const context = element[0].getContext('2d');\n element[0].width = width;\n element[0].height = height;\n thumbnailer.drawImageCover(context, resized.canvas);\n element.show();\n });\n });\n },\n };\n },\n]);\n","app.directive('pPagination', [\n 'log',\n function (\n log,\n ) {\n return {\n restrict: 'A',\n scope: {\n page: '=pPagination',\n totalItems: '=pPaginationTotalItems',\n itemsPerPage: '=pPaginationItemsPerPage',\n scrollTo: '=pPaginationScrollTo',\n change: '&pPaginationChange',\n },\n template: `\n
      1\">\n
    • \n Previous\n
    • \n
    • \n {{ p }}\n
    • \n
    • \n Next\n
    • \n
    \n `,\n link: function (scope) {\n scope.page = scope.page || 1;\n\n const updatePages = () => {\n log.debug('Updating pagination', scope.totalItems, scope.itemsPerPage, scope.page, scope.scrollTo);\n scope.pages = [];\n let startPage = Math.max(1, scope.page - 2);\n const endPage = Math.min(startPage + 4, scope.lastPage);\n if (endPage >= scope.lastPage - 1) {\n startPage = Math.max(1, endPage - 4);\n }\n for (let i = startPage; i <= endPage; i++) {\n scope.pages.push(i);\n }\n if (scope.scrollTo) {\n const offsetTop = $(scope.scrollTo).offset().top - 30;\n if ($('html').scrollTop() > offsetTop) {\n $('html').scrollTop(offsetTop);\n }\n }\n };\n\n scope.$watch('page', () => {\n updatePages();\n });\n\n scope.$watch('totalItems', () => {\n scope.lastPage = Math.ceil(scope.totalItems / scope.itemsPerPage);\n updatePages();\n });\n\n scope.gotoPage = (pageNumber) => {\n scope.page = pageNumber;\n updatePages();\n };\n\n scope.nextPage = () => {\n if (scope.page == scope.lastPage) return;\n scope.page += 1;\n updatePages();\n };\n\n scope.prevPage = () => {\n if (scope.page == 1) return;\n scope.page -= 1;\n updatePages();\n };\n },\n };\n },\n]);\n","app.directive('pStripeCard', [\n 'config',\n '$rootScope',\n function (\n config,\n $rootScope\n ) {\n return {\n restrict: 'A',\n scope: {\n },\n link: function () {\n if (config.api.stripe.key) {\n $rootScope.stripe = Stripe(config.api.stripe.key);\n const elements = $rootScope.stripe.elements({\n locale: config.language,\n });\n $rootScope.card = elements.create('card', {\n hidePostalCode: true,\n style: {\n base: {\n color: '#32325d',\n fontFamily: '\"Helvetica Neue\", Helvetica, sans-serif',\n fontSmoothing: 'antialiased',\n fontSize: '16px',\n '::placeholder': {\n color: '#aab7c4',\n },\n },\n invalid: {\n color: '#fa755a',\n iconColor: '#fa755a',\n },\n },\n });\n $rootScope.card.mount('#card-element');\n }\n },\n };\n },\n]);\n","app.directive('pTemplatePreview', [\n 'svg',\n function (\n svg,\n ) {\n return {\n restrict: 'A',\n scope: {\n svg: '=pTemplatePreview',\n samplePhoto: '=pTemplatePreviewSamplePhoto',\n },\n link: function (scope, element) {\n element\n .addClass('p-template-preview')\n .html(scope.svg);\n if (scope.samplePhoto) {\n element.find('.p-template-image').each(function () {\n const data = $(this).data('region');\n const svgImage = svg('image')\n .attr(data.box)\n .attr('preserveAspectRatio', 'xMidYMid slice')\n .appendTo(this);\n svg.setImageUrl(svgImage, scope.samplePhoto);\n });\n }\n },\n };\n },\n]);\n","app.filter('distance', [\n '$rootScope',\n function (\n $rootScope,\n ) {\n return function (store) {\n let territory = $rootScope.territories ? $rootScope.territories.find(territory => territory.id == store.attributes.territory_id) : null;\n let amount = store.meta.distance;\n if (amount === null) {\n return '';\n }\n if (territory && territory.attributes.country_code == 'US') {\n switch (Math.round(amount)) {\n case 0:\n return 'less than 1 mile away';\n case 1:\n return '1 mile away';\n }\n return Math.round(amount) + ' miles away';\n }\n amount = amount * 1.609344;\n switch (Math.round(amount)) {\n case 0:\n return 'less than 1 km away';\n case 1:\n return '1 km away';\n }\n return Math.round(amount) + ' km\\'s away';\n };\n },\n]);\n","app.filter('floor', [\n function (\n ) {\n return function (value) {\n return Math.floor(value);\n };\n },\n]);\n","app.filter('money', [\n 'cart',\n 'config',\n function (\n cart,\n config,\n ) {\n const currencySymbols = {\n EUR: '€', // Euro\n CRC: '₡', // Costa Rican Colón\n GBP: '£', // British Pound Sterling\n ILS: '₪', // Israeli New Sheqel\n INR: '₹', // Indian Rupee\n JPY: '¥', // Japanese Yen\n KRW: '₩', // South Korean Won\n NGN: '₦', // Nigerian Naira\n PHP: '₱', // Philippine Peso\n PLN: 'zł', // Polish Zloty\n PYG: '₲', // Paraguayan Guarani\n THB: '฿', // Thai Baht\n UAH: '₴', // Ukrainian Hryvnia\n VND: '₫', // Vietnamese Dong\n ZAR: 'R', // South African Rand\n BRL: 'R$', // Brazilian real\n };\n\n return function (amount) {\n if (amount === null || amount === undefined) {\n amount = 0;\n }\n\n let currency = cart.getCurrency();\n let currencySymbol = '$';\n if (config.locale.currencySymbol) {\n currencySymbol = config.locale.currencySymbol;\n } else if (currencySymbols[currency]) {\n currencySymbol = currencySymbols[currency];\n }\n\n let result = currencySymbol + ' ' + (Math.round(amount * 100) / 100).toFixed(2);\n if (config.locale.showCurrencySuffix) {\n result += ' ' + cart.getCurrency();\n }\n return result;\n };\n },\n]);\n","app.filter('percent', function() {\n return function(percent) {\n return Math.round(percent * 100) + ' %';\n };\n});\n","app.filter('reverse', function () {\n return function (items) {\n return items.slice().reverse();\n };\n});","app.filter('trustedHtml', [\n '$sce',\n function($sce) {\n return function(html) {\n return $sce.trustAsHtml(html);\n };\n },\n]);\n\napp.filter('html', [\n '$sce',\n function($sce) {\n return function(html) {\n return $sce.trustAsHtml(html);\n };\n },\n]);\n","app.factory('Address', [\n 'BaseModel',\n function (\n BaseModel,\n ) {\n return class Address extends BaseModel {\n static isType(type) {\n return type == 'addresses' || type == 'address';\n }\n\n static createInstance(id, type, attributes, relationships, included, meta) {\n return super.createInstance(id, type, attributes, relationships, included, meta);\n }\n };\n },\n]);\n","app.factory('api', [\n '$rootScope',\n '$q',\n '$http',\n 'config',\n 'log',\n 'exception',\n function (\n $rootScope,\n $q,\n $http,\n config,\n log,\n exception,\n ) {\n return new class Api {\n constructor() {\n if (config.api.printicular.environment == 'production') {\n this.apiUrl = 'https://api.printicular.com/';\n } else if (config.api.printicular.environment == 'production-cache') {\n this.apiUrl = 'https://capi.printicular.com/';\n } else if (config.api.printicular.environment == 'staging') {\n this.apiUrl = 'https://stagingapi.printicular.com/';\n } else if (config.api.printicular.environment == 'staging-cache') {\n this.apiUrl = 'https://stagingcapi.printicular.com/';\n } else {\n this.apiUrl = config.api.printicular.url;\n }\n this.apiUrl += 'api/1.0/';\n log.verbose('API URL', config.api.printicular.environment, this.apiUrl);\n }\n\n request(method, url, data) {\n return $q((resolve, reject) => {\n log.verbose('API request', method, this.apiUrl + url, data);\n $http({\n method: method,\n url: this.apiUrl + url,\n data: data,\n headers: {\n Authorization: 'Bearer ' + config.api.printicular.clientId,\n },\n }).then((response) => {\n if (response.data && response.data.error) {\n log.verbose('API error', method, this.apiUrl + url, data, response);\n reject(response.data.error);\n return;\n }\n log.verbose('API response', method, this.apiUrl + url, data, response);\n resolve(response.data);\n }, (response) => {\n log.verbose('API failure', method, this.apiUrl + url, data, response);\n if (response.data && response.data.error) {\n reject(response.data.error);\n } else {\n reject(response);\n }\n });\n });\n }\n\n get(url, parameters) {\n if (parameters) {\n url += '?' + $.param(parameters);\n }\n return this.request('get', url);\n }\n\n post(url, data) {\n return this.request('post', url, data);\n }\n\n put(url, data) {\n return this.request('put', url, data);\n }\n\n patch(url, data) {\n return this.request('patch', url, data);\n }\n\n param(name) {\n name = name.replace(/[[\\]]/g, '\\\\$&');\n const url = window.location.href;\n const regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)');\n const results = regex.exec(url);\n if (!results) {\n return null;\n }\n if (!results[2]) {\n return '';\n }\n return decodeURIComponent(results[2].replace(/\\+/g, ' '));\n }\n\n gets3Resource() {\n log.verbose('Get S3 resource');\n return this.get('users/0/s3Resource?deviceToken=' + config.deviceToken, null).catch(error => {\n const message = 'Could not get upload token, please try reloading the page.';\n\n exception.report(message, error);\n\n $rootScope.majorError = message;\n });\n }\n };\n },\n]);\n","app.factory('apiv2', [\n '$q',\n '$http',\n 'config',\n 'log',\n 'login',\n function (\n $q,\n $http,\n config,\n log,\n login,\n ) {\n return new class ApiV2 {\n constructor() {\n if (config.api.printicular.environment == 'production') {\n this.apiUrl = 'https://api.printicular.com/';\n } else if (config.api.printicular.environment == 'production-cache') {\n this.apiUrl = 'https://capi.printicular.com/';\n } else if (config.api.printicular.environment == 'staging') {\n this.apiUrl = 'https://stagingapi.printicular.com/';\n } else if (config.api.printicular.environment == 'staging-cache') {\n this.apiUrl = 'https://stagingcapi.printicular.com/';\n } else {\n this.apiUrl = config.api.printicular.url;\n }\n this.apiUrl += 'api/v2/';\n log.debug('APIv2 URL', config.api.printicular.environment, this.apiUrl);\n\n if (login.loginToken) {\n this.post('client/account/resume', {\n data: {\n type: 'ResumeLogin',\n attributes: {\n deviceId: config.deviceToken,\n },\n },\n }).then(() => {\n // Success, do nothing\n }).catch((error) => {\n log.debug(error);\n login.loginToken = null;\n });\n }\n }\n\n request(method, url, data) {\n return $q((resolve, reject) => {\n const loginToken = login.loginToken || config.api.printicular.clientId;\n const headers = {\n Authorization: 'Bearer ' + loginToken,\n };\n log.debug('APIv2 request', method, this.apiUrl + url, data);\n $http({\n method: method,\n url: this.apiUrl + url,\n data: data,\n headers: headers,\n }).then((response) => {\n if (response.data && response.data.error) {\n log.debug('APIv2 error', method, this.apiUrl + url, data, response);\n reject(response.data.error);\n return;\n }\n log.debug('APIv2 response', method, this.apiUrl + url, data, response);\n resolve(response.data);\n }, (response) => {\n log.debug('APIv2 failure', method, this.apiUrl + url, data, response);\n if (response.data && response.data.error) {\n reject(response.data.error);\n } else {\n reject(response);\n }\n });\n });\n }\n\n get(url, parameters) {\n if (parameters) {\n url += '?' + $.param(parameters);\n }\n return this.request('get', url);\n }\n\n post(url, data) {\n return this.request('post', url, data);\n }\n };\n },\n]);\n","app.factory('BaseModel', [\n 'log',\n function (\n log,\n ) {\n const toCamelCase = (name) => {\n return name.charAt(0).toLowerCase() + name.slice(1);\n };\n\n const toSpaceCase = (name) => {\n return name.replace(/(?:^|\\.?)([A-Z])/g, (x, y) => ' ' + y.toLowerCase()).replace(/^ /, '');\n };\n\n const toDashCase = (name) => {\n return name.replace(/(?:^|\\.?)([A-Z])/g, (x, y) => '-' + y.toLowerCase()).replace(/^-/, '');\n };\n\n const BaseModel = class {\n constructor() {\n this.type = this.constructor.type;\n this.attributes = {};\n this.relationships = {};\n this.meta = {};\n this.included = [];\n }\n\n static fromJsonApi(modelData, includedData) {\n const model = new this();\n model.id = modelData.id;\n model.attributes = modelData.attributes;\n model.relationships = modelData.relationships;\n model.meta = includedData.meta;\n model.included = includedData.included;\n return model;\n }\n\n static get camelCase() {\n return toCamelCase(this.type);\n }\n\n static get spaceCase() {\n return toSpaceCase(this.type);\n }\n\n static get dashCase() {\n return toDashCase(this.type);\n }\n\n static get paramName() {\n return this.dashCase;\n }\n\n static mapModel(response) {\n if (!response) {\n log.debug('Tried to map a model to a null response', response);\n return null;\n }\n if (Array.isArray(response.data)) {\n if (!response.data.length) {\n return null;\n }\n const result = [];\n for (const data of response.data) {\n result.push(this.createInstance(data.id, data.type, data.attributes, data.relationships, response.included, data.meta));\n }\n return result;\n }\n return this.createInstance(response.data.id, response.data.type, response.data.attributes, response.data.relationships, response.included, response.data.meta);\n }\n\n static createInstance(id, type, attributes, relationships, included, meta) {\n const instance = new this();\n instance.id = id;\n instance.type = type;\n instance.attributes = attributes;\n instance.relationships = relationships;\n instance.included = included;\n instance.meta = meta;\n return instance;\n }\n\n findRelated(relationship, model) {\n if (!this.included || !this.relationships[relationship] || !this.relationships[relationship].data || !this.relationships[relationship].data.id) {\n return null;\n }\n const data = this.included.find((included) => {\n return included.id == this.relationships[relationship].data.id && model.isType(included.type.toLowerCase());\n });\n if (!data) {\n return null;\n }\n return model.createInstance(data.id, data.type, data.attributes, data.relationships, this.included, data.meta);\n }\n\n findAllRelated(relationships, model) {\n if (!Array.isArray(relationships)) {\n relationships = [relationships];\n }\n for (const relationship of relationships) {\n if (!this.included || !this.relationships || !this.relationships[relationship] || !this.relationships[relationship].data || !this.relationships[relationship].data.length) {\n continue;\n }\n return this.included.filter((included) => {\n return model.isType(included.type.toLowerCase()) && this.relationships[relationship].data.find(related => related.id == included.id && model.isType(related.type.toLowerCase()));\n }).map((data) => {\n return model.createInstance(data.id, data.type, data.attributes, data.relationships, this.included, data.meta);\n });\n }\n return [];\n }\n };\n\n return BaseModel;\n },\n]);\n","app.factory('Image', [\n 'BaseModel',\n function (\n BaseModel,\n ) {\n return class Image extends BaseModel {\n static isType(type) {\n return type == 'images' || type == 'image';\n }\n\n static createInstance(id, type, attributes, relationships, included, meta) {\n const image = super.createInstance(id, type, attributes, relationships, included, meta);\n return image;\n }\n };\n },\n]);\n","app.factory('LineItem', [\n 'BaseModel',\n 'Product',\n 'Image',\n function (\n BaseModel,\n Product,\n Image,\n ) {\n return class LineItem extends BaseModel {\n static isType(type) {\n return type == 'line_items' || type == 'lineitem';\n }\n\n static createInstance(id, type, attributes, relationships, included, meta) {\n const lineItem = super.createInstance(id, type, attributes, relationships, included, meta);\n lineItem.product = lineItem.findRelated('product', Product);\n lineItem.processedImage = lineItem.findRelated('processedImage', Image);\n lineItem.attributes.total = parseFloat(lineItem.attributes.total);\n return lineItem;\n }\n\n formatName() {\n return this.product ? this.product.formatName() : 'Line Item #' + this.id;\n }\n };\n },\n]);\n","app.factory('Location', [\n 'BaseModel',\n 'Store',\n function (\n BaseModel,\n Store,\n ) {\n return class Location extends BaseModel {\n static isType(type) {\n return type == 'Location';\n }\n\n get stores() {\n if (!this._stores) {\n this._stores = this.findAllRelated('stores', Store);\n }\n return this._stores;\n }\n };\n },\n]);\n","app.factory('Order', [\n 'BaseModel',\n 'Address',\n 'LineItem',\n 'Store',\n function (\n BaseModel,\n Address,\n LineItem,\n Store,\n ) {\n return class Order extends BaseModel {\n static isType(type) {\n return type == 'orders' || type == 'order';\n }\n\n static createInstance(id, type, attributes, relationships, included, meta) {\n const order = super.createInstance(id, type, attributes, relationships, included, meta);\n order.store = order.findRelated('store', Store);\n order.address = order.findRelated('address', Address);\n order.lineItems = order.findAllRelated('lineItems', LineItem);\n order.attributes.total = parseFloat(order.attributes.total);\n order.attributes.subtotalDiscount = parseFloat(order.attributes.subtotalDiscount);\n order.attributes.freight = parseFloat(order.attributes.freight);\n order.attributes.freightDiscount = parseFloat(order.attributes.freightDiscount);\n return order;\n }\n };\n },\n]);\n","app.factory('Price', [\n 'BaseModel',\n function (\n BaseModel,\n ) {\n return class Price extends BaseModel {\n static isType(type) {\n return type == 'prices' || type == 'price';\n }\n };\n },\n]);\n","app.factory('PrintService', [\n '$q',\n '$http',\n 'api',\n 'Product',\n 'BaseModel',\n 'log',\n function (\n $q,\n $http,\n api,\n Product,\n BaseModel,\n log,\n ) {\n return class PrintService extends BaseModel {\n static isType(type) {\n return type == 'print_services' || type == 'printservice';\n }\n\n static async findById(printServiceId, productTags = null) {\n const requestOptions = {\n include: 'products.prices',\n };\n\n // Check for product tags\n if (productTags && productTags.length) {\n productTags = productTags.map(productTag => productTag.name);\n productTags.push('null');\n\n requestOptions['filter[tags]'] = productTags.join(',');\n }\n\n const response = await api.get(\n `clients/this/printServices/${printServiceId}`,\n requestOptions\n );\n\n const printService = PrintService.mapModel(response);\n if (!printService) {\n log.error('Could not find print service: ' + printServiceId);\n return;\n }\n\n return printService;\n }\n\n get products() {\n if (!this._products) {\n this._products = this.findAllRelated('products', Product);\n }\n return this._products;\n }\n };\n },\n]);\n","app.factory('ProductImage', [\n 'BaseModel',\n function (\n BaseModel,\n ) {\n return class ProductImage extends BaseModel {\n static isType(type) {\n return type == 'product_images' || type == 'productimage';\n }\n\n get metaData() {\n return this.attributes.meta_data || {};\n }\n };\n },\n]);\n","app.factory('ProductTag', [\n 'BaseModel',\n function (\n BaseModel,\n ) {\n return class ProductTag extends BaseModel {\n static isType(type) {\n return type == 'product_tags' || type == 'producttag';\n }\n };\n },\n]);\n","app.factory('Product', [\n 'BaseModel',\n 'Price',\n 'ProductTag',\n 'ProductImage',\n 'config',\n function (\n BaseModel,\n Price,\n ProductTag,\n ProductImage,\n config,\n ) {\n return class Product extends BaseModel {\n static isType(type) {\n return type == 'products' || type == 'product';\n }\n\n get prices() {\n if (!this._prices) {\n this._prices = this.findAllRelated('prices', Price);\n }\n return this._prices;\n }\n\n get productTags() {\n if (!this._productTags) {\n this._productTags = this.findAllRelated(['product_tags', 'productTags'], ProductTag);\n }\n return this._productTags;\n }\n\n get productImages() {\n if (!this._productImages) {\n this._productImages = this.findAllRelated(['product_images', 'productImages'], ProductImage);\n }\n return this._productImages;\n }\n\n hasTags(tags) {\n if (!this.productTags || !this.productTags.length) {\n return false;\n }\n\n for (const productTag of this.productTags) {\n let productTagName = productTag.attributes.name.toLowerCase();\n for (const tag of tags) {\n let tagName = tag.attributes ? tagName.attributes.name : tag.name;\n if (!tagName) {\n continue;\n }\n tagName = tagName.toLowerCase();\n\n if (productTagName === tagName) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n isPromoProduct() {\n return this.hasTags(config.promo.productTags);\n }\n\n getRelatedProducts(products) {\n return products.filter(product => {\n return product.formatName() === this.formatName();\n });\n }\n\n getProductSize() {\n let width = null;\n let height = null;\n let ratio = null;\n if (this.attributes.pixel_width && this.attributes.pixel_height) {\n width = this.attributes.pixel_width;\n height = this.attributes.pixel_height;\n } else if (this.attributes.metric && this.attributes.width && this.attributes.height) {\n width = (this.attributes.width / 25.4) * 300;\n height = (this.attributes.height / 25.4) * 300;\n } else if (this.attributes.width && this.attributes.height) {\n width = this.attributes.width * 300;\n height = this.attributes.height * 300;\n }\n\n ratio = width < height ? width / height : height / width;\n\n return {\n width,\n height,\n ratio,\n };\n }\n\n get printServiceSettings() {\n if (!this._printServiceSettings) {\n if (config.api.printicular.deliveryPrintService.id == this.attributes.print_service_id) {\n this._printServiceSettings = config.api.printicular.deliveryPrintService;\n } else {\n this._printServiceSettings = config.api.printicular.pickUpPrintServices.find(printService => printService.id == this.attributes.print_service_id);\n }\n if (!this._printServiceSettings) {\n this._printServiceSettings = {};\n }\n }\n return this._printServiceSettings;\n }\n\n get settings() {\n if (!this._settings) {\n this._settings = {};\n if (this.printServiceSettings && this.printServiceSettings.productSettings) {\n this._settings = this.printServiceSettings.productSettings[this.id] || {};\n }\n }\n return this._settings;\n }\n\n formatName() {\n return this.settings.name || this.attributes.short_description || this.attributes.name;\n }\n\n get enabled() {\n if (this.printServiceSettings.autoEnableProducts) {\n return true;\n }\n return this.settings.enabled;\n }\n\n get minRes() {\n return this.settings.minRes;\n }\n\n get sortOrder() {\n return this.settings.sortOrder;\n }\n\n get description() {\n return this.settings.description;\n }\n\n get categorySettings() {\n if (!this._categorySettings) {\n this._categorySettings = {};\n if (this.printServiceSettings && this.printServiceSettings.categorySettings) {\n this._categorySettings = this.printServiceSettings.categorySettings[this.attributes.category_id] || {};\n }\n }\n return this._categorySettings;\n }\n\n get limit() {\n return this.categorySettings.limit;\n }\n\n get categoryName() {\n return this.categorySettings.name || this.attributes.category_name;\n }\n\n get metaData() {\n return this.attributes.meta_data ? this.attributes.meta_data : {};\n }\n };\n },\n]);\n","app.factory('Store', [\n 'BaseModel',\n 'Product',\n 'cart',\n function (\n BaseModel,\n Product,\n cart,\n ) {\n return class Store extends BaseModel {\n static isType(type) {\n return type == 'stores' || type == 'store';\n }\n\n get products() {\n if (!this._products) {\n if (this.attributes.productCodes) {\n this._products = cart.getPrintServiceProducts().filter((printServiceProduct) => {\n return this.attributes.productCodes.indexOf(printServiceProduct.attributes.product_code) !== -1;\n });\n } else {\n this._products = this.findAllRelated('products', Product);\n }\n }\n return this._products;\n }\n\n hasCartProducts() {\n for (const productId of cart.lineItems.map(l => l.product.id)) {\n if (!productId) {\n continue;\n }\n if (!this.products.find(p => p.id == productId)) {\n return false;\n }\n }\n return true;\n }\n\n get printServiceId() {\n return this.attributes.print_service_id || this.relationships.printService.data.id;\n }\n\n createMapMarker() {\n // Hard code marker images because we don't have data to detect this currently\n let storeMarkerIcon = 'red';\n const markerIcons = [\n 'bartell',\n 'cvs',\n 'duane-reade',\n 'longs-drugs',\n 'navarro',\n 'target',\n 'walgreens-flag',\n 'walgreens',\n 'warehouse-stationery',\n ];\n for (const markerIcon of markerIcons) {\n const normalizedName = markerIcon.replace(/-/g, ' ');\n if (this.attributes.name.toLowerCase().indexOf(normalizedName) !== -1) {\n storeMarkerIcon = markerIcon;\n break;\n }\n }\n const iconUrl = `images/markers/${storeMarkerIcon}.png`;\n\n return {\n id: 'store-' + this.id,\n latitude: this.attributes.latitude,\n longitude: this.attributes.longitude,\n iconUrl,\n data: {\n store: this,\n },\n };\n }\n\n formatAddress() {\n const result = [];\n result.push(this.attributes.address || this.attributes.storeAddress1 || '');\n result.push('\\n');\n result.push(this.attributes.city || this.attributes.storeCity || '');\n result.push(this.attributes.postcode || this.attributes.storePostCode || '');\n return result.filter(part => part != '').join(' ');\n }\n };\n },\n]);\n","const breakpoints = {\n xs: [0, 575],\n sm: [576, 767],\n md: [768, 991],\n lg: [992],\n};\n\nfunction validateSize (size) {\n if (!breakpoints[size]) {\n throw new Error('Invaild breakpoint given. Valid sizes are ' + Object.keys(breakpoints).join(', '));\n }\n}\n\nconst browser = {\n isIe11: !!window.MSInputMethodContext && !!document['documentMode'],\n isSafari: /^((?!chrome|android).)*safari/i.test(navigator.userAgent),\n isAndroid: (navigator.userAgent.toLowerCase().indexOf('android') > -1),\n isIos: /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream,\n isSupported () {\n return !this.isUnsupported();\n },\n isUnsupported () {\n return (\n this.isIe11\n );\n },\n mediaBreakpointUp (size) {\n validateSize(size);\n return window.innerWidth >= breakpoints[size][0];\n },\n mediaBreakpointDown (size) {\n validateSize(size);\n const px = breakpoints[size][1] || breakpoints[size][0];\n return window.innerWidth < px;\n },\n\n breakpoint () {\n for (let key of Object.keys(breakpoints).reverse()) {\n if (this.mediaBreakpointUp(key)) {\n return key;\n }\n }\n\n return 'xl';\n },\n};\n\n\napp.factory('browser', [function () {\n return browser;\n}]);\n","app.factory('CartImageData', [\n 'CartImage',\n function (\n CartImage,\n ) {\n return class CartImageData extends CartImage {\n constructor(key, data, upload) {\n super(key, null, upload, null);\n this.data = data;\n }\n\n isErrored() {\n return this.upload.error;\n }\n };\n },\n]);\n","app.factory('CartImage', [\n function (\n ) {\n return class CartImage {\n constructor(key, file, upload, thumbnail) {\n this.key = key;\n this.file = file;\n this.upload = upload;\n this.thumbnail = thumbnail;\n }\n\n isReady() {\n if (this.upload.image && this.upload.image.data.id) {\n return true;\n }\n return false;\n }\n\n isStarted() {\n return this.upload.started;\n }\n\n isErrored() {\n return this.thumbnail.error || this.upload.error;\n }\n\n getProgress() {\n return this.upload.progress;\n }\n\n isCanvas() {\n return this.thumbnail.canvas ? true : false;\n }\n\n getSrc() {\n if (!this.thumbnail.image) {\n return null;\n }\n return this.thumbnail.image.src;\n }\n\n getWidth () {\n if (this.thumbnail && this.thumbnail.image) {\n return this.thumbnail.image.width || 0;\n }\n\n return 0;\n }\n\n getHeight () {\n if (this.thumbnail && this.thumbnail.image) {\n return this.thumbnail.image.height || 0;\n }\n\n return 0;\n }\n\n getImageId() {\n return this.upload.image.data.id;\n }\n\n getType() {\n if (this.file && this.file.type) {\n return this.file.type;\n }\n return 'image/jpeg';\n }\n\n canEnlarge() {\n return this.isCanvas() || this.getSrc();\n }\n\n getOrientation () {\n return this.getWidth() > this.getHeight() ? 'landscape' : 'portrait';\n }\n };\n },\n]);\n","app.factory('CartLineItemPage', [\n '$http',\n '$q',\n 'log',\n function (\n $http,\n $q,\n log,\n ) {\n return class CartLineItemPage {\n constructor({ name, icon, template, templates, alwaysShowLayouts }) {\n this.name = name;\n this.icon = icon;\n this.template = template;\n this.templates = templates;\n this.alwaysShowLayouts = alwaysShowLayouts;\n this.svg = null;\n this.loading = false;\n this.data = {};\n this.regions = {};\n }\n\n load() {\n log.debug('Loading page template', this.template);\n\n return $q((resolve, reject) => {\n if (this.template.svg) {\n resolve(this.template.svg);\n return;\n }\n\n this.loading = true;\n $http.get(this.template.url).then((response) => {\n this.loading = false;\n this.template.svg = response.data;\n\n\n resolve(this.template.svg);\n }, (error) => {\n this.loading = false;\n log.error('Failed to load page template.', error);\n reject(error);\n });\n });\n }\n\n setTemplate(template) {\n this.template = template;\n\n return this.load();\n }\n\n getRegion(element) {\n const elementData = $(element).data('region');\n if (!this.regions[elementData.id]) {\n this.regions[elementData.id] = elementData.input;\n }\n elementData.input = this.regions[elementData.id];\n return elementData;\n }\n\n get vertical() {\n return this.template.orientation == 'portrait';\n }\n };\n },\n]);\n","app.factory('CartLineItem', [\n '$rootScope',\n 'browser',\n 'config',\n 'gtm',\n 'log',\n 'Unique',\n function (\n $rootScope,\n browser,\n config,\n gtm,\n log,\n Unique,\n ) {\n return class CartLineItem {\n constructor({ cart, image, product = null, quantity = 1, settings = {}}) {\n this.id = Unique.inc('line-item');\n this.cart = cart;\n this.image = image;\n this.product = product;\n this.quantity = quantity;\n this.settings = settings;\n this._previewSvg = null;\n\n if (!this.product) {\n this.product = this.getDefaultProduct();\n }\n }\n\n get previewSvg () {\n return this._previewSvg || this.svg;\n }\n\n set previewSvg (svg) {\n this._previewSvg = svg;\n }\n\n changeQuantity() {\n if (this.quantity > config.maxQuantity) {\n this.quantity = config.maxQuantity;\n }\n if (this.quantity < 0) {\n this.quantity = 0;\n }\n this.cart.updateSummary();\n }\n\n increaseQuantity() {\n if (this.quantity < config.maxQuantity) {\n this.quantity++;\n }\n this.changeQuantity();\n }\n\n decreaseQuantity() {\n if (this.quantity > 0) {\n this.quantity--;\n }\n this.changeQuantity();\n }\n\n setProduct(product) {\n if (this.product && this.product.id == product.id) {\n return false;\n }\n log.debug('Setting product to ' + product.formatName());\n this.product = product;\n this.cropRectPos = null;\n this.svg = null;\n this._previewSvg = null;\n this.settings = {};\n\n if (product) {\n gtm.push({\n event: 'Select size',\n productName: product.formatName(),\n productId: product.id,\n });\n }\n this.cart.updateSummary();\n $rootScope.$broadcast('changeProduct');\n return true;\n }\n\n setImage(image) {\n this.image = image;\n }\n\n isLowRes() {\n if (!this.image || !this.image.thumbnail || !this.image.thumbnail.image || !this.product) {\n return;\n }\n if (this.getImageWidth() < this.getProductMinWidth() || this.getImageHeight() < this.getProductMinHeight()) {\n return true;\n }\n return false;\n }\n\n getProductMinWidth() {\n let threshold = this.product.minRes;\n if (!threshold) {\n return '?';\n }\n threshold = threshold / 100;\n const productSize = this.product.getProductSize();\n return Math.max(productSize.width, productSize.height) * threshold;\n }\n\n getProductMinHeight() {\n let threshold = this.product.minRes;\n if (!threshold) {\n return;\n }\n threshold = threshold / 100;\n const productSize = this.product.getProductSize();\n return Math.min(productSize.width, productSize.height) * threshold;\n }\n\n getProductWidth() {\n const productSize = this.product.getProductSize();\n return Math.max(productSize.width, productSize.height);\n }\n\n getProductHeight() {\n const productSize = this.product.getProductSize();\n return Math.min(productSize.width, productSize.height);\n }\n\n getImageWidth() {\n if (this.cropRectPos) {\n return Math.round(Math.max(this.cropRectPos.width, this.cropRectPos.height));\n }\n return Math.max(this.image.thumbnail.image.width, this.image.thumbnail.image.height);\n }\n\n getImageHeight() {\n if (this.cropRectPos) {\n return Math.round(Math.min(this.cropRectPos.width, this.cropRectPos.height));\n }\n return Math.min(this.image.thumbnail.image.width, this.image.thumbnail.image.height);\n }\n\n isAutoCropped() {\n if (this.cropRectPos || !this.product || !this.canCrop() || !this.image.thumbnail) {\n return false;\n }\n const productSize = this.product.getProductSize();\n const imageAspectRatio = this.image.thumbnail.width < this.image.thumbnail.height ? this.image.thumbnail.width / this.image.thumbnail.height : this.image.thumbnail.height / this.image.thumbnail.width;\n const productAspectRatio = productSize.width < productSize.height ? productSize.width / productSize.height : productSize.height / productSize.width;\n\n return Math.abs(imageAspectRatio - productAspectRatio) > 0.01;\n }\n\n canCrop() {\n if (browser.isIe11) {\n return false;\n }\n\n if (this.canEdit()) {\n return false;\n }\n\n return this.product ? true : false;\n }\n\n getImageType() {\n if (this.svg) {\n return 'svg';\n }\n if (this.image.isCanvas()) {\n return 'canvas';\n }\n return 'img';\n }\n\n getImageId() {\n return this.image.getImageId();\n }\n\n canChangeProduct() {\n return true;\n }\n\n canDuplicate() {\n return true;\n }\n\n canEdit() {\n return this.product.productImages.filter(img => !!img.attributes.meta_data.frame).length > 0;\n }\n\n edit() {\n if (this.canEdit()) {\n return $rootScope.openModal({\n name: 'modalFrameFlow',\n lineItem: this,\n });\n }\n\n if (this.canCrop()) {\n return $rootScope.cropLineItem(this);\n }\n }\n\n isErrored() {\n if (this.image && this.image.isErrored()) {\n return true;\n }\n return false;\n }\n\n isReady() {\n if (this.image && this.image.isReady()) {\n return true;\n }\n return false;\n }\n\n getOrderJson() {\n if (!this.quantity || !this.product || this.isErrored()) {\n return null;\n }\n let lineItemJson = {\n type: 'line_items',\n attributes: {\n product_id: this.product ? this.product.id : null,\n quantity: Math.min(this.quantity, config.maxQuantity),\n vertical: this.cropRectPos && this.cropRectPos.orientation == 'portrait' ? true : false,\n },\n };\n if (this.product.metaData.frame && this.product.metaData.frame.duplicateImage) {\n lineItemJson.attributes.image_ids = [\n this.getImageId(),\n this.getImageId(),\n ];\n } else if (this.getImageId()) {\n lineItemJson.attributes.image_id = this.getImageId();\n }\n\n if (this.svg) {\n lineItemJson.attributes.svg = this.svg.replace(/xlink:href=\".*?\"/, 'xlink:href=\"\"');\n }\n\n return lineItemJson;\n }\n\n getAvailableProducts() {\n const filter = (product) => {\n if (!product.enabled) {\n return false;\n }\n if (!product.prices.length) {\n return false;\n }\n return true;\n };\n if (this.cart.fulfillment === 'pickup' && config.flow !== 'products-first' && this.cart.store) {\n return this.cart.getStoreProducts()\n .filter(filter);\n }\n // Delivery or product first flow\n return this.cart.getPrintServiceProducts()\n .filter(filter);\n }\n\n getDefaultProduct() {\n const products = this.getAvailableProducts();\n if (this.product) {\n const defaultExistingProduct = products.find((product) => {\n return this.product.attributes.name == product.attributes.name;\n });\n if (defaultExistingProduct) {\n return defaultExistingProduct;\n }\n }\n for (const product of products) {\n return product;\n }\n log.debug('Could not find default product', this);\n }\n };\n },\n]);\n","// app.factory('CartPromoProductImage', [\n// function (\n// ) {\n// return class CartPromoProductImage {\n// constructor(key, product) {\n// this.key = key;\n// this.product = product;\n// }\n\n// isReady() {\n// return true;\n// }\n\n// isStarted() {\n// return true;\n// }\n\n// isErrored() {\n// return false;\n// }\n\n// getProgress() {\n// return 1;\n// }\n\n// isCanvas() {\n// return false;\n// }\n\n// isPromoProduct() {\n// return true;\n// }\n\n// canEnlarge() {\n// return true;\n// }\n\n// getImageId() {\n// return null;\n// }\n\n// getProductImageUrl() {\n// for (const productImage of this.product.productImages){\n// return productImage.attributes.thumbnail;\n// }\n// }\n// };\n// },\n// ]);\n","app.factory('CartReorderImage', [\n function (\n ) {\n return class CartReorderImage {\n constructor(key, thumbnailUrl, imageId) {\n this.key = key;\n this.thumbnailUrl = thumbnailUrl;\n this.imageId = imageId;\n }\n\n isReady() {\n return true;\n }\n\n isStarted() {\n return true;\n }\n\n isErrored() {\n return false;\n }\n\n getProgress() {\n return 1;\n }\n\n isCanvas() {\n return false;\n }\n\n isUpload() {\n return false;\n }\n\n canEnlarge() {\n return false;\n }\n\n getImageId() {\n return this.imageId;\n }\n\n getSrc() {\n return this.thumbnailUrl;\n }\n };\n },\n]);\n","app.factory('cart', [\n '$q',\n '$rootScope',\n '$timeout',\n 'api',\n 'CartImage',\n 'CartImageData',\n 'CartLineItem',\n 'CartReorderImage',\n 'config',\n 'gtm',\n 'imageUploader',\n 'Locale',\n 'log',\n 'Product',\n 'thumbnailer',\n function (\n $q,\n $rootScope,\n $timeout,\n api,\n CartImage,\n CartImageData,\n CartLineItem,\n CartReorderImage,\n config,\n gtm,\n imageUploader,\n Locale,\n log,\n Product,\n thumbnailer,\n ) {\n let nextId = 1;\n\n const Cart = class {\n constructor() {\n this.lineItems = [];\n this.images = {};\n this.summary = {};\n this.store = null;\n this.deliveryProducts = null;\n this.pickupProducts = {};\n this.name = config.storageGet('name') || '';\n this.email = config.storageGet('email') || '';\n this.phone = config.storageGet('phone') || '';\n this.enableSms = config.storageGet('enableSms') !== false;\n this.addressLine1 = config.storageGet('addressLine1') || '';\n this.addressCity = config.storageGet('addressCity') || '';\n this.addressTerritoryId = config.storageGet('addressTerritoryId');\n this.addressRegion = config.storageGet('addressRegion') || '';\n this.addressPostCode = config.storageGet('addressPostCode') || '';\n this.orderNumber = null;\n this.updatingPrices = false;\n this.couponCode = null;\n this.updateSummaryDebounce = null;\n this.validations = {};\n\n this.fulfillment = config.storageGet('fulfillment') || 'pickup';\n if (!config.api.printicular.deliveryPrintService.id) {\n this.fulfillment = 'pickup';\n }\n }\n\n addLineItem(cartLineItem) {\n log.verbose('Add line item', cartLineItem);\n this.lineItems.push(cartLineItem);\n $rootScope.$broadcast('changeProduct');\n this.updateSummary();\n }\n\n removeLineItem(lineItem) {\n const index = this.lineItems.indexOf(lineItem);\n if (index !== -1) {\n this.lineItems.splice(index, 1);\n $rootScope.$broadcast('changeProduct');\n this.updateSummary();\n }\n }\n\n hasLineItems () {\n return this.lineItems.length > 0;\n }\n\n setStore(store, fireEvent = true) {\n log.verbose('Set store', store);\n this.currency = null;\n this.store = store;\n if (store) {\n config.storageSet('store', store.id);\n if (fireEvent) {\n gtm.push({\n event: 'Select store',\n storeName: store.attributes.name,\n storeId: store.id,\n });\n }\n }\n this.resetDefaultProducts('set store');\n this.updateSummary();\n }\n\n getAllProducts() {\n if (this.fulfillment === 'pickup' && config.flow !== 'products-first' && this.store) {\n return this.getStoreProducts();\n }\n // Delivery or product first flow\n return this.getPrintServiceProducts();\n }\n\n setPickupProducts(pickupProducts, printServiceId) {\n this.pickupProducts[printServiceId] = this.sortProducts(pickupProducts);\n log.debug('Available pickup products', this.pickupProducts);\n }\n\n setDeliveryProducts(deliveryProducts) {\n this.deliveryProducts = this.sortProducts(deliveryProducts);\n log.debug('Available delivery products', this.deliveryProducts);\n }\n\n resetDefaultProducts(why) {\n log.debug('Reset default products ' + why);\n for (const lineItem of this.lineItems) {\n if (!lineItem.getDefaultProduct() && !this.hasNoProducts()) {\n if (!confirm('Are you sure you want to do this, this will remove items from your cart?')) {\n return false;\n }\n break;\n }\n }\n for (const lineItem of this.lineItems) {\n const defaultProduct = lineItem.getDefaultProduct();\n if (defaultProduct) {\n lineItem.setProduct(defaultProduct);\n } else if (!this.hasNoProducts()) {\n this.removeLineItem(lineItem);\n }\n }\n return true;\n }\n\n hasNoProducts() {\n return (\n this.store &&\n this.fulfillment == 'pickup' &&\n this.store.products.length < 1\n );\n }\n\n sortProducts(products, sortCallback) {\n let collator = null;\n try {\n collator = new Intl.Collator(undefined, {\n numeric: true,\n sensitivity: 'base',\n });\n } catch (e) {\n // Ignore\n }\n const currency = this.getCurrency();\n products.sort((a, b) => {\n // Sort by cheapest first (or override sort order in config)\n let aPrice = a.prices.find(price => price.attributes.currency === currency);\n aPrice = aPrice && aPrice.attributes.total ? aPrice.attributes.total : 100000;\n if (a.sortOrder) {\n aPrice = -a.sortOrder;\n }\n let bPrice = b.prices.find(price => price.attributes.currency === currency);\n bPrice = bPrice && bPrice.attributes.total ? bPrice.attributes.total : 100000;\n if (b.sortOrder) {\n bPrice = -b.sortOrder;\n }\n if (aPrice != bPrice) {\n return aPrice - bPrice;\n }\n if (!collator) {\n return 0;\n }\n // Sort by name if price is the same\n const aSortAttr = sortCallback ? sortCallback(a) : a.attributes.name;\n const bSortAttr = sortCallback ? sortCallback(b) : b.attributes.name;\n return collator.compare(aSortAttr, bSortAttr);\n\n });\n return products;\n }\n\n updateSummary() {\n if (this.updateSummaryDebounce) {\n $timeout.cancel(this.updateSummaryDebounce.timer);\n this.updateSummaryDebounce.timer = $timeout(this.updateSummaryBounced.bind(this), 300);\n } else {\n const defer = $q.defer();\n this.updateSummaryDebounce = {\n timer: $timeout(this.updateSummaryBounced.bind(this), 300),\n defer: defer,\n };\n }\n return this.updateSummaryDebounce.defer.promise;\n }\n\n updateSummaryBounced() {\n log.verbose('Update summary');\n nextId++;\n const updatingSummary = nextId;\n let totalQuantity = 0;\n let totalReady = 0;\n let totalUnready = 0;\n const currency = this.getCurrency();\n this.summary = {\n rows: [],\n };\n for (const lineItem of this.lineItems) {\n if (lineItem.isErrored()) {\n continue;\n }\n if (lineItem.product) {\n const name = lineItem.product.formatName();\n let summaryRow = this.summary.rows.find(r => r.name == name);\n if (!summaryRow) {\n summaryRow = {\n name: name,\n product: lineItem.product,\n quantity: 0,\n price: 0,\n };\n this.summary.rows.push(summaryRow);\n }\n summaryRow.quantity += lineItem.quantity;\n\n let price = 0;\n if (lineItem.product) {\n let productPrice = lineItem.product.prices.find(p => p.attributes.currency == currency);\n if (productPrice) {\n price = productPrice.attributes.total * summaryRow.quantity;\n }\n }\n summaryRow.price += price;\n }\n if (lineItem.isReady()) {\n totalReady++;\n } else {\n totalUnready++;\n }\n\n totalQuantity += lineItem.quantity;\n }\n\n this.summary.totalPrice = null;\n this.summary.totalQuantity = totalQuantity;\n this.summary.totalUnready = totalUnready;\n this.summary.totalReady = totalReady;\n this.summary.totalUploadedPercent = 1;\n\n this.validateLineItem();\n\n if (totalReady + totalUnready > 0) {\n this.summary.totalUploadedPercent = Math.max(totalReady / (totalReady + totalUnready), 0.1);\n }\n\n if (this.summary.totalQuantity && !this.orderNumber) {\n window.onbeforeunload = () => true;\n } else {\n window.onbeforeunload = null;\n }\n\n log.verbose('Cart summary', this.summary);\n\n if (this.summary.totalQuantity > 0 && this.summary.totalUnready == 0) {\n if (this.fulfillment == 'delivery') {\n this.dryRunErrors = this.validate(true);\n if (this.dryRunErrors.length) {\n this.resolveUpdateSummary();\n return;\n }\n }\n const orderJson = this.getOrderJson(true);\n if (orderJson) {\n this.updatingPrices = true;\n api.post('users/0/orders?include=store,lineItems,products', orderJson).then((response) => {\n if (updatingSummary != nextId) {\n return;\n }\n this.updatingPrices = false;\n const serverSummaryRows = [];\n for (let i = 0; i < response.included.length; i++) {\n if (response.included[i].type == 'line_items') {\n const productId = response.included[i].attributes.product_id;\n const productData = response.included.find(i => i.type == 'products' && i.id == productId);\n if (productData) {\n const product = Product.fromJsonApi(productData, response.included);\n const name = product.formatName();\n let serverSummaryRow = serverSummaryRows.find(r => r.name == name);\n if (!serverSummaryRow) {\n serverSummaryRow = {\n name: name,\n product: product,\n quantity: 0,\n price: 0,\n };\n serverSummaryRows.push(serverSummaryRow);\n }\n serverSummaryRow.price += response.included[i].attributes.total;\n serverSummaryRow.quantity += response.included[i].attributes.quantity;\n }\n }\n }\n this.summary.rows = serverSummaryRows;\n this.summary.shipping = response.data.attributes.freight_total;\n this.summary.shippingDiscount = response.data.attributes.freight_discount;\n this.summary.totalPrice = response.data.attributes.total;\n this.summary.totalDiscount = response.data.attributes.vendor_discount || response.data.attributes.subtotal_discount;\n this.summary.couponCode = this.couponCode;\n this.validateLineItem();\n this.resolveUpdateSummary();\n }).catch((response) => {\n this.updatingPrices = false;\n this.dryRunErrors = log.mapErrors(response);\n log.debug('Dry run error', response, this.dryRunErrors);\n this.validateLineItem();\n this.resolveUpdateSummary();\n });\n return;\n } else {\n log.verbose('Not fetching prices, order JSON empty', orderJson);\n }\n }\n this.resolveUpdateSummary();\n }\n\n resolveUpdateSummary() {\n if (this.updateSummaryDebounce) {\n this.updateSummaryDebounce.defer.resolve();\n this.updateSummaryDebounce = null;\n }\n }\n\n validateLineItem() {\n let lineItemErrors = [];\n\n const maxTotalQuantity = this.getMaxTotalQuantity();\n if (maxTotalQuantity && this.summary.totalQuantity && this.summary.totalQuantity > maxTotalQuantity) {\n lineItemErrors.push(`The maximum number of items per order is ${maxTotalQuantity}. Please remove ${this.summary.totalQuantity - maxTotalQuantity} to continue.`);\n }\n\n const maxTotalValue = this.getMaxTotalValue();\n if (maxTotalValue && this.summary.totalPrice && this.summary.totalPrice > maxTotalValue) {\n lineItemErrors.push(`The maximum order value is $ ${maxTotalValue}. Please remove some items to continue.`);\n }\n\n const categoryCounts = {};\n for (const lineItem of this.lineItems) {\n if (!lineItem.product || !(lineItem.product.limit > 0)) {\n continue;\n }\n if (!categoryCounts[lineItem.product.attributes.category_id]) {\n categoryCounts[lineItem.product.attributes.category_id] = {\n id: lineItem.product.attributes.category_id,\n name: lineItem.product.categoryName,\n count: 0,\n limit: lineItem.product.limit,\n };\n }\n categoryCounts[lineItem.product.attributes.category_id].count += lineItem.quantity;\n }\n for (const id in categoryCounts) {\n if (categoryCounts[id].count > categoryCounts[id].limit) {\n lineItemErrors.push(`The maximum number of ${categoryCounts[id].name} per order is ${categoryCounts[id].limit}. Please remove ${categoryCounts[id].count - categoryCounts[id].limit} to continue.`);\n }\n }\n\n for (const key in this.validations) {\n this.validations[key](lineItemErrors);\n }\n\n this.lineItemErrors = lineItemErrors;\n }\n\n getPostCodeType() {\n if (this.store) {\n let territory = $rootScope.territories ? $rootScope.territories.find(territory => territory.id == this.store.attributes.territory_id) : null;\n if (territory && territory.attributes.country_code == 'US') {\n return 'zip';\n }\n }\n if (this.addressCountry && this.addressCountry.attributes.country_code == 'US') {\n return 'zip';\n }\n return 'postcode';\n }\n\n getCurrency() {\n if (this.currency) {\n return this.currency;\n }\n const productCurrencies = this.getProductCurrencies();\n const userCurrency = this.getUserCurrency(productCurrencies);\n\n if (userCurrency) {\n log.verbose('Using user currency', userCurrency);\n this.currency = userCurrency;\n return this.currency;\n }\n\n if (productCurrencies[0]) {\n log.verbose('Using common product currency', productCurrencies);\n this.currency = productCurrencies[0];\n return this.currency;\n }\n\n if (config.locale.currency) {\n log.verbose('Using config currency', config.locale.currency);\n this.currency = config.locale.currency;\n return this.currency;\n }\n\n log.error('Could not get currency from products or config, defaulting to USD');\n this.currency = 'USD';\n return this.currency;\n }\n\n getUserCurrency(productCurrencies) {\n if (!this.addressCountry || !this.addressCountry.attributes.country_code) {\n return null;\n }\n const userCurrency = Locale.getCountryCurrency(this.addressCountry.attributes.country_code);\n if (productCurrencies.indexOf(userCurrency) !== -1) {\n return userCurrency;\n }\n return null;\n }\n\n getProductCurrencies() {\n const currencies = {};\n let retailerId = null;\n if (this.store && this.store.attributes.retailer_id) {\n retailerId = this.store.attributes.retailer_id || null;\n }\n log.verbose('Store retailer', retailerId, this.store);\n for (const lineItem of this.lineItems) {\n if (!lineItem.product) {\n continue;\n }\n for (const price of lineItem.product.prices) {\n if (retailerId != (price.attributes.retailer_id || null) || !price.attributes.currency) {\n continue;\n }\n if (!currencies[price.attributes.currency]) {\n currencies[price.attributes.currency] = 0;\n }\n currencies[price.attributes.currency]++;\n }\n }\n log.verbose('Currencies', currencies);\n return Object.keys(currencies).sort((a, b) => currencies[a] - currencies[b]);\n }\n\n getMaxTotalQuantity() {\n return this.getMaxValueByFulfillmentType(config.pickupMaxTotalQuantity, config.deliveryMaxTotalQuantity);\n }\n\n getMaxTotalValue() {\n return this.getMaxValueByFulfillmentType(config.pickupMaxTotalValue, config.deliveryMaxTotalValue);\n }\n\n getMaxValueByFulfillmentType(pickupValue, deliveryValue) {\n if (this.fulfillment == 'pickup' && pickupValue) {\n return pickupValue;\n }\n if (this.fulfillment == 'delivery' && deliveryValue) {\n return deliveryValue;\n }\n return false;\n }\n\n validate(dryRun = false) {\n const errors = [];\n if (this.summary.totalQuantity == 0) {\n errors.push('You must have at least 1 print to continue.');\n }\n if (!dryRun && !this.name) {\n errors.push('Your full name is required.');\n }\n if (!dryRun) {\n if (!this.phone) {\n errors.push('Your phone number is required.');\n } else {\n if (!this.validatePhoneNumber(this.phone)) {\n errors.push('Your phone number is invalid.');\n }\n }\n }\n if (!dryRun) {\n if (!this.email) {\n errors.push('Your email address is required.');\n } else {\n if (!this.validateEmail(this.email)) {\n errors.push('Your email is invalid.');\n }\n }\n }\n if (this.fulfillment == 'delivery') {\n if (!this.addressLine1) {\n errors.push('Your shipping address is required.');\n }\n if (!this.addressCity) {\n errors.push('Your shipping address city is required.');\n }\n if (!this.addressPostCode) {\n errors.push('Your shipping address postcode is required.');\n }\n if (!this.addressRegion) {\n errors.push('Your shipping address state/region is required.');\n }\n if (!this.addressCountry || !this.addressCountry.id) {\n errors.push('Your shipping address country is required.');\n }\n }\n log.verbose('Cart validation', errors);\n return errors;\n }\n\n validateEmail(email) {\n var re = /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n return re.test(email);\n }\n\n validatePhoneNumber(phoneNumber) {\n return this.cleanPhoneNumber(phoneNumber).length > 4;\n }\n\n cleanPhoneNumber(phoneNumber) {\n return phoneNumber.replace(/[^0-9]+/g, '');\n }\n\n getOrderJson(dryRun = true, stripeToken) {\n if (this.fulfillment == 'pickup' && !this.store) {\n log.verbose('No store when pickup, cant make order JSON');\n return null;\n }\n\n config.storageSet('name', this.name);\n config.storageSet('email', this.email);\n config.storageSet('phone', this.phone);\n config.storageSet('enableSms', this.enableSms);\n config.storageSet('addressLine1', this.addressLine1);\n // config.storageSet('addressLine2', this.addressLine2);\n config.storageSet('addressCity', this.addressCity);\n config.storageSet('addressTerritoryId', this.addressCountry ? this.addressCountry.id : null);\n config.storageSet('addressRegion', this.addressRegion);\n config.storageSet('addressPostCode', this.addressPostCode);\n const addressJson = {\n phone: dryRun ? '1234567890' : this.cleanPhoneNumber(this.phone),\n email: dryRun ? 'dryrun@example.com' : this.email,\n name: dryRun ? 'Dry Run' : this.name,\n };\n if (this.fulfillment == 'delivery') {\n addressJson.line_1 = this.addressLine1;\n addressJson.city = this.addressCity;\n addressJson.state = this.addressRegion && this.addressRegion.code ? this.addressRegion.code : this.addressRegion;\n addressJson.postcode = this.addressPostCode;\n addressJson.territory_id = this.addressCountry ? this.addressCountry.id : null;\n }\n const meta = {\n device_token: config.deviceToken,\n dryrun: dryRun,\n auto_confirm: !dryRun,\n };\n if (this.couponCode) {\n meta.coupon_code = this.couponCode;\n }\n const order = {\n meta: meta,\n data: {\n type: 'orders',\n attributes: {\n client_version: config.version.toString(),\n client_name: config.api.printicular.clientName,\n currency: this.getCurrency(),\n stripe_token: stripeToken,\n enable_sms: this.enableSms && this.getPrintServiceSettings().enableSms,\n },\n relationships: {\n print_service: {\n data: {\n id: this.fulfillment == 'pickup' ? this.store.printServiceId : config.api.printicular.deliveryPrintService.id,\n type: 'print_services',\n },\n },\n line_items: {\n data: this.lineItems\n .map(lineItem => lineItem.getOrderJson())\n .filter(lineItem => lineItem != null),\n },\n address: {\n data: {\n type: 'addresses',\n attributes: addressJson,\n },\n },\n },\n },\n };\n if (this.fulfillment == 'pickup' && this.store) {\n order.data.relationships.store = {\n data: {\n type: 'stores',\n id: this.store.id,\n },\n };\n }\n if (!order.data.relationships.line_items.data || !order.data.relationships.line_items.data.length) {\n log.verbose('No line item data, cant make order JSON');\n return null;\n }\n return order;\n }\n\n togglePickup() {\n if (this.fulfillment === 'pickup') {\n return;\n }\n this.currency = null;\n this.fulfillment = 'pickup';\n if (!this.resetDefaultProducts('toggle pickup')) {\n this.fulfillment = 'delivery';\n return;\n }\n config.storageSet('fulfillment', this.fulfillment);\n }\n\n toggleDelivery() {\n if (this.fulfillment === 'delivery') {\n return;\n }\n this.currency = null;\n this.fulfillment = 'delivery';\n if (!this.resetDefaultProducts('toggle delivery')) {\n this.fulfillment = 'pickup';\n return;\n }\n config.storageSet('fulfillment', this.fulfillment);\n }\n\n getStoreProducts() {\n return this.pickupProducts[this.store.printServiceId].filter((printServiceProduct) => {\n return this.store.products.find(storeProduct => storeProduct.id == printServiceProduct.id);\n });\n }\n\n getPrintServiceSettings() {\n if (this.fulfillment == 'delivery') {\n return config.api.printicular.deliveryPrintService;\n }\n if (config.api.printicular.pickUpPrintServices.length == 1) {\n return config.api.printicular.pickUpPrintServices[0];\n }\n if (this.store) {\n return config.api.printicular.pickUpPrintServices.find(printService => printService.id == this.store.printServiceId);\n }\n }\n\n getPrintServiceProducts() {\n if (this.fulfillment === 'pickup') {\n for (const printServiceId in this.pickupProducts) {\n return this.pickupProducts[printServiceId];\n }\n log.debug('Could not find print service products', this.pickupProducts);\n return [];\n }\n return this.deliveryProducts;\n }\n\n getLineItemCount() {\n let count = 0;\n for (const lineItem of this.lineItems) {\n if (!lineItem.isErrored()) {\n count++;\n }\n }\n return count;\n }\n\n addImage(file) {\n if (!file.type.startsWith('image/')) {\n $rootScope.uploadErrors.push('Could not upload ' + file.name + ' because it is not a supported image type.');\n return false;\n }\n const key = thumbnailer.getFileKey(file);\n if (this.images[key] && this.images[key].isErrored()) {\n delete this.images[key];\n }\n if (!this.images[key]) {\n this.images[key] = new CartImage(key, file, imageUploader.addFile(file), thumbnailer.addFile(file));\n this.images[key].upload.load.finally(() => {\n this.updateSummary();\n });\n }\n return this.images[key];\n }\n\n addImageData(data, name, mimeType) {\n const key = md5(data);\n if (this.images[key] && this.images[key].isErrored()) {\n delete this.images[key];\n }\n if (!this.images[key]) {\n const file = new Blob([data], {\n type: mimeType,\n lastModified: new Date(),\n });\n file.name = name;\n this.images[key] = new CartImageData(key, data, imageUploader.addFile(file));\n this.images[key].upload.load.finally(() => {\n this.updateSummary();\n });\n }\n return this.images[key];\n }\n\n removeImage(image) {\n delete this.images[image.key];\n this.lineItems = this.lineItems.filter(lineItem => lineItem.image && lineItem.image.key != image.key);\n this.updateSummary();\n }\n\n getLowResCount() {\n let count = 0;\n for (const lineItem of this.lineItems) {\n if (lineItem.isLowRes()) {\n count++;\n }\n }\n return count;\n }\n\n reorder(orderId) {\n const order = config.storageGet('reorder');\n if (order.id != orderId) {\n return;\n }\n const pickupPrintService = config.api.printicular.pickUpPrintServices.find(printService => printService.id == order.printServiceId);\n if (pickupPrintService) {\n this.togglePickup();\n }\n if (order.printServiceId == config.api.printicular.deliveryPrintService.id) {\n this.toggleDelivery();\n }\n this.name = order.name || this.name;\n this.email = order.emailAddress || this.email;\n this.phone = order.phoneNumber || this.phone;\n for (const lineItem of order.lineItems) {\n const key = lineItem.checksum;\n if (!this.images[key]) {\n this.images[key] = new CartReorderImage(key, lineItem.thumbnail, lineItem.imageId);\n }\n let product = this.getPrintServiceProducts().find((product) => {\n return product.id == lineItem.productId;\n });\n if (!product) {\n continue;\n }\n this.lineItems.push(new CartLineItem({\n cart,\n product,\n image: this.images[key],\n quantity: lineItem.quantity,\n }));\n }\n $rootScope.$broadcast('changeProduct');\n this.updateSummary();\n }\n };\n\n const cart = new Cart();\n $rootScope.cart = cart;\n window.CART = cart;\n return cart;\n },\n]);\n","app.factory('config', [\n 'log',\n function (\n log,\n ) {\n return new class Config {\n constructor() {\n log.debug('Config', CONFIG);\n for (const key in CONFIG) {\n this[key] = CONFIG[key];\n }\n\n const currentVersion = this.api.printicular.clientId + ' ' + this.version;\n const storageVersion = this.storageGet('version');\n if (!storageVersion || storageVersion !== currentVersion) {\n for (let i = 0; i < localStorage.length; i++) {\n let key = localStorage.key(i);\n if (key.indexOf(this.localStoragePrefix + '_') === 0) {\n localStorage.removeItem(key);\n }\n }\n this.storageSet('version', currentVersion);\n }\n\n this.deviceToken = this.storageGet('deviceToken');\n if (!this.deviceToken) {\n this.deviceToken = [\n Math.random().toString(36).substr(2, 9),\n Math.random().toString(36).substr(2, 9),\n Math.random().toString(36).substr(2, 9),\n Math.random().toString(36).substr(2, 9),\n ].join('-');\n this.storageSet('deviceToken', this.deviceToken);\n }\n }\n\n storageSet(key, data, prefix = true) {\n if (data === undefined) {\n data = null;\n }\n localStorage.setItem(this.getStorageKey(key, prefix), JSON.stringify(data));\n }\n\n storageGet(key, prefix = true) {\n const storageKey = this.getStorageKey(key, prefix);\n try {\n const item = localStorage.getItem(storageKey);\n if (item === undefined) {\n return null;\n }\n return JSON.parse(item);\n } catch (e) {\n console.error('Failed to parse storage item', storageKey); /* eslint-disable-line no-console */\n console.error(e); /* eslint-disable-line no-console */\n localStorage.removeItem(storageKey);\n return null;\n }\n }\n\n storageRemove(key, prefix = true) {\n localStorage.removeItem(this.getStorageKey(key, prefix));\n }\n\n getStorageKey(key, prefix = true) {\n return (prefix ? this.localStoragePrefix + '_' : '') + key;\n }\n\n url(path) {\n path = path.replace(/^\\/+/, '');\n return $('base').attr('href') + path;\n }\n };\n },\n]);\n","app.factory('cropHelpers', [\n 'Unique',\n 'CropRectPos',\n function (\n Unique,\n CropRectPos,\n ) {\n const CROP_TEMPLATE = `\n \n \n \n `;\n return {\n render (lineItem) {\n const html = $('
    ').append($.parseHTML(CROP_TEMPLATE));\n const svg = html.find('svg');\n const image = html.find('.p-crop-image');\n const cropRectPos = lineItem.CropRectPos || new CropRectPos();\n let view = {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n };\n\n if (!cropRectPos.orientation) {\n cropRectPos.orientation = (lineItem.image.thumbnail.width > lineItem.image.thumbnail.height)\n ? 'landscape'\n : 'portait';\n }\n\n if (cropRectPos.rotation == 1 || cropRectPos.rotation == 3) {\n view.width = lineItem.image.thumbnail.height;\n view.height = lineItem.image.thumbnail.width;\n } else {\n view.width = lineItem.image.thumbnail.width;\n view.height = lineItem.image.thumbnail.height;\n }\n view.x = -view.width / 2;\n view.y = -view.height / 2;\n\n svg.attr({\n viewBox: `${view.x} ${view.y} ${view.width} ${view.height}`,\n width: view.width,\n height: view.height,\n });\n\n image.attr({\n 'xlink:href': lineItem.image.thumbnail.image.src,\n width: lineItem.image.thumbnail.width,\n height: lineItem.image.thumbnail.height,\n }).css({\n transformOrigin: `${lineItem.image.thumbnail.width / 2}px ${lineItem.image.thumbnail.height / 2}px`,\n transform: `translate(-${lineItem.image.thumbnail.width / 2}px, -${lineItem.image.thumbnail.height / 2}px) rotate(${cropRectPos.rotation * 90}deg)`,\n });\n\n cropRectPos.productSize = lineItem.product.getProductSize();\n let cropWidth = view.width;\n let cropHeight = view.height;\n const ratio = view.width / view.height;\n const productRatio = cropRectPos.productWidth / cropRectPos.productHeight;\n if (ratio < productRatio) {\n cropHeight = cropRectPos.productHeight / cropRectPos.productWidth * view.width;\n } else {\n cropWidth = cropRectPos.productWidth / cropRectPos.productHeight * view.height;\n }\n if (!cropRectPos.fixedX && !cropRectPos.fixedY && !cropRectPos.floatX && !cropRectPos.floatY) {\n cropRectPos.fixedX = -cropWidth / 2;\n cropRectPos.fixedY = -cropHeight / 2;\n cropRectPos.floatX = cropRectPos.fixedX + cropWidth;\n cropRectPos.floatY = cropRectPos.fixedY + cropHeight;\n }\n\n const aspect = cropRectPos.getAspectRect();\n svg.removeAttr('width');\n svg.removeAttr('height');\n svg.attr('viewBox', `${aspect.x} ${aspect.y} ${aspect.width} ${aspect.height}`);\n\n return $('
    ').append(svg).html();\n },\n };\n },\n]);\n","app.factory('CropRectPos', [function () {\n return class CropRectPos {\n constructor() {\n this.fixedX = null;\n this.fixedY = null;\n this.floatX = null;\n this.floatY = null;\n this.rotation = 0;\n this.productSize = null;\n this.orientation = null;\n }\n get x() {\n return Math.min(this.fixedX, this.floatX);\n }\n\n get y() {\n return Math.min(this.fixedY, this.floatY);\n }\n\n get width() {\n return Math.abs(this.fixedX - this.floatX);\n }\n\n get height() {\n return Math.abs(this.fixedY - this.floatY);\n }\n\n get productWidth() {\n if (!this.productSize) {\n return null;\n }\n if (this.orientation == 'landscape') {\n return this.productSize.width > this.productSize.height ? this.productSize.width : this.productSize.height;\n }\n return this.productSize.width > this.productSize.height ? this.productSize.height : this.productSize.width;\n }\n\n get productHeight() {\n if (!this.productSize) {\n return null;\n }\n if (this.orientation == 'landscape') {\n return this.productSize.width > this.productSize.height ? this.productSize.height : this.productSize.width;\n }\n return this.productSize.width > this.productSize.height ? this.productSize.width : this.productSize.height;\n }\n\n getAspectRect() {\n let x, y, width, height;\n width = this.width;\n height = this.height;\n const minSize = 20;\n if (width < minSize) {\n width = minSize;\n }\n if (height < minSize) {\n height = minSize;\n }\n\n const ratio = width / height;\n const productRatio = this.productWidth / this.productHeight;\n if (ratio < productRatio) {\n height = this.productHeight / this.productWidth * width;\n } else {\n width = this.productWidth / this.productHeight * height;\n }\n\n if (this.fixedX < this.floatX) {\n x = this.fixedX;\n } else {\n x = this.fixedX - width;\n }\n\n if (this.fixedY < this.floatY) {\n y = this.fixedY;\n } else {\n y = this.fixedY - height;\n }\n\n return {\n x: x,\n y: y,\n width: width,\n height: height,\n };\n }\n\n rotate() {\n this.rotation++;\n if (this.rotation > 3) {\n this.rotation = 0;\n }\n }\n };\n}]);\n","app.factory('Debouncer', [\n '$timeout',\n function (\n $timeout,\n ) {\n return class {\n constructor(delay = 100) {\n this.timeout = null;\n this.delay = delay;\n }\n trigger(callback) {\n if (this.timeout) {\n $timeout.cancel(this.timeout);\n }\n this.timeout = $timeout(() => {\n this.timeout = null;\n callback();\n }, this.delay);\n }\n };\n },\n]);\n","app.factory('exception', [\n 'utils',\n function (\n utils,\n ) {\n const HOSTNAME_REGEX = /http[s]*:\\/\\/[^/]+.*?/ig;\n const URL_REGEX = /http[s]?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)/ig;\n const UUID_REGEX = /[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}/g;\n const DATETIME_REGEX = /[0-9]{4}_[0-9]{2}_[0-9]{2}_[0-9]{6}/g;\n const ISO_DATETIME_REGEX = /[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(.[0-9]{3})?Z?/g;\n const DATE_REGEX = /[0-9]{4}-[0-9]{2}-[0-9]{2}/g;\n const TIME_REGEX = /[0-9]{2}:[0-9]{2}:[0-9]{2}/g;\n const ORDER_ID_REGEX = /\\b[0-9][0-9][0-9][0-9]+/g;\n const DEVICE_TOKEN_REGEX = /[a-zA-Z0-9]{9}-[a-zA-Z0-9]{9}-[a-zA-Z0-9]{9}-[a-zA-Z0-9]{9}/ig;\n const SHA1_HASH_REGEX = /\\b[a-f0-9]{40}\\b/ig;\n const MD5_HASH_REGEX = /\\b[a-f0-9]{32}\\b/ig;\n const BEARER_TOKEN_REGEX = /\\bBearer\\s[a-z0-9.-]+/gi;\n\n return {\n normalise (message) {\n message = message.replace(UUID_REGEX, '(uuid)');\n message = message.replace(DATETIME_REGEX, '(date/time)');\n message = message.replace(ISO_DATETIME_REGEX, '(iso-date/time)');\n message = message.replace(DATE_REGEX, '(date)');\n message = message.replace(TIME_REGEX, '(time)');\n message = message.replace(DEVICE_TOKEN_REGEX, '(device_token)');\n message = message.replace(SHA1_HASH_REGEX, '(sha1_hash)');\n message = message.replace(MD5_HASH_REGEX, '(md5_hash)');\n message = message.replace(ORDER_ID_REGEX, '#');\n message = message.replace(BEARER_TOKEN_REGEX, '(bearer_token)');\n message = message.replace(URL_REGEX, (matches) => {\n const path = matches.replace(HOSTNAME_REGEX, '');\n const hostname = matches.replace(path, '/(url)');\n return hostname;\n });\n\n return utils.cleanString(message);\n },\n\n report (msg, error) {\n if (typeof error !== 'string') {\n try {\n error = JSON.stringify(error);\n } catch (e) {\n console.error('Failed to stringify error', error);\n }\n }\n\n dataLayer.push({\n event: 'Unhandled error',\n action: msg + ':' + this.normalise(error),\n label: msg + ':' + error,\n });\n },\n };\n },\n]);\n","app.factory('FitText', [\n 'log',\n 'svg',\n function (\n log,\n svg,\n ) {\n return class FitText {\n static fitText(wrapper, boundingBox, maxFontSize, lines, align = 'center') {\n log.verbose('Fit text', wrapper, boundingBox, maxFontSize, lines, align);\n if (!lines || !lines.length) {\n return;\n }\n if (!wrapper) {\n log.error('Text wrapper is not ready');\n return {};\n }\n while (wrapper.firstChild) {\n wrapper.removeChild(wrapper.firstChild);\n }\n\n let offsetX = 0;\n if (align == 'center') {\n offsetX = boundingBox.width / 2;\n } else if (align == 'left') {\n offsetX = 0;\n } else if (align == 'right') {\n offsetX = boundingBox.width;\n }\n let offsetY = 0;\n const boundingBoxHeight = boundingBox.height;\n log.verbose('Fit text offset', offsetX, offsetY);\n let nodes = [];\n let minFontSize = 100000;\n for (let i = 0; i < lines.length; i++) {\n let node = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n let lineText = lines[i] || '\\xa0';\n log.verbose('Fit line', lineText, boundingBox, offsetX, offsetY);\n node.textContent = lineText;\n node.setAttribute('class', 'p-fit-text-line-' + (i + 1));\n node.setAttribute('x', boundingBox.x + offsetX);\n node.setAttribute('y', boundingBox.y + offsetY);\n node.setAttribute('style', 'font-size: ' + Math.min(maxFontSize, boundingBoxHeight / lines.length) + 'px');\n nodes.push(node);\n wrapper.append(node);\n let fontSize = parseInt(getComputedStyle(node).fontSize);\n\n minFontSize = Math.min(minFontSize, fontSize);\n let box = svg.getBBox(node);\n while (box.height > boundingBoxHeight / lines.length || box.width > boundingBox.width) {\n fontSize--;\n node.style.fontSize = fontSize + 'px';\n minFontSize = Math.min(minFontSize, fontSize);\n if (fontSize <= 2) {\n log.verbose('Min font size reached');\n break;\n }\n box = svg.getBBox(node);\n }\n\n offsetY += box.height;\n }\n for (var i = 0; i < nodes.length; i++) {\n nodes[i].style.fontSize = minFontSize + 'px';\n }\n let wrapperBox = svg.getBBox(wrapper);\n wrapper.style.transform = `translate(0, ${(boundingBox.height / 2) - (wrapperBox.height / 2)}px)`;\n FitText.fixLineHeight(wrapper);\n return {\n nodes,\n minFontSize,\n };\n }\n\n static fixLineHeight(wrapper) {\n const nodes = wrapper.querySelectorAll('text');\n for (let i = 1; i < nodes.length; i++) {\n let previousBox = svg.getBBox(nodes[i - 1]);\n let box = svg.getBBox(nodes[i]);\n let gap = box.y - (previousBox.y + previousBox.height);\n if (gap > 50) {\n nodes[i].setAttribute('y', previousBox.y + previousBox.height + 50);\n }\n }\n }\n };\n },\n]);\n","app.factory('frameHelpers', [\n 'Unique',\n function (\n Unique,\n ) {\n function createFrameSvg(lineItem, frame) {\n const uid = Unique.random();\n const src = lineItem.image.coverImageThumbnail || lineItem.image.getSrc();\n\n return `\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n `;\n }\n\n return {\n getFrames (lineItem) {\n return lineItem.product.productImages\n .filter(img => !!img.metaData.frame)\n .map(img => {\n img.metaData.frame.isPortrait = img.metaData.frame.height > img.metaData.frame.width;\n img.metaData.frame.orientation = img.metaData.frame.isPortrait ? 'portrait' : 'landscape';\n img.metaData.frame.src = img.attributes.thumbnail;\n return img.metaData.frame;\n });\n },\n\n getCurrentFrame(lineItem, preferOrientation) {\n if (! lineItem.settings) {\n lineItem.settings = {};\n }\n\n const frames = this.getFrames(lineItem);\n const orientation = preferOrientation || lineItem.settings.orientation || lineItem.image.orientation || lineItem.image.getOrientation();\n\n return frames.find(frame => frame.orientation === orientation) || frames[0];\n },\n\n extractPhotoSvg(svg, frame) {\n const clone = $(svg).clone();\n clone.attr({ 'viewBox': `${frame.window.x} ${frame.window.y} ${frame.window.width} ${frame.window.height}` });\n clone.find('[data-element=frame]').parent().remove();\n\n return $('
    ').append(clone).html();\n },\n\n getPhotoDefaults(frame, image) {\n const windowCenterX = frame.window.x + (frame.window.width / 2);\n const windowCenterY = frame.window.y + (frame.window.height / 2);\n const windowWidth = frame.window.width;\n const windowHeight = frame.window.height;\n const windowRatio = windowWidth / windowHeight;\n\n let width = 0;\n let height = 0;\n\n const imageWidth = image.width || image.getWidth();\n const imageHeight = image.height || image.getHeight();\n const imageRatio = imageWidth / imageHeight;\n\n if (windowRatio > imageRatio) {\n width = windowWidth;\n height = (windowWidth / imageWidth) * imageHeight;\n } else {\n width = (windowHeight / imageHeight) * imageWidth;\n height = windowHeight;\n }\n\n return {\n width,\n height,\n scale: 1,\n rotate: 0,\n x: windowCenterX - (width / 2),\n y: windowCenterY - (height / 2),\n };\n },\n\n render (lineItem) {\n if (! lineItem.settings) {\n lineItem.settings = {};\n }\n\n const frame = this.getCurrentFrame(lineItem);\n\n if (! lineItem.settings.x) {\n const defaults = this.getPhotoDefaults(frame, lineItem.image);\n\n lineItem.settings.x = defaults.x;\n lineItem.settings.y = defaults.y;\n lineItem.settings.width = defaults.width;\n lineItem.settings.height = defaults.height;\n lineItem.settings.scale = defaults.scale;\n lineItem.settings.rotate = defaults.rotate;\n\n const svg = createFrameSvg(lineItem, frame);\n lineItem.svg = this.extractPhotoSvg(svg, frame);\n // FIX: make sure orientation is correct when sent to server\n lineItem.cropRectPos = {\n orientation: frame.isPortrait ? 'portrait' : 'landscape',\n };\n return svg;\n }\n\n return createFrameSvg(lineItem, frame);\n },\n };\n },\n]);\n","app.factory('gtm', [\n 'log',\n function (\n log,\n ) {\n return new class Gtm {\n constructor() {\n this.data = [];\n }\n\n push(data) {\n this.data.push(data);\n dataLayer.push(data);\n log.verbose('GTM count', this.data.length, dataLayer.length);\n }\n };\n },\n]);\n","app.factory('imageUploader', [\n '$q',\n '$rootScope',\n 'api',\n 'config',\n 'gtm',\n 'log',\n 'Upload',\n function (\n $q,\n $rootScope,\n api,\n config,\n gtm,\n log,\n Upload,\n ) {\n return new class ImageUploader {\n constructor() {\n this.uploads = [];\n this.uploadingCount = 0;\n this.s3Resource = api.gets3Resource();\n }\n\n addFile(file) {\n const defer = $q.defer();\n const upload = {\n file: file,\n progress: null,\n image: null,\n load: defer.promise,\n defer: defer,\n };\n this.uploads.push(upload);\n this.startUpload();\n return upload;\n }\n\n startUpload() {\n log.verbose('Start upload', this.uploads, this.uploadingCount, config.maxUploadCount);\n if (this.uploads.length > 0 && this.uploadingCount < config.maxUploadCount) {\n const upload = this.uploads.shift();\n this.uploadingCount++;\n setTimeout(() => {\n this.upload(upload);\n }, this.uploadingCount * 10);\n }\n }\n\n async upload(upload) {\n upload.progress = 0;\n upload.started = true;\n upload.startTime = new Date();\n\n log.verbose('Apply EXIF rotation', file);\n\n let file = null;\n try {\n file = await Upload.applyExifRotation(upload.file);\n } catch (error) {\n this.handleUploadError('Failed to apply rotation', error, upload, file, null);\n return;\n }\n\n let s3 = null;\n try {\n s3 = await this.s3Resource;\n } catch (error) {\n this.handleUploadError('Failed to get S3 resource', error, upload, file, null);\n return;\n }\n\n let hash = null;\n try {\n hash = await this.getHash(file);\n } catch (error) {\n this.handleUploadError('Failed to get file hash', error, upload, file, null);\n return;\n }\n\n const extension = file.name.replace(/.*\\./, '');\n const key = `${s3.location}${hash}-${file.size}.${extension}`;\n upload.convertedFileName = `${hash}-${file.size}.${extension}`;\n upload.remoteLink = 'https://' + s3.bucket + '.s3.amazonaws.com:443/' + key;\n upload.key = key;\n\n log.verbose('Uploading', file);\n Upload.upload({\n url: 'https://' + s3.bucket + '.s3-accelerate.amazonaws.com:443/',\n method: 'POST',\n data: {\n key: upload.key,\n AWSAccessKeyId: s3.accessKeyId,\n policy: s3.policy,\n signature: s3.signature,\n acl: 'public-read',\n 'Content-Type': file.type != '' ? file.type : 'application/octet-stream',\n filename: upload.convertedFileName,\n name: '',\n file: file,\n },\n }).then(async (response) => {\n log.verbose('Upload complete', response);\n upload.success = response;\n upload.endTime = new Date();\n\n try {\n await this.register(upload, upload.remoteLink);\n } catch (error) {\n this.handleUploadError('Register image error', error, upload, file, null);\n return;\n }\n log.verbose('Register image complete');\n upload.defer.resolve();\n\n this.uploadingCount--;\n this.startUpload();\n\n gtm.push({\n event: 'Image uploaded',\n time: upload.endTime - upload.startTime,\n });\n }, (response) => {\n this.handleUploadError('Upload failure', null, upload, file, response);\n }, (evt) => {\n upload.progress = evt.loaded / evt.total;\n });\n }\n\n handleUploadError(message, error, upload, file, response) {\n log.debug('Failed to upload image', message, error, upload, file, response);\n log.error('Failed to upload image', message, error, upload.key ? upload.key : '(unknown key)', file && file.type ? file.type : '(unknown file type)');\n upload.error = 'Failed to upload image \"' + (file && file.name ? file.name : 'unknown file name') + '\", please try uploading again.';\n $rootScope.uploadErrors.push('Failed to upload image \"' + (file && file.name ? file.name : 'unknown file name') + '\", please try uploading again.');\n upload.defer.reject();\n this.uploadingCount--;\n this.startUpload();\n }\n\n async getHash(file) {\n return $q((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = () => {\n reject('Error reading file.');\n };\n reader.onabort = () => {\n reject('Aborted reading file.');\n };\n reader.onloadend = (event) => {\n if (event.target.readyState == FileReader.DONE) {\n resolve(md5(event.target.result));\n }\n };\n reader.readAsArrayBuffer(file);\n });\n }\n\n async register(upload, imageUrl) {\n return api.post('users/0/images', {\n meta: {\n device_token: config.deviceToken,\n },\n data: {\n type: 'images',\n attributes: {\n external_url: imageUrl,\n },\n },\n }).then((response) => {\n upload.image = response;\n });\n }\n };\n },\n]);\n","app.factory('Locale', [\n function (\n ) {\n const countryToCurrency = {\n AD: 'EUR',\n AE: 'AED',\n AF: 'AFN',\n AG: 'XCD',\n AI: 'XCD',\n AL: 'ALL',\n AM: 'AMD',\n AO: 'AOA',\n AR: 'ARS',\n AS: 'USD',\n AT: 'EUR',\n AU: 'AUD',\n AW: 'AWG',\n AX: 'EUR',\n AZ: 'AZN',\n BA: 'BAM',\n BB: 'BBD',\n BD: 'BDT',\n BE: 'EUR',\n BF: 'XOF',\n BG: 'BGN',\n BH: 'BHD',\n BI: 'BIF',\n BJ: 'XOF',\n BL: 'EUR',\n BM: 'BMD',\n BN: 'BND',\n BO: 'BOB',\n BQ: 'USD',\n BR: 'BRL',\n BS: 'BSD',\n BT: 'BTN',\n BV: 'NOK',\n BW: 'BWP',\n BY: 'BYR',\n BZ: 'BZD',\n CA: 'CAD',\n CC: 'AUD',\n CD: 'CDF',\n CF: 'XAF',\n CG: 'XAF',\n CH: 'CHF',\n CI: 'XOF',\n CK: 'NZD',\n CL: 'CLP',\n CM: 'XAF',\n CN: 'CNY',\n CO: 'COP',\n CR: 'CRC',\n CU: 'CUP',\n CV: 'CVE',\n CW: 'ANG',\n CX: 'AUD',\n CY: 'EUR',\n CZ: 'CZK',\n DE: 'EUR',\n DJ: 'DJF',\n DK: 'DKK',\n DM: 'XCD',\n DO: 'DOP',\n DZ: 'DZD',\n EC: 'USD',\n EE: 'EUR',\n EG: 'EGP',\n EH: 'MAD',\n ER: 'ERN',\n ES: 'EUR',\n ET: 'ETB',\n FI: 'EUR',\n FJ: 'FJD',\n FK: 'FKP',\n FM: 'USD',\n FO: 'DKK',\n FR: 'EUR',\n GA: 'XAF',\n GB: 'GBP',\n GD: 'XCD',\n GE: 'GEL',\n GF: 'EUR',\n GG: 'GBP',\n GH: 'GHS',\n GI: 'GIP',\n GL: 'DKK',\n GM: 'GMD',\n GN: 'GNF',\n GP: 'EUR',\n GQ: 'XAF',\n GR: 'EUR',\n GS: 'GBP',\n GT: 'GTQ',\n GU: 'USD',\n GW: 'XOF',\n GY: 'GYD',\n HK: 'HKD',\n HM: 'AUD',\n HN: 'HNL',\n HR: 'HRK',\n HT: 'HTG',\n HU: 'HUF',\n ID: 'IDR',\n IE: 'EUR',\n IL: 'ILS',\n IM: 'GBP',\n IN: 'INR',\n IO: 'USD',\n IQ: 'IQD',\n IR: 'IRR',\n IS: 'ISK',\n IT: 'EUR',\n JE: 'GBP',\n JM: 'JMD',\n JO: 'JOD',\n JP: 'JPY',\n KE: 'KES',\n KG: 'KGS',\n KH: 'KHR',\n KI: 'AUD',\n KM: 'KMF',\n KN: 'XCD',\n KP: 'KPW',\n KR: 'KRW',\n KW: 'KWD',\n KY: 'KYD',\n KZ: 'KZT',\n LA: 'LAK',\n LB: 'LBP',\n LC: 'XCD',\n LI: 'CHF',\n LK: 'LKR',\n LR: 'LRD',\n LS: 'LSL',\n LT: 'LTL',\n LU: 'EUR',\n LV: 'EUR',\n LY: 'LYD',\n MA: 'MAD',\n MC: 'EUR',\n MD: 'MDL',\n ME: 'EUR',\n MF: 'EUR',\n MG: 'MGA',\n MH: 'USD',\n MK: 'MKD',\n ML: 'XOF',\n MM: 'MMK',\n MN: 'MNT',\n MO: 'MOP',\n MP: 'USD',\n MQ: 'EUR',\n MR: 'MRO',\n MS: 'XCD',\n MT: 'EUR',\n MU: 'MUR',\n MV: 'MVR',\n MW: 'MWK',\n MX: 'MXN',\n MY: 'MYR',\n MZ: 'MZN',\n NA: 'NAD',\n NC: 'XPF',\n NE: 'XOF',\n NF: 'AUD',\n NG: 'NGN',\n NI: 'NIO',\n NL: 'EUR',\n NO: 'NOK',\n NP: 'NPR',\n NR: 'AUD',\n NU: 'NZD',\n NZ: 'NZD',\n OM: 'OMR',\n PA: 'PAB',\n PE: 'PEN',\n PF: 'XPF',\n PG: 'PGK',\n PH: 'PHP',\n PK: 'PKR',\n PL: 'PLN',\n PM: 'EUR',\n PN: 'NZD',\n PR: 'USD',\n PS: 'ILS',\n PT: 'EUR',\n PW: 'USD',\n PY: 'PYG',\n QA: 'QAR',\n RE: 'EUR',\n RO: 'RON',\n RS: 'RSD',\n RU: 'RUB',\n RW: 'RWF',\n SA: 'SAR',\n SB: 'SBD',\n SC: 'SCR',\n SD: 'SDG',\n SE: 'SEK',\n SG: 'SGD',\n SH: 'SHP',\n SI: 'EUR',\n SJ: 'NOK',\n SK: 'EUR',\n SL: 'SLL',\n SM: 'EUR',\n SN: 'XOF',\n SO: 'SOS',\n SR: 'SRD',\n SS: 'SSP',\n ST: 'STD',\n SV: 'USD',\n SX: 'ANG',\n SY: 'SYP',\n SZ: 'SZL',\n TC: 'USD',\n TD: 'XAF',\n TF: 'EUR',\n TG: 'XOF',\n TH: 'THB',\n TJ: 'TJS',\n TK: 'NZD',\n TL: 'USD',\n TM: 'TMT',\n TN: 'TND',\n TO: 'TOP',\n TR: 'TRY',\n TT: 'TTD',\n TV: 'AUD',\n TW: 'TWD',\n TZ: 'TZS',\n UA: 'UAH',\n UG: 'UGX',\n UM: 'USD',\n US: 'USD',\n UY: 'UYU',\n UZ: 'UZS',\n VA: 'EUR',\n VC: 'XCD',\n VE: 'VEF',\n VG: 'USD',\n VI: 'USD',\n VN: 'VND',\n VU: 'VUV',\n WF: 'XPF',\n WS: 'WST',\n XK: 'EUR',\n YE: 'YER',\n YT: 'EUR',\n ZA: 'ZAR',\n ZM: 'ZMK',\n ZW: 'ZWL',\n };\n\n return class Locale {\n static getCountryCurrency(countryCode) {\n return countryToCurrency[countryCode] || null;\n }\n };\n },\n]);\n","app.factory('log', [\n 'exception',\n function (\n exception,\n ) {\n const logger = console;\n\n return new class Log {\n debug(...messages) {\n if (CONFIG.debug) {\n logger.log('DEBUG:', ...messages);\n }\n }\n\n verbose(...messages) {\n if (CONFIG.verbose) {\n logger.log('VERBOSE:', ...messages);\n }\n }\n\n error(message, ...details) {\n logger.error('ERROR:', message, ...details);\n\n if (message) {\n exception.report(message, ...details);\n }\n }\n\n mapErrors(response) {\n if (response.message) {\n return [response.message];\n }\n if (response.data && response.data.errors) {\n return response.data.errors.map(error => error.title);\n }\n if (response.data && response.data.body && response.data.body.errors) {\n return response.data.body.errors.map(error => error.title);\n }\n return [];\n }\n };\n },\n]);\n","app.factory('login', [\n 'config',\n function (\n config,\n ) {\n return new class Login {\n constructor() {\n this.loginToken = config.storageGet('loginToken');\n this.isLoggedIn = !!this.loginToken;\n this.name = config.storageGet('loginName') || 'My Account';\n }\n\n login(loginToken, name) {\n this.isLoggedIn = true;\n\n config.storageSet('loginToken', loginToken);\n this.loginToken = loginToken;\n\n config.storageSet('loginName', name);\n this.name = name || 'My Account';\n }\n\n logout() {\n this.isLoggedIn = false;\n\n config.storageSet('loginToken', null);\n this.loginToken = null;\n\n config.storageSet('loginName', null);\n this.name = null;\n }\n\n setName(name) {\n config.storageSet('loginName', name);\n this.name = name || 'My Account';\n }\n\n check() {\n const loginToken = config.storageGet('loginToken');\n if (!loginToken) {\n window.location = config.url('sign-in/');\n return;\n }\n return loginToken;\n }\n };\n },\n]);\n","app.factory('query', [\n function (\n ) {\n const parseQueryString = (query) => {\n const obj = {};\n const qPos = query.indexOf('?');\n const tokens = query.substr(qPos + 1).split('&');\n let i = tokens.length - 1;\n if (qPos !== -1 || query.indexOf('=') !== -1) {\n for (; i >= 0; i--) {\n var s = tokens[i].split('=');\n obj[unescape(s[0])] = s.hasOwnProperty(1) ? unescape(s[1]) : null;\n }\n }\n return obj;\n };\n\n return parseQueryString(window.location.search);\n },\n]);\n","app.factory('svg', [\n 'cart',\n 'log',\n function (\n cart,\n log,\n ) {\n const svg = (nodeName) => {\n return $(document.createElementNS('http://www.w3.org/2000/svg', nodeName));\n };\n\n svg.setImageUrl = (element, url) => {\n element.each(function () {\n this.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', url);\n });\n };\n\n svg.setClipPath = (element, id) => {\n element.each(function () {\n this.style.clipPath = `url(#${id})`;\n this.style.webkitClipPath = `url(#${id})`;\n });\n };\n\n svg.getBBox = (node) => {\n try {\n return node.getBBox();\n } catch (exception) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n };\n }\n };\n\n svg.getViewBox = (element, remember = false) => {\n if (element.data('viewBox')) {\n return element.data('viewBox').split(' ').map(n => parseFloat(n));\n }\n const viewBox = element.attr('viewBox').split(' ').map(n => parseFloat(n));\n if (remember) {\n element.attr('data-view-box', viewBox.join(' '));\n }\n return viewBox;\n };\n\n const entities = {\n quot: '"',\n amp: '&',\n lt: '<',\n gt: '>',\n oelig: 'Œ',\n scaron: 'Š',\n yuml: 'Ÿ',\n circ: 'ˆ',\n tilde: '˜',\n ensp: ' ',\n emsp: ' ',\n thinsp: ' ',\n zwnj: '‌',\n zwj: '‍',\n lrm: '‎',\n rlm: '‏',\n ndash: '–',\n mdash: '—',\n lsquo: '‘',\n rsquo: '’',\n sbquo: '‚',\n ldquo: '“',\n rdquo: '”',\n bdquo: '„',\n dagger: '†',\n permil: '‰',\n lsaquo: '‹',\n rsaquo: '›',\n euro: '€',\n fnof: 'ƒ',\n alpha: 'Α',\n beta: 'Β',\n gamma: 'Γ',\n delta: 'Δ',\n epsilon: 'Ε',\n zeta: 'Ζ',\n eta: 'Η',\n theta: 'Θ',\n iota: 'Ι',\n kappa: 'Κ',\n lambda: 'Λ',\n mu: 'Μ',\n nu: 'Ν',\n xi: 'Ξ',\n omicron: 'Ο',\n pi: 'Π',\n rho: 'Ρ',\n sigma: 'Σ',\n tau: 'Τ',\n upsilon: 'Υ',\n phi: 'Φ',\n chi: 'Χ',\n psi: 'Ψ',\n omega: 'Ω',\n sigmaf: 'ς',\n thetasym: 'ϑ',\n upsih: 'ϒ',\n piv: 'ϖ',\n bull: '•',\n hellip: '…',\n prime: '′',\n oline: '‾',\n frasl: '⁄',\n weierp: '℘',\n image: 'ℑ',\n real: 'ℜ',\n trade: '™',\n alefsym: 'ℵ',\n larr: '←',\n uarr: '↑',\n rarr: '→',\n darr: '↓',\n harr: '↔',\n crarr: '↵',\n forall: '∀',\n part: '∂',\n exist: '∃',\n empty: '∅',\n nabla: '∇',\n isin: '∈',\n notin: '∉',\n ni: '∋',\n prod: '∏',\n sum: '∑',\n minus: '−',\n lowast: '∗',\n radic: '√',\n prop: '∝',\n infin: '∞',\n ang: '∠',\n and: '∧',\n or: '∨',\n cap: '∩',\n cup: '∪',\n int: '∫',\n there4: '∴',\n sim: '∼',\n cong: '≅',\n asymp: '≈',\n ne: '≠',\n equiv: '≡',\n le: '≤',\n ge: '≥',\n sub: '⊂',\n sup: '⊃',\n nsub: '⊄',\n sube: '⊆',\n supe: '⊇',\n oplus: '⊕',\n otimes: '⊗',\n perp: '⊥',\n sdot: '⋅',\n lceil: '⌈',\n rceil: '⌉',\n lfloor: '⌊',\n rfloor: '⌋',\n lang: '〈',\n rang: '〉',\n loz: '◊',\n spades: '♠',\n clubs: '♣',\n hearts: '♥',\n diams: '♦',\n nbsp: ' ',\n iexcl: '¡',\n cent: '¢',\n pound: '£',\n curren: '¤',\n yen: '¥',\n brvbar: '¦',\n sect: '§',\n uml: '¨',\n copy: '©',\n ordf: 'ª',\n laquo: '«',\n not: '¬',\n shy: '­',\n reg: '®',\n macr: '¯',\n deg: '°',\n plusmn: '±',\n sup2: '²',\n sup3: '³',\n acute: '´',\n micro: 'µ',\n para: '¶',\n middot: '·',\n cedil: '¸',\n sup1: '¹',\n ordm: 'º',\n raquo: '»',\n frac14: '¼',\n frac12: '½',\n frac34: '¾',\n iquest: '¿',\n agrave: 'À',\n aacute: 'Á',\n acirc: 'Â',\n atilde: 'Ã',\n auml: 'Ä',\n aring: 'Å',\n aelig: 'Æ',\n ccedil: 'Ç',\n egrave: 'È',\n eacute: 'É',\n ecirc: 'Ê',\n euml: 'Ë',\n igrave: 'Ì',\n iacute: 'Í',\n icirc: 'Î',\n iuml: 'Ï',\n eth: 'Ð',\n ntilde: 'Ñ',\n ograve: 'Ò',\n oacute: 'Ó',\n ocirc: 'Ô',\n otilde: 'Õ',\n ouml: 'Ö',\n times: '×',\n oslash: 'Ø',\n ugrave: 'Ù',\n uacute: 'Ú',\n ucirc: 'Û',\n uuml: 'Ü',\n yacute: 'Ý',\n thorn: 'Þ',\n szlig: 'ß',\n divide: '÷',\n };\n\n svg.convertHtmlEntitiesToXml = (string) => {\n return string.replace(/&([a-z][a-z0-9]+?);/ig, (entity, entityName) => {\n return entities[entityName] || entity;\n });\n };\n\n svg.cleanSvg = (templateSvg) => {\n const wrapper = $('
    ').html(templateSvg);\n log.verbose('Replacing SVG images', wrapper.find('[data-image-key]'));\n wrapper.find('[data-image-key]').each(function () {\n svg.setImageUrl($(this), cart.images[$(this).data('imageKey')].upload.remoteLink);\n });\n wrapper.find('.p-template-ui').remove();\n return wrapper;\n };\n\n svg.cleanXml = (xml) => {\n if (xml) {\n xml = '' + xml;\n xml = svg.convertHtmlEntitiesToXml(xml);\n }\n\n return xml;\n };\n\n svg.makeDataImageUrl = (str) => {\n var svgString = new XMLSerializer().serializeToString($(str)[0]);\n var decoded = unescape(encodeURIComponent(svgString));\n var base64 = btoa(decoded);\n\n return `data:image/svg+xml;base64,${base64}`;\n };\n\n svg.safe = (string) => {\n return svg.cleanXml(\n $('
    ').append(string).html()\n );\n };\n\n return svg;\n },\n]);\n","app.factory('thumbnailer', [\n '$q',\n 'log',\n 'Upload',\n function (\n $q,\n log,\n Upload,\n ) {\n const size = 800;\n return new class Thumbnailer {\n constructor() {\n this.thumbnails = [];\n this.thumbnailCache = {};\n this.thumbnailingCount = 0;\n }\n\n addFile(file) {\n const defer = $q.defer();\n const thumbnail = {\n file: file,\n load: defer.promise,\n defer: defer,\n };\n this.thumbnails.push(thumbnail);\n this.startThumbnailing();\n return thumbnail;\n }\n\n startThumbnailing() {\n if (this.thumbnails.length > 0 && this.thumbnailingCount < 1) {\n const thumbnail = this.thumbnails.shift();\n this.thumbnail(thumbnail);\n }\n }\n\n thumbnail(thumbnail) {\n this.thumbnailingCount++;\n\n const file = thumbnail.file;\n const key = this.getFileKey(file);\n log.verbose('Thumbnailing', key, thumbnail);\n if (this.thumbnailCache[key]) {\n log.verbose('Thumbnail cached', key);\n thumbnail.url = this.thumbnailCache[key];\n this.thumbnailingCount--;\n this.startThumbnailing();\n return;\n }\n\n if (!file.type.startsWith('image/')) {\n log.verbose('Cant thumbnail, not image', file.type, key, thumbnail);\n this.thumbnailingCount--;\n this.startThumbnailing();\n return;\n }\n\n let width = size;\n let height = size;\n Upload.resize(file, {\n width,\n height,\n }).then((file) => {\n return Upload.applyExifRotation(file);\n }).then((file) => {\n return this.readFile(file);\n }).then((url) => {\n return this.loadImage(url);\n }).then((image) => {\n thumbnail.image = image;\n thumbnail.width = image.width;\n thumbnail.height = image.height;\n thumbnail.ready = true;\n }).catch((error) => {\n thumbnail.error = true;\n thumbnail.errorInfo = error;\n log.error(error);\n }).finally(() => {\n this.thumbnailingCount--;\n this.startThumbnailing();\n thumbnail.defer.resolve();\n });\n }\n\n readFile(file) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = (e) => {\n resolve(e.target.result);\n };\n reader.onerror = (e) => {\n log.error('Failed to read file', e);\n reject();\n };\n reader.readAsDataURL(file);\n });\n }\n\n loadImage(imageUrl) {\n return new Promise((resolve, reject) => {\n const image = new Image();\n image.onload = () => {\n resolve(image);\n };\n image.onerror = (e) => {\n log.error('Failed to thumbnail image', e, e.message);\n reject();\n };\n image.src = imageUrl;\n });\n }\n\n drawImageCover(context, image) {\n if (!image) {\n return;\n }\n\n let x = 0;\n let y = 0;\n let w = context.canvas.width;\n let h = context.canvas.height;\n let offsetX = 0.5;\n let offsetY = 0.5;\n\n // keep bounds [0.0, 1.0]\n if (offsetX < 0) offsetX = 0;\n if (offsetY < 0) offsetY = 0;\n if (offsetX > 1) offsetX = 1;\n if (offsetY > 1) offsetY = 1;\n\n var iw = image.width,\n ih = image.height,\n r = Math.min(w / iw, h / ih),\n nw = iw * r, // new prop. width\n nh = ih * r, // new prop. height\n cx, cy, cw, ch, ar = 1;\n\n // decide which gap to fill\n if (nw < w) ar = w / nw;\n if (Math.abs(ar - 1) < 1e-14 && nh < h) ar = h / nh; // updated\n nw *= ar;\n nh *= ar;\n\n // calc source rectangle\n cw = iw / (nw / w);\n ch = ih / (nh / h);\n\n cx = (iw - cw) * offsetX;\n cy = (ih - ch) * offsetY;\n\n // make sure source rectangle is valid\n if (cx < 0) cx = 0;\n if (cy < 0) cy = 0;\n if (cw > iw) cw = iw;\n if (ch > ih) ch = ih;\n\n // fill image in dest. rectangle\n context.drawImage(image, cx, cy, cw, ch, x, y, w, h);\n }\n\n getFileKey(file) {\n return [file.name, file.size, file.lastModified].join(':');\n }\n };\n },\n]);\n","app.factory('Unique', [\n function (\n ) {\n const cache = {};\n return {\n random: (prefix = 'uid') => {\n let uid;\n do {\n const number = Math.random().toString().replace(/0\\./, '');\n uid = prefix + '-' + number;\n } while (cache[uid]);\n cache[uid] = true;\n return uid;\n },\n\n inc: (prefix = 'uid') => {\n let nextId = 0;\n do {\n nextId++;\n } while (cache[prefix + '-' + nextId]);\n cache[prefix + '-' + nextId] = true;\n return prefix + '-' + nextId;\n },\n };\n },\n]);\n","\napp.factory('US_STATES', [\n function (\n ) {\n return [\n { code: 'AL', name: 'ALABAMA' },\n { code: 'AK', name: 'ALASKA' },\n { code: 'AS', name: 'AMERICAN SAMOA' },\n { code: 'AZ', name: 'ARIZONA' },\n { code: 'AR', name: 'ARKANSAS' },\n { code: 'CA', name: 'CALIFORNIA' },\n { code: 'CO', name: 'COLORADO' },\n { code: 'CT', name: 'CONNECTICUT' },\n { code: 'DE', name: 'DELAWARE' },\n { code: 'DC', name: 'DISTRICT OF COLUMBIA' },\n { code: 'FM', name: 'FEDERATED STATES OF MICRONESIA' },\n { code: 'FL', name: 'FLORIDA' },\n { code: 'GA', name: 'GEORGIA' },\n { code: 'GU', name: 'GUAM GU' },\n { code: 'HI', name: 'HAWAII' },\n { code: 'ID', name: 'IDAHO' },\n { code: 'IL', name: 'ILLINOIS' },\n { code: 'IN', name: 'INDIANA' },\n { code: 'IA', name: 'IOWA' },\n { code: 'KS', name: 'KANSAS' },\n { code: 'KY', name: 'KENTUCKY' },\n { code: 'LA', name: 'LOUISIANA' },\n { code: 'ME', name: 'MAINE' },\n { code: 'MH', name: 'MARSHALL ISLANDS' },\n { code: 'MD', name: 'MARYLAND' },\n { code: 'MA', name: 'MASSACHUSETTS' },\n { code: 'MI', name: 'MICHIGAN' },\n { code: 'MN', name: 'MINNESOTA' },\n { code: 'MS', name: 'MISSISSIPPI' },\n { code: 'MO', name: 'MISSOURI' },\n { code: 'MT', name: 'MONTANA' },\n { code: 'NE', name: 'NEBRASKA' },\n { code: 'NV', name: 'NEVADA' },\n { code: 'NH', name: 'NEW HAMPSHIRE' },\n { code: 'NJ', name: 'NEW JERSEY' },\n { code: 'NM', name: 'NEW MEXICO' },\n { code: 'NY', name: 'NEW YORK' },\n { code: 'NC', name: 'NORTH CAROLINA' },\n { code: 'ND', name: 'NORTH DAKOTA' },\n { code: 'MP', name: 'NORTHERN MARIANA ISLANDS' },\n { code: 'OH', name: 'OHIO' },\n { code: 'OK', name: 'OKLAHOMA' },\n { code: 'OR', name: 'OREGON' },\n { code: 'PW', name: 'PALAU' },\n { code: 'PA', name: 'PENNSYLVANIA' },\n { code: 'PR', name: 'PUERTO RICO' },\n { code: 'RI', name: 'RHODE ISLAND' },\n { code: 'SC', name: 'SOUTH CAROLINA' },\n { code: 'SD', name: 'SOUTH DAKOTA' },\n { code: 'TN', name: 'TENNESSEE' },\n { code: 'TX', name: 'TEXAS' },\n { code: 'UT', name: 'UTAH' },\n { code: 'VT', name: 'VERMONT' },\n { code: 'VI', name: 'VIRGIN ISLANDS' },\n { code: 'VA', name: 'VIRGINIA' },\n { code: 'WA', name: 'WASHINGTON' },\n { code: 'WV', name: 'WEST VIRGINIA' },\n { code: 'WI', name: 'WISCONSIN' },\n { code: 'WY', name: 'WYOMING' },\n { code: 'AE', name: 'ARMED FORCES AFRICA / CANADA / EUROPE / MIDDLE EAST' },\n { code: 'AA', name: 'ARMED FORCES AMERICA (EXCEPT CANADA)' },\n { code: 'AP', name: 'ARMED FORCES PACIFIC' },\n ];\n },\n]);\n","app.factory('utils', [function () {\n return {\n getAspectRatio(width, height, seperator = ':') {\n const calc = (a, b) => (b == 0) ? a : calc(b, a % b);\n const ratio = calc(width, height);\n\n return (width / ratio) + seperator + (height / ratio);\n },\n\n indexOfSmallest(array) {\n return array.indexOf(Math.min.apply(Math, array));\n },\n\n cleanString (s) {\n /* eslint-disable-next-line */\n return s.replace(/[^\\x00-\\x7F]+/g, '');\n },\n };\n}]);\n"]}