@iccandle/vuejs-widget 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,13 +2,13 @@
2
2
  import { Fragment as e, Teleport as t, TransitionGroup as n, computed as r, createBlock as i, createCommentVNode as a, createElementBlock as o, createElementVNode as s, createStaticVNode as c, createTextVNode as l, createVNode as u, defineComponent as d, inject as f, isRef as p, mergeModels as m, nextTick as h, normalizeClass as g, normalizeStyle as _, onBeforeUnmount as v, onMounted as y, onWatcherCleanup as b, openBlock as x, provide as S, reactive as C, ref as w, renderList as T, renderSlot as E, resolveDynamicComponent as D, shallowRef as O, toDisplayString as k, unref as A, useModel as j, vModelText as M, watch as N, withCtx as P, withDirectives as F, withModifiers as I } from "vue";
3
3
  import L, { isAxiosError as R } from "axios";
4
4
  //#region src/constants/app.constant.ts
5
- var ee = "An unknown error occurred", z = "https://embed-iccandle-app.iccandle.ai", B = "tv:clicked-news-event", V = "tv:selected-news-events", H = (e) => e === "1" ? 120 : e === "5" ? 480 : e === "1D" ? 20 * 3600 : parseInt(e, 10) * 60, U = (e) => e === "1" ? 60 : e === "5" ? 300 : e === "1D" ? 1440 * 3600 : parseInt(e, 10) * 60, W = 5e3, te = 1, ne = /* @__PURE__ */ new Map(), re = w([]);
6
- function ie(e) {
7
- let t = ne.get(e);
8
- t && (clearTimeout(t), ne.delete(e)), re.value = re.value.filter((t) => t.id !== e);
5
+ var z = "An unknown error occurred", B = "https://embed-iccandle-app.iccandle.ai", V = "tv:clicked-news-event", ee = "tv:selected-news-events", H = (e) => e === "1" ? 120 : e === "5" ? 480 : e === "1D" ? 20 * 3600 : parseInt(e, 10) * 60, U = (e) => e === "1" ? 60 : e === "5" ? 300 : e === "1D" ? 1440 * 3600 : parseInt(e, 10) * 60, W = 5e3, G = 1, K = /* @__PURE__ */ new Map(), q = w([]);
6
+ function J(e) {
7
+ let t = K.get(e);
8
+ t && (clearTimeout(t), K.delete(e)), q.value = q.value.filter((t) => t.id !== e);
9
9
  }
10
- function G({ title: e, description: t, action: n, dismiss: r = { label: "Dismiss" }, variant: i = "info", duration: a = W }) {
11
- let o = te++, s = {
10
+ function Y({ title: e, description: t, action: n, dismiss: r = { label: "Dismiss" }, variant: i = "info", duration: a = W }) {
11
+ let o = G++, s = {
12
12
  id: o,
13
13
  title: e,
14
14
  description: t,
@@ -16,15 +16,15 @@ function G({ title: e, description: t, action: n, dismiss: r = { label: "Dismiss
16
16
  dismiss: r,
17
17
  variant: i
18
18
  };
19
- if (re.value = [...re.value, s], a > 0) {
20
- let e = setTimeout(() => ie(o), a);
21
- ne.set(o, e);
19
+ if (q.value = [...q.value, s], a > 0) {
20
+ let e = setTimeout(() => J(o), a);
21
+ K.set(o, e);
22
22
  }
23
23
  return o;
24
24
  }
25
25
  //#endregion
26
26
  //#region src/constants/language.constant.ts
27
- var ae = [
27
+ var X = [
28
28
  "en",
29
29
  "zh",
30
30
  "vi",
@@ -34,12 +34,12 @@ var ae = [
34
34
  "mn",
35
35
  "ru"
36
36
  ];
37
- function oe(e) {
38
- return e && ae.includes(e) ? e : "en";
37
+ function te(e) {
38
+ return e && X.includes(e) ? e : "en";
39
39
  }
40
40
  //#endregion
41
41
  //#region src/i18n/widget-messages.ts
42
- var se = {
42
+ var ne = {
43
43
  en: {
44
44
  Common: {
45
45
  or: "OR",
@@ -7402,7 +7402,7 @@ var se = {
7402
7402
  Legal: /* @__PURE__ */ JSON.parse("{\"Page\":{\"title\":{\"terms\":\"Условия обслуживания\",\"privacy\":\"Политика конфиденциальности\",\"refund\":\"Политика возврата средств и отмены\",\"cookie\":\"Политика использования файлов куки\"},\"tabs\":{\"terms\":\"Условия обслуживания\",\"privacy\":\"Политика конфиденциальности\",\"refund\":\"Политика возврата средств и отмены\",\"cookie\":\"Политика использования файлов куки\"},\"nav\":{\"terms\":\"Условия обслуживания\",\"privacy\":\"Политика конфиденциальности\",\"refund\":\"Политика возврата средств и отмены\",\"cookie\":\"Политика использования файлов куки\"}},\"Terms\":{\"title\":\"Условия обслуживания, TOS, условия, положения, отказ от ответственности, договор, соглашение\",\"intro\":{\"p1\":\"Настоящее соглашение заключается между Pixel Nexus Global, сингапурской компанией с ограниченной ответственностью, осуществляющей деятельность через сайт www.iccandle.ai («Pixel Nexus Global», «мы», «нас» или «наш»), и физическим или юридическим лицом, приобретающим или использующим услуги, предлагаемые через Платформу («Клиент», «вы» или «ваш»). Если вы приобретаете Услуги от имени третьей стороны, вы подтверждаете, что обладаете законными полномочиями обязать такую сторону соблюдать настоящие Условия обслуживания и несёте ответственность за их использование Услуг.\",\"p2\":\"Получая доступ к Платформе и Услугам, описанным в настоящем документе и размещённым на www.iccandle.ai, либо оформляя подписку через сайт iccandle.ai, вы подтверждаете, что прочитали, поняли и согласились с настоящими Условиями, Положениями и отказами от ответственности. Вы также соглашаетесь, что ваши отношения с нами регулируются положениями настоящих Условий обслуживания.\",\"p2Emphasis\":\"Если вы не принимаете данные условия, вы обязаны немедленно прекратить использование iccandle.ai и любых связанных услуг или платформ.\"},\"sections\":[{\"title\":\"1. Услуги\",\"paragraphs\":[\"Pixel Nexus Global will provide active customers in good standing with access to its AI-powered analytical tool (the “Platform”). As used in this Agreement, the term “Services” refers to Pixel Nexus Global’s provision of your access to the Platform. The Services will be provided to you under one or more subscriptions, account activations, sign-ups, or orders placed by you on the iccandle.ai website and accepted by Pixel Nexus Global (an “Order”).\",\"In case of any conflict between these TOS and an Order, the terms of these TOS shall take precedence. By accepting the Services, you acknowledge and agree that any different or additional terms proposed by you in an Order or otherwise are expressly rejected by Pixel Nexus Global, unless we have agreed to such terms in a written document signed by an authorized representative.\"]},{\"title\":\"2. Ваши обязательства\",\"subsections\":[{\"title\":\"Информация о клиенте и ответственность за аккаунт\",\"paragraphs\":[\"You agree to provide Pixel Nexus Global with accurate information when creating your account, throughout our business relationship, and in all correspondence with us. We may occasionally need to contact you via email or telephone regarding the Services. You agree to maintain a valid email address that you check daily and to promptly notify us of any changes to your contact information.\",\"Pixel Nexus Global shall not be responsible for any service interruptions, damages, or consequences resulting from misdirected communications due to your failure to provide current contact details. You also agree to complete all data entitlement surveys within the platform completely and truthfully to maintain compliance with exchange regulations.\"]},{\"title\":\"Разрешённое использование платформы\",\"paragraphs\":[\"Your use of the Platform must comply with these TOS and any accompanying documentation we provide. If you permit third parties to access the Platform, you agree to: (i) restrict their use in accordance with these terms; (ii) ensure their compliance with these TOS and our Privacy Policy; and (iii) remain fully liable for any violations of these TOS or the Privacy Policy by such third parties.\"]},{\"title\":\"Интеллектуальная собственность и соблюдение закона\",\"paragraphs\":[\"You agree not to alter, obscure, or remove any trademark or proprietary notices. You may only use the Platform in accordance with: (i) the laws governing these TOS; and (ii) all applicable laws in your jurisdiction.\",\"Несанкционированное использование строго запрещено.\"]}]},{\"title\":\"3. Срок действия\",\"subsections\":[{\"title\":\"Дата вступления в силу\",\"paragraphs\":[\"These Terms of Service (TOS) become effective (\\\"Effective Date\\\") on the earlier of: (i) the date you click \\\"I accept\\\" as recorded by our servers; or (ii) the date you first access or use the Platform.\",\"These TOS remain in effect for the duration of any active Order.\"]},{\"title\":\"Подписка и продление\",\"paragraphs\":[\"The Services will automatically renew for successive periods (monthly, quarterly, or annually) as specified in your Order. If unspecified, the default initial subscription period (\\\"Initial Term\\\") is one month. Subsequent renewal periods (\\\"Renewal Terms\\\") will match the Initial Term’s duration.\"]},{\"title\":\"Пробный период\",\"paragraphs\":[\"Pixel Nexus Global may offer trial periods (paid or free) as indicated on the iccandle.ai trial signup page. During any trial period:\"],\"listOrdered\":[\"применяются все условия как для платной подписки\",\"вы можете отменить подписку до автоматического продления\",\"условия могут изменяться без уведомления\"]},{\"title\":\"Управление подпиской\",\"paragraphs\":[\"You are solely responsible for managing your subscription, including:\"],\"listDisc\":[\"контроль дат продления\",\"обновление платёжных данных\",\"отмена подписки\",\"актуальность контактных данных\"],\"paragraphsAfter\":[\"Pixel Nexus Global is not responsible for any charges due to failure to manage your subscription.\"]}]},{\"title\":\"4. Прекращение\",\"subsections\":[{\"title\":\"Отмена и возвраты\",\"paragraphs\":[\"Details about cancellation and refund policies are available on our Refund and Cancellation Policy page at iccandle.ai. Terminating your account disables automatic renewals but does not cancel past invoices or make prior payments refundable unless stated otherwise in our Refund and Cancellation Policy.\",\"Any currently due invoices must be paid in full to settle your account. Your access to Pixel Nexus Global services will continue until the expiration of your prepaid period or trial term.\"]},{\"title\":\"Расторжение по инициативе сторон\",\"paragraphs\":[\"Either party may terminate any Order by providing written notice at least one (1) day before the expiration of the Initial Term or any Renewal Term. For purposes of this provision, “written notice” includes communication through email, live chat, telephone, or via the Online Portal, indicating a desire not to continue service with Pixel Nexus Global in the future.\"]},{\"title\":\"Нарушения\",\"paragraphs\":[\"Pixel Nexus Global reserve the right to immediately suspend Services and/or terminate any Order in cases of violation of these TOS, breach of our Privacy Policy, or use of Services in a manner contrary to law or generally accepted internet standards. Such termination may occur without prior notice, dispute resolution process, or refund of any fees.\"]},{\"title\":\"Последствия\",\"paragraphs\":[\"The expiration or termination of any Order does not affect any rights or obligations that either (i) came into effect upon or after such expiration/termination, or (ii) survive the termination and were incurred by the parties prior to termination. Upon termination, you must promptly settle any outstanding balance. Pixel Nexus Global is not obligated to return any paid fees for terminations occurring prior to completion of a full term, except as may be expressly provided in our Refund and Cancellation Policy.\",\"All termination matters are governed by the complete terms set forth in this agreement, and Pixel Nexus Global maintains full discretion in enforcing these provisions.\"]}]},{\"title\":\"5. Лицензия и ограничения\",\"paragraphs\":[\"Pixel Nexus Global grants you a limited, revocable, non-exclusive, non-transferable, worldwide license to utilize our proprietary technology (\\\"Pixel Nexus Technology\\\") solely for accessing and employing our analytical engines as part of the Services, including any generated reports (\\\"Reports\\\"). This license is restricted to your account's registered users and automatically terminates upon expiration or termination of these TOS.\",\"No rights beyond this limited license are conferred. All ownership rights in the Pixel Nexus Technology remain exclusively with Pixel Nexus Global or its licensors. You are expressly prohibited from: transferring, leasing, lending, sublicensing, reselling, or distributing the technology; using it for timesharing or service bureau purposes; or permitting unauthorized third-party access. You may not circumvent any protective measures safeguarding our proprietary interests, nor modify, reproduce, decompile, reverse engineer, or create derivative works from the Pixel Nexus Technology or Platform components. Upon termination, you must immediately cease using and permanently delete all Pixel Nexus Technology in your possession, ensuring any third parties with access do likewise.\"],\"subsections\":[{\"title\":\"Права собственности\",\"paragraphs\":[\"Pixel Nexus Global retains all rights, title, and interest in the Pixel Nexus Technology and Platform, including but not limited to all derivative works, improvements, enhancements, and associated intellectual property rights such as trademarks and copyrights.\"]},{\"title\":\"Положения об обратной связи\",\"paragraphs\":[\"You may voluntarily provide, or we may solicit, input regarding the Platform or Services (\\\"Feedback\\\"), including suggestions for modifications or improvements. You acknowledge such Feedback constitutes Pixel Nexus Global's confidential proprietary information and irrevocably assign all related rights and interests to us. Pixel Nexus Global may utilize Feedback for any purpose without limitation or compensation obligation. This assignment applies globally and survives termination of these TOS.\",\"All rights not expressly granted herein are reserved by Pixel Nexus Global. Any unauthorized use constitutes breach of these TOS and may result in immediate termination of your access rights.\"]}]},{\"title\":\"6. Использование данных и ИС\",\"paragraphs\":[\"Pixel Nexus Global may utilize information you provide or data collected from your use of the Platform and Services (\\\"Operational Information\\\") to deliver technical support and facilitate the implementation, operation, and administration of the Services. By using our Services, you grant us a perpetual, irrevocable license to process and analyze this Operational Information. We may combine this data with aggregate information from our general business operations to enhance existing Services or develop new products and offerings.\",\"Pixel Nexus Global shall retain exclusive ownership of all intellectual property derived from such analysis and improvements. You hereby irrevocably waive any potential rights to this intellectual property and assign all rights, title, and interest therein to Pixel Nexus Global. You further agree to provide reasonable cooperation in securing and protecting these rights. We reserve the right to commercialize this Operational Information through sale, monetization, or incorporation into other products and services, without obligation to compensate you or grant you any ownership interest.\",\"This license shall terminate upon expiration or cancellation of these Terms of Service, except with respect to historical data that has been aggregated and anonymized such that it cannot be identified as originating from your organization. Pixel Nexus Global may retain and continue to use such anonymized, aggregated data indefinitely for any lawful business purpose.\",\"All intellectual property rights not expressly granted herein remain the exclusive property of Pixel Nexus Global. Your continued use of the Services constitutes acceptance of these terms regarding data usage and intellectual property rights.\"]},{\"title\":\"7. Отказ от ответственности за точность информации\",\"paragraphs\":[\"Pixel Nexus Global relies on third-party data feeds to power its platform and therefore cannot guarantee the absolute accuracy of the information displayed. Different features within our system (such as scanners, automated analysis tools, charting functions, and back testing capabilities) may utilize separate data providers, which can result in variances between datasets across different platform features. Users should always verify analysis results and scanner conditions to ensure data consistency.\",\"The platform's analytical outputs are inherently dependent on the quality of underlying third-party data, and Pixel Nexus Global makes no representations or warranties regarding the accuracy of these analyses. The iccandle.ai website, Services, and Platform are designed solely for informational and research purposes - they should never serve as the sole basis for investment decisions. Pixel Nexus Global disclaims all liability for any financial losses resulting from reliance on potentially inaccurate data or analysis within the Platform.\",\"The Pixel Nexus Global system is provided strictly on an \\\"as-is\\\" basis without guarantees or warranties of any kind, as its functionality depends on unverified third- party data sources. The platform is intended exclusively for educational, entertainment, and general informational use - not as professional financial advice or a substitute for independent investment research. Users assume all risk associated with interpreting and acting upon any information displayed within the system.\",\"By accessing and using the Platform, you acknowledge these inherent limitations and agree that Pixel Nexus Global shall not be held responsible for any consequences arising from data inaccuracies, analysis errors, or investment decisions made based on platform content.\"]},{\"title\":\"8. Отказ от инвестиционных рекомендаций и ограничения платформы\",\"paragraphs\":[\"The analytical tools and outputs provided by Pixel Nexus Global's iccandle.ai platform are strictly for informational and research purposes only and should not be construed as investment advice. The platform relies on third-party data sources that may contain inaccuracies, and different features may produce varying results due to separate data providers. All analysis, including results from our Pattern Selector, Pattern Tracker, and News Impact Intelligence, is provided \\\"AS-IS\\\" without any guarantees of accuracy. These tools demonstrate historical patterns, probabilities, and market behavior under past conditions and cannot predict future results, as actual market outcomes may differ due to liquidity, execution, and other variables. You must never rely solely on platform analysis when making investment decisions.\"]},{\"title\":\"9. Признание рисков и ответственность пользователя\",\"paragraphs\":[\"By using Pixel Nexus Global's platform (iccandle.ai), you expressly acknowledge and accept full responsibility for all risks associated with any investment decisions made based on information or analysis obtained from our Platform. You understand that our services rely on third-party data sources that may contain inaccuracies, and that our analytical models employ mathematical formulas and sequences that have not been independently verified for predictive accuracy. Pixel Nexus Global cannot and does not guarantee the reliability of any market data, technical indicators, or analytical outputs generated by the Platform.\",\"Prior to executing any trades, you agree to either: (i) consult with a qualified, licensed financial professional; or (ii) conduct comprehensive independent research using multiple verified information sources.\",\"Pixel Nexus Global expressly disclaims all liability for any trading losses, missed opportunities, or other financial consequences resulting from your reliance on Platform content. By continuing to use iccandle.ai, you confirm your understanding that our tools are designed for informational purposes only and that you alone bear complete responsibility for all investment choices and outcomes. This warning constitutes an essential term of our agreement, and your use of the Platform signifies your unconditional acceptance of these risk disclosures.\"]},{\"title\":\"10. Отказ от гарантий и ограничения сервиса\",\"paragraphs\":[\"The Pixel Nexus Global platform (iccandle.ai), including all Services, scripts, reports, analytical engines, and related technology, is provided strictly on an \\\"AS-IS\\\" and \\\"AS- AVAILABLE\\\" basis. Pixel Nexus Global makes no representations or warranties of any kind, whether express or implied. This includes, but is not limited to, all implied warranties of non-infringement, merchantability, fitness for a particular purpose, accuracy, quality, or achievement of specific results. No warranties arise from any course of dealing, performance, or trade usage.\",\"Pixel Nexus Global does not guarantee that the Service will meet your requirements, operate without interruption, remain error-free, or be secure from viruses or other harmful components. Compatibility with all websites or browsers is not assured, and Pixel Nexus Global disclaims all liability for issues arising from browser incompatibility or third-party services, even if such services appear integrated with our Platform. Any data transmitted via our Services remains your sole responsibility, and Pixel Nexus Global expressly disclaims liability for such content. No warranties provided by third- party vendors to Pixel Nexus Global extend to you, and you are not a third-party beneficiary of such agreements.\"],\"subsections\":[{\"title\":\"Функции оповещений и бета-функции\",\"paragraphs\":[\"The Platform includes alert features (e.g., \\\"Dynamic Price Alerts\\\" and \\\"Multi-Factor Alerts\\\"), which are provided without warranty or guarantee of reliability. Technical delays or failures may occur due to cellular networks, email services, system errors, or other factors. You acknowledge that alerts may not function as intended and agree that Pixel Nexus Global bears no liability for trading losses resulting from reliance on these features, regardless of whether they were used correctly.\",\"Certain features labeled as 'Beta' are under active development and may exhibit unstable or unreliable performance, including inconsistent data or incorrect information due to software bugs or programming errors. These Beta features carry additional risks and should be used with extreme caution.\"]},{\"title\":\"Общие положения\",\"paragraphs\":[\"This warranty disclaimer applies to all oral or written information provided by Pixel Nexus Global, its employees, affiliates, or third-party vendors. You may not rely on any such statements or representations.\",\"Some jurisdictions may not permit the exclusion of certain warranties. If applicable to you, any warranty claim must be filed within ninety (90) days of the Service provision that gave rise to the claim. Failure to submit a claim within this period constitutes an irrevocable waiver of your right to pursue such claims thereafter.\",\"Third-party websites linked through the Pixel Nexus Global platform are not under our control, and we assume no responsibility for their content or functionality. Accessing these external sites is entirely at your own risk. Such links are provided for convenience only and do not constitute an endorsement or recommendation by Pixel Nexus Global.\",\"By using the Platform, you acknowledge and accept these limitations and disclaimers in full.\"]}]},{\"title\":\"11. Ограничение ответственности\",\"paragraphs\":[\"Pixel Nexus Global's total liability under this Agreement shall not exceed the aggregate fees actually paid by you to Pixel Nexus Global during the one (1) month period immediately preceding the event giving rise to such liability. For purposes of this limitation, \\\"Pixel Nexus Global\\\" includes its employees, agents, owners, directors, officers, affiliates, and any third-party service providers facilitating the Services.\",\"To the maximum extent permitted by law, you agree that under no circumstances - including negligence - shall Pixel Nexus Global or its licensors, agents, employees, officers, or third-party vendors be liable for any indirect, incidental, special, consequential, or punitive damages. This exclusion applies to, but is not limited to, damages for:\"],\"listOrdered\":[\"Упущенная прибыль или доход\",\"Прерывание бизнеса\",\"Потеря или повреждение данных\",\"Потеря сбережений\",\"Любые другие финансовые потери, понесённые вами, конечными пользователями или третьими лицами\"],\"paragraphsAfter\":[\"These limitations apply regardless of whether the action arises in contract, tort (including negligence), or any other legal theory, and shall remain in effect even if Pixel Nexus Global has been advised of the possibility of such damages. While some jurisdictions may not allow limitations on certain liabilities, you agree that, where such restrictions apply, Pixel Nexus Global's liability shall be limited to the maximum extent permitted by applicable law.\",\"This limitation of liability constitutes an essential basis of the bargain between you and Pixel Nexus Global and shall survive termination of this Agreement. By using the Services, you acknowledge that these limitations are reasonable and reflect the risk allocation between both parties.\"]},{\"title\":\"12. Уведомления\",\"paragraphs\":[\"All official notices will be sent to your account’s listed contact information. You are responsible for maintaining current and accurate contact details in our records at all times.\",\"For most inquiries, including technical support and billing matters, please visit our website at www.iccandle.ai for contact information and support options.\",\"However, any legal notices regarding these Terms of Service or other Pixel Nexus Global policies must be sent exclusively via postal mail to our designated address:\"],\"address\":{\"company\":\"Pixel Nexus Global PTE. LTD.\",\"lines\":[\"160 Robinson Road, #14-04\",\"Singapore Business Federation Center\",\"Singapore 068914\"]}},{\"title\":\"13. Форс-мажор\",\"paragraphs\":[\"Neither party shall be liable for any failure or delay in performance (except for payment obligations) due to events beyond their reasonable control, including, but not limited to, acts of God, natural disasters, war, civil unrest, epidemics, labor disputes, utility failures, telecommunication outages, supply chain disruptions, government actions, or other unforeseeable catastrophic events; provided that: (i) the affected party notifies the other in writing within ten (10) days of the event’s commencement; (ii) all payment obligations remain unaffected; (iii) the time for performance shall be extended day-for-day to match the duration of the disruption; and (iv) both parties use commercially reasonable efforts to mitigate the impact.\",\"It is understood that this clause does not permit termination of the Agreement solely due to force majeure conditions, nor does it extend the Agreement term beyond its original expiration date without mutual written agreement.\"]},{\"title\":\"14. Отказ от прав\",\"paragraphs\":[\"No failure or delay by Pixel Nexus Global in exercising any right under these Terms shall operate as a waiver of that right, nor shall any single or partial exercise of any right preclude the further or full exercise of that right or any other right under these Terms.\"]},{\"title\":\"15. Уступка\",\"paragraphs\":[\"Pixel Nexus Global may assign these Terms, or any rights hereunder, without your consent. You may not assign these Terms without our prior written approval. These Terms shall be binding upon, and inure to the benefit of, the parties' respective successors and permitted assigns.\"]},{\"title\":\"16. Разделимость\",\"paragraphs\":[\"If any provision of these Terms is held to be invalid or unenforceable by a court of competent jurisdiction, that provision shall be modified to the minimum extent necessary to make it valid and enforceable while preserving its original intent. All other provisions shall remain in full force and effect.\"]},{\"title\":\"17. Отсутствие агентских отношений\",\"paragraphs\":[\"Nothing in these Terms creates an agency, partnership, joint venture or employment relationship between the parties. Neither party has authority to bind the other or incur obligations on the other's behalf.\"]},{\"title\":\"18. Конфиденциальность и конфликты\",\"paragraphs\":[\"Our Privacy Policy is incorporated herein by reference. In the event of a conflict between agreements: (i) these Terms prevail over the Privacy Policy; (ii) any separate service agreement shall prevail over conflicting provisions of these Terms, but only with respect to those specific provisions; and (iii) in all other cases, these Terms shall govern.\"]},{\"title\":\"19. Юрисдикция и ограничения\",\"paragraphs\":[\"The services and information provided on iccandle.ai are not intended for use in jurisdictions where such services would be contrary to local laws or regulations. Access to and use of this website are strictly prohibited for citizens of the following jurisdictions: United States of America, Canada, Russian Federation, Iran, North Korea, Myanmar, Syria, Cuba, Crimea, Donetsk, and Luhansk regions of Ukraine, Afghanistan, Belarus, and Venezuela. This list may be updated at any time without prior notice. Users are solely responsible for ensuring that their access to and use of this website comply with all applicable laws and regulations in their country. iccandle.ai accepts no responsibility or liability for any non-compliance by users with their local regulatory requirements and reserves the right to restrict, block, or terminate access at its sole discretion.\"]}],\"content\":\"Условия обслуживания, TOS, условия, положения, отказ от ответственности, договор, соглашение\\nНастоящее соглашение заключается между Pixel Nexus Global, сингапурской компанией с ограниченной ответственностью, осуществляющей деятельность через сайт www.iccandle.ai («Pixel Nexus Global», «мы», «нас» или «наш»), и физическим или юридическим лицом, приобретающим или использующим услуги, предлагаемые через Платформу («Клиент», «вы» или «ваш»). Если вы приобретаете Услуги от имени третьей стороны, вы подтверждаете, что обладаете законными полномочиями обязать такую сторону соблюдать настоящие Условия обслуживания и несёте ответственность за их использование Услуг.\\n\\nУсловия обслуживания, TOS, условия, положения, отказ от ответственности, договор, соглашение Настоящее соглашение заключается между Pixel Nexus Global, сингапурской компанией с ограниченной ответственностью, осуществляющей деятельность через сайт www.iccandle.ai («Pixel Nexus Global», «мы», «нас» или «наш»), и физическим или юридическим лицом, приобретающим или использующим услуги, предлагаемые через Платформу («Клиент», «вы» или «ваш»). Если вы приобретаете Услуги от имени третьей стороны, вы подтверждаете, что обладаете законными полномочиями обязать такую сторону соблюдать настоящие Условия обслуживания и несёте ответственность за их использование Услуг.\\n\\nПолучая доступ к Платформе и Услугам, описанным в настоящем документе и размещённым на www.iccandle.ai, либо оформляя подписку через сайт iccandle.ai, вы подтверждаете, что прочитали, поняли и согласились с настоящими Условиями, Положениями и отказами от ответственности. Вы также соглашаетесь, что ваши отношения с нами регулируются положениями настоящих TOS.\\nЕсли вы не принимаете данные условия, вы обязаны немедленно прекратить использование iccandle.ai и любых связанных услуг или платформ.\\n\\n1. Услуги\\n\\nPixel Nexus Global предоставляет действующим клиентам, находящимся в надлежащем статусе, доступ к своему аналитическому инструменту на базе искусственного интеллекта («Платформа»).\\nВ рамках настоящего соглашения термин «Услуги» означает предоставление Pixel Nexus Global доступа к Платформе.\\nУслуги предоставляются в рамках одной или нескольких подписок, активаций аккаунта, регистраций или заказов, оформленных вами на сайте iccandle.ai и принятых Pixel Nexus Global («Заказ»).\\n\\nPixel Nexus Global предоставляет действующим клиентам, находящимся в надлежащем статусе, доступ к своему аналитическому инструменту на базе искусственного интеллекта («Платформа»). В рамках настоящего соглашения термин «Услуги» означает предоставление Pixel Nexus Global доступа к Платформе. Услуги предоставляются в рамках одной или нескольких подписок, активаций аккаунта, регистраций или заказов, оформленных вами на сайте iccandle.ai и принятых Pixel Nexus Global («Заказ»).\\n\\nВ случае противоречий между настоящими TOS и Заказом, приоритет имеют положения настоящих TOS.\\nПринимая Услуги, вы соглашаетесь, что любые иные или дополнительные условия, предложенные вами в Заказе или иным образом, прямо отклоняются Pixel Nexus Global, если только мы не согласовали их в письменной форме, подписанной уполномоченным представителем.\\n\\n2. Ваши обязательства\\nИнформация о клиенте и ответственность за аккаунт\\n\\nВы соглашаетесь предоставлять Pixel Nexus Global точную информацию при создании аккаунта, в течение всего периода взаимодействия и во всей переписке. Мы можем периодически связываться с вами по электронной почте или телефону. Вы обязуетесь поддерживать действующий e-mail, проверяемый ежедневно, и своевременно сообщать об изменениях контактных данных.\\n\\nВы соглашаетесь предоставлять Pixel Nexus Global точную информацию при создании аккаунта, в течение всего периода взаимодействия и во всей переписке.\\nМы можем периодически связываться с вами по электронной почте или телефону.\\nВы обязуетесь поддерживать действующий e-mail, проверяемый ежедневно, и своевременно сообщать об изменениях контактных данных.\\n\\nPixel Nexus Global не несёт ответственности за перебои в обслуживании, ущерб или последствия, вызванные некорректной доставкой сообщений из-за устаревших контактных данных. Вы также соглашаетесь полностью и добросовестно заполнять все анкеты на платформе для соблюдения требований регуляторов бирж.\\n\\nРазрешённое использование платформы\\nРазрешённое использование платформы\\n\\nИспользование Платформы должно соответствовать настоящим TOS и сопутствующей документации.\\nЕсли вы предоставляете доступ третьим лицам, вы обязуетесь: (i) ограничивать их использование в соответствии с условиями; (ii) обеспечивать соблюдение ими TOS и Политики конфиденциальности; (iii) нести полную ответственность за любые их нарушения.\\n\\nИспользование Платформы должно соответствовать настоящим TOS и сопутствующей документации.\\nЕсли вы предоставляете доступ третьим лицам,\\nвы обязуетесь: (i) ограничивать их использование в соответствии с условиями;\\n(ii) обеспечивать соблюдение ими TOS и Политики конфиденциальности;\\n(iii) нести полную ответственность за любые их нарушения.\\n\\nИнтеллектуальная собственность и соблюдение закона\\nИнтеллектуальная собственность и соблюдение закона\\nИнтеллектуальная собственность и соблюдение закона\\nИнтеллектуальная собственность и соблюдение закона\\nИнтеллектуальная собственность и соблюдение закона\\n\\nВы не имеете права изменять или удалять уведомления о товарных знаках и собственности. Использование Платформы допускается только в рамках:\\n(i) законодательства, регулирующего настоящие TOS;\\n(ii) всех применимых законов вашей юрисдикции.\\n\\nНесанкционированное использование строго запрещено.\\n\\nНесанкционированное испол\\nьзование строго запрещено.\\n\\n3. Срок действия\\nДата вступления в силу\\n\\nНастоящие Условия вступают в силу («Дата вступления в силу») с момента: (i) нажатия «Я принимаю» (фиксируется сервером),\\nили (ii) первого доступа или использования Платформы.\\n\\nУсловия действуют на протяжении любого активного Заказа.\\n\\nУсловия действуют на протяже\\nнии любого активного Заказа.\\n\\nПодписка и продление\\n\\nУслуги автоматически продлеваются (ежемесячно, ежеквартально или ежегодно) согласно Заказу.\\nПо умолчанию срок подписки — 1 месяц.\\n\\nПробный период\\nПробный период\\n\\nПробный период\\n\\nPixel Nexus Global может предоставлять пробные периоды (платные или бесплатные).\\nВ течение пробного периода:\\n\\nприменяются все условия как для платной подписки; вы можете отменить подписку до автоматического продления; условия могут изменяться без уведомления. Управление подпиской\\n\\nВы самостоятельно отвечаете за:\\n\\nВы самостоятельно отвечаете за:\\n\\nконтроль дат продления; обновление платёжных данных;\\nотмену подписки; актуальность контактных данных.\\n\\nPixel Nexus Global не несёт ответственности за списания из-за вашего несоблюдения этих обязанностей.\\n\\n4. Прекращение Отмена и возвраты\\n\\n4. Прекращение Отмена и возвраты\\n\\nИнформация о возвратах размещена на странице Refund and Cancellation Policy на iccandle.ai.\\nОтмена аккаунта отключает автопродление, но не аннулирует уже выставленные счета.\\n\\nРасторжение по инициативе сторон\\nРасторжение по инициативе сторон\\n\\nЛюбая сторона может расторгнуть Заказ, уведомив другую сторону минимум за 1 день до окончания срока.\\n\\nЛюбая сторона может расторгнуть Заказ, уведомив другую сторону минимум за 1 день до окончания срока.\\n\\nНарушения\\nНарушения\\n\\nPixel Nexus Global может немедленно приостановить или прекратить доступ без уведомления и возврата средств при нарушении условий или законодательства.\\n\\nПоследствия\\nПоследствия\\n\\nПоследствия\\n\\nОбязательства, возникшие до прекращения, сохраняются. Все задолженности должны быть оплачены.\\nВозврат средств не гарантируется.\\n\\n5. Лицензия и ограничения\\n\\nPixel Nexus Global предоставляет ограниченную, отзывную, неисключительную и непередаваемую лицензию на использование технологии («Pixel Nexus Technology») исключительно для доступа к аналитическим инструментам.\\n\\nPixel Nexus Global предоставляет ограниченную, отзывную, неисключительную и непередаваемую лицензию на использование технологии («Pixel Nexus Technology») исключительно для доступа к аналитическим инструментам.\\n\\nЗапрещено:\\nЗапрещено:\\n\\nпередача, продажа, аренда, сублицензирование; обратная разработка, декомпиляция; обход защитных механизмов; предоставление доступа третьим лицам.\\n\\nВсе права принадлежат Pixel Nexus Global.\\nВсе права принадлежат Pixel Nexus Global.\\nВсе права принадлежат Pixel Nexus Global.\\nВсе права принадлежат Pixel Nexus Global.\\nВсе права принадлежат Pixel Nexus Global.\\nВсе права принадлежат Pixel Nexus Global.\\n\\nВсе права принадлежат Pixel Nexus Global.\\n\\n6.\\nИспользование данных и ИС\\n\\nКомпания может использовать данные пользователя («Operational Information») для поддержки и улучшения услуг. Вы предоставляете бессрочную лицензию на обработку данных.\\n\\nPixel Nexus Global сохраняет исключительные права на результаты анализа и может коммерциализировать их без компенсации пользователю.\\n\\nPixel Nexus Global сохраняет исключительные права на результаты ан\\nализа и может коммерциализировать их без компенсации пользователю.\\n\\n7–9. Отказ от ответственности и риски\\n\\nПлатформа использует сторонние данные и предоставляется «как есть». Информация может быть неточной и не является инвестиционной рекомендацией. Пользователь полностью принимает риски финансовых потерь и обязан проводить самостоятельный анализ.\\n\\n10.\\nОтсутствие гарантий\\n\\n10. Отсутствие гарантий\\n\\nНет гарантий работоспособности, точности, отсутствия ошибок или бесперебойности.\\nБета-функции могут быть нестабильными.\\n\\n11.\\nОграничение ответственности\\n\\nМаксимальная ответственность ограничивается суммой, уплаченной за последний месяц.\\nКомпания не несёт ответственности за косвенные или случайные убытки.\\n\\nМаксимальная ответственность ограничивается суммой, уплаченной за последний месяц.\\nКомпания не несёт ответственности за косвенные или случайные убытки.\\n\\n12–19.\\nПрочие условия\\n\\nВключают уведомления, форс-мажор, отказ от прав, уступку прав,\\nразделимость положений, отсутствие агентских отношений, приоритет документов, юрисдикционные ограничения и запреты на использование в определённых странах.\"},\"Refund\":{\"title\":\"Политика возврата и отмены\",\"intro\":\"Настоящая Политика возврата и отмены («Политика») регулирует условия возврата и отмены услуг, предоставляемых компанией Pixel Nexus Global Pte. Ltd. («мы», «нас») через платформу iccandle.ai («Сервис»). Данная Политика является частью Условий обслуживания и должна рассматриваться совместно с ними.\",\"sections\":[{\"title\":\"1. Определения\",\"definitions\":[{\"term\":\"Подписка\",\"text\":\"A recurring paid access to the Services for a specified period (e.g., monthly or annually).\"},{\"term\":\"Биллинг-период\",\"text\":\"The recurring time interval for which a Subscription fee is charged.\"},{\"term\":\"Изменение подписки\",\"text\":\"Any upgrade or downgrade to a different Subscription plan.\"}]},{\"title\":\"2. Условия отмены\",\"subsections\":[{\"title\":\"Отмена подписки\",\"listDisc\":[\"You may cancel your Subscription at any time through your account dashboard or by contacting support.\",\"Cancellation will take effect at the end of the current billing period; you will retain access to the Services through the end of that period.\",\"Cancelling your Subscription does not automatically entitle you to a refund of fees already paid.\"]}]},{\"title\":\"3. Условия возврата\",\"subsections\":[{\"title\":\"3.1 Общие положения\",\"paragraphs\":[\"Except as expressly provided in this Policy or required by applicable law, all fees paid for Subscriptions are non‑refundable once charged.\"]},{\"title\":\"3.2 Случаи возможного возврата\",\"paragraphs\":[\"We may issue a refund at our sole discretion only in limited circumstances, including but not limited to:\"],\"listDisc\":[\"Duplicate payments (verified duplicate charges will be refunded).\",\"Technical errors that demonstrably prevented access to Services, where the error was not caused by user actions and is verified by us.\",\"Applicable statutory rights under consumer protection law where these rights apply and cannot be waived.\"],\"paragraphsAfter\":[\"Refunds, if approved, will be processed to the original payment method within a commercially reasonable timeframe determined by payment processors and banking partners.\"]},{\"title\":\"3.3 Отсутствие возврата за частичное использование\",\"paragraphs\":[\"Refunds will not be issued for:\"],\"listDisc\":[\"Partial use of the Services during a billing period.\",\"Downgrades of Subscription plans.\",\"Change of mind or business decisions after payment.\",\"Subscription cancellations submitted after a billing cycle has renewed.\"]}]},{\"title\":\"4. Изменение подписки\",\"paragraphs\":[\"We provide two options when changing your Subscription plan:\"],\"subsections\":[{\"title\":\"4.1 Немедленное изменение\",\"paragraphs\":[\"If you select \\\"Change Now,\\\" your new plan will take effect immediately, and the associated charge will be applied.\",\"Please note that no refunds, credits, or prorated adjustments will be provided for any unused portion of your current plan.\"]},{\"title\":\"4.2 Изменение со следующего периода\",\"paragraphs\":[\"If you choose \\\"Change on Next Billing,\\\" your current plan will remain active until the end of the current Billing Period.\",\"The new plan will take effect at the start of the next Billing Period.\",\"No refunds or credits apply to the current Billing Period.\"]}]},{\"title\":\"5. Отмена после продления\",\"paragraphs\":[\"If an automatic renewal has already occurred before you submit a cancellation request: The renewal fee is non-refundable. The cancellation will apply to the next Billing Period.\"]},{\"title\":\"6. Чарджбэки и споры\",\"paragraphs\":[\"We maintain a strict no-tolerance policy toward unjustified chargebacks.\",\"Initiating a chargeback or payment dispute without first contacting us to seek resolution is considered a breach of this Refund and Cancellation Policy and our Terms of Service. Such actions may result in immediate suspension or permanent termination of your account, without notice, and forfeiture of access to the Services.\",\"We reserve the right to challenge and dispute any chargeback that we deem unauthorized, abusive, or inconsistent with this Policy. This includes providing payment processors, banks, and financial institutions with all relevant evidence, including but not limited to:\"],\"listDisc\":[\"Подтверждение оказания услуг и журналы доступа\",\"Записи активности аккаунта\",\"Принятие наших Условий обслуживания и политик\",\"История переписки с клиентом\"],\"paragraphsAfter\":[\"Customers are strongly encouraged to contact our support team first to resolve any billing concerns. We are committed to addressing legitimate issues in good faith; however, chargebacks used as a substitute for cancellation or refund requests will not be tolerated.\"]},{\"title\":\"7. Изменение Политики\",\"paragraphs\":[\"We may update this Policy from time to time. Material changes will be posted on our website or communicated via email prior to taking effect. Continued use of the Services after such updates constitutes acceptance of the revised Policy.\"]},{\"title\":\"8. Контакты\",\"paragraphs\":[\"For all cancellation and refund requests, please contact our support team via our help center.\"]}],\"content\":\"Политика возврата и отмены\\n\\nНастоящая Политика возврата и отмены («Политика») регулирует условия возврата и отмены услуг, предоставляемых компанией Pixel Nexus Global Pte. Ltd. («мы», «нас») через платформу iccandle.ai («Сервис»). Данная Политика является частью Условий обслуживания и должна рассматриваться совместно с ними.\\n\\n1. Определения\\n\\nПодписка (Subscription): платный доступ к Сервису на определённый период (ежемесячно или ежегодно).\\n\\nБиллинг-период (Billing Period): повторяющийся интервал списания оплаты.\\n\\nИзменение подписки (Subscription Change): переход на другой тариф (повышение или понижение).\\n\\n2. Условия отмены\\nОтмена подписки\\nПодписку можно отменить в любое время через личный кабинет или поддержку\\nОтмена вступает в силу в конце текущего биллингового периода\\nДоступ к сервису сохраняется до конца оплаченного периода\\nУже оплаченные средства не подлежат автоматическому возврату\\n3. Условия возврата\\n3.1 Общие положения\\n\\nЕсли иное не предусмотрено настоящей Политикой или законом, все оплаченные суммы не подлежат возврату после списания.\\n\\n3.2 Случаи возможного возврата\\n\\nВозврат может быть произведён по нашему усмотрению в ограниченных случаях:\\n\\nДвойное списание (подтверждённое)\\nТехническая ошибка, полностью препятствующая доступу к сервису (не по вине пользователя)\\nПрава, предусмотренные законодательством о защите прав потребителей\\n\\nОдобренные возвраты обрабатываются через исходный платёжный метод в разумные сроки.\\n\\n3.3 Отсутствие возврата за частичное использование\\n\\nВозврат не предоставляется за:\\n\\nЧастичное использование периода\\nПонижение тарифа\\nИзменение решения после оплаты\\nОтмену после автоматического продления\\n4. Изменение подписки\\n4.1 Немедленное изменение\\n\\nНовый тариф вступает в силу сразу, соответствующая сумма списывается немедленно. Возвраты за неиспользованный период не предоставляются.\\n\\n4.2 Изменение со следующего периода\\n\\nТекущий тариф действует до конца периода, новый тариф вступает в силу со следующего биллинга.\\n\\n5. Отмена после продления\\n\\nЕсли подписка уже была автоматически продлена, возврат за текущий период не предоставляется, отмена применяется со следующего периода.\\n\\n6. Чарджбэки и споры\\n\\nМы не допускаем необоснованные чарджбэки.\\n\\nИнициирование спора без предварительного обращения в поддержку считается нарушением Политики и может привести к блокировке или удалению аккаунта.\\n\\n7. Изменение Политики\\n\\nМы можем периодически обновлять Политику. Существенные изменения будут заранее опубликованы или отправлены по электронной почте.\\n\\n8. Контакты\\n\\nВсе запросы на возврат и отмену направляйте через службу поддержки.\"},\"Privacy\":{\"title\":\"Политика конфиденциальности\",\"intro\":\"Настоящая Политика конфиденциальности объясняет, как Pixel Nexus Global Pte. Ltd. («мы», «нас») собирает, использует, раскрывает и защищает персональные данные при использовании веб-сайта, приложений и сервисов (далее — «Сервисы»).\",\"sections\":[{\"title\":\"1. Собираемая информация\",\"paragraphs\":[\"We collect the following information:\"],\"listDisc\":[\"Адрес электронной почты, предоставленный при регистрации\",\"Service usage information, including interactions with features, pages viewed, session activity, and general usage patterns, collected to improve the functionality, performance, and user experience of our Services\"],\"paragraphsAfter\":[\"Мы не собираем, не храним и не обрабатываем данные банковских карт или другую чувствительную платёжную информацию.\"]},{\"title\":\"2. Платежи и Stripe\",\"paragraphs\":[\"All payment transactions are processed by our third-party payment service provider, Stripe.\",\"When you make a payment, Stripe collects and processes payment-related information (such as card details, billing information, and transaction data) directly. This information is handled in accordance with Stripe’s Privacy Policy and security standards, including PCI-DSS compliance.\",\"We only receive limited information from Stripe necessary to operate our Services, including:\"],\"listDisc\":[\"подтверждение платежа\",\"статус подписки\",\"идентификаторы транзакций\"],\"paragraphsAfter\":[\"Мы не имеем доступа к полным платёжным данным.\",\"You can review Stripe’s Privacy Policy here:\"],\"stripePrivacyUrl\":\"https://stripe.com/privacy\"},{\"title\":\"3. Использование информации\",\"paragraphs\":[\"We use the email addresses we collect to:\"],\"listDisc\":[\"Provide, operate, and maintain our Services\",\"Analyze service usage and improve product functionality, performance, and user experience\",\"Communicate with you regarding technical notices, updates, and support\",\"Inform you about products, services, features, and events\"]},{\"title\":\"4. Передача данных\",\"paragraphs\":[\"We do not sell your personal information.\",\"We may share your information only with:\"],\"listDisc\":[\"Service providers who support our operations (including hosting, analytics, and payment processing via Stripe)\",\"Professional advisors, such as legal, accounting, or compliance consultants\",\"Law enforcement or regulatory authorities, when required by law or to protect our legal rights\"],\"paragraphsAfter\":[\"All third-party service providers are required to process personal data in accordance with applicable data protection laws.\"]},{\"title\":\"5. Ваши права\",\"paragraphs\":[\"Depending on your location, you may have the right to:\"],\"listDisc\":[\"получить доступ к данным\",\"исправить email\",\"удалить данные\",\"ограничить или возразить против обработки\"],\"paragraphsAfter\":[\"Requests related to payment data should be directed to Stripe, as they act as the data controller for payment information.\"]},{\"title\":\"6. Сторонние сервисы\",\"paragraphs\":[\"Our Services rely on third-party providers such as Stripe. Their handling of personal data is governed by their own privacy policies, and we encourage you to review them.\"]},{\"title\":\"7. Контакты\",\"paragraphs\":[\"If you have any questions about this Privacy Policy or our data practices, please contact us at:\",\"support@iccandle.ai\"]}],\"content\":\"Политика конфиденциальности\\n\\nНастоящая Политика конфиденциальности объясняет, как Pixel Nexus Global Pte. Ltd. («мы», «нас») собирает, использует, раскрывает и защищает персональные данные при использовании веб-сайта, приложений и сервисов (далее — «Сервисы»).\\n\\n1. Собираемая информация\\n\\nМы собираем следующие данные:\\n\\nАдрес электронной почты, предоставленный при регистрации\\nДанные об использовании сервиса (взаимодействие с функциями, просмотренные страницы, сессии и модели использования)\\n\\nЭти данные используются для улучшения функциональности, производительности и пользовательского опыта.\\n\\nМы не собираем, не храним и не обрабатываем данные банковских карт или другую чувствительную платёжную информацию.\\n\\n2. Платежи и Stripe\\n\\nВсе платежи обрабатываются сторонним провайдером Stripe.\\n\\nПри оплате Stripe напрямую собирает и обрабатывает платёжные данные (данные карты, биллинг-информация и транзакции) в соответствии со своей политикой конфиденциальности и стандартом PCI-DSS.\\n\\nМы получаем от Stripe только ограниченную информацию:\\n\\nподтверждение платежа\\nстатус подписки\\nидентификаторы транзакций\\n\\nМы не имеем доступа к полным платёжным данным.\\n\\nПолитика конфиденциальности Stripe: https://stripe.com/privacy\\n\\n3. Использование информации\\n\\nМы используем email для:\\n\\nпредоставления и поддержки сервиса\\nанализа и улучшения продукта\\nтехнических уведомлений и поддержки\\nинформирования о функциях и обновлениях\\n4. Передача данных\\n\\nМы не продаём персональные данные.\\n\\nМы можем передавать данные только:\\n\\nпоставщикам услуг (хостинг, аналитика, Stripe)\\nюридическим, бухгалтерским и комплаенс-консультантам\\nгосударственным органам при необходимости по закону\\n\\nВсе третьи стороны обязаны соблюдать законы о защите данных.\\n\\n5. Ваши права\\n\\nВ зависимости от юрисдикции вы можете иметь право:\\n\\nполучить доступ к данным\\nисправить email\\nудалить данные\\nограничить или возразить против обработки\\n\\nЗапросы по платёжным данным следует направлять напрямую в Stripe.\\n\\n6. Сторонние сервисы\\n\\nНаши сервисы используют сторонние платформы (например, Stripe), которые обрабатывают данные по своим политикам.\\n\\n7. Контакты\\n\\nsupport@iccandle.ai\"},\"Cookie\":{\"title\":\"Политика использования файлов куки\",\"intro\":[\"This Cookie Policy explains how Pixel Nexus Global Pte. Ltd. (\\\"we\\\", \\\"us\\\", or \\\"our\\\") uses cookies and similar technologies when you visit or use iccandle.ai and related services (collectively, the \\\"Services\\\").\",\"Эта Политика должна рассматриваться совместно с Политикой конфиденциальности.\"],\"sections\":[{\"title\":\"1. Что такое куки\",\"paragraphs\":[\"Cookies — это небольшие текстовые файлы, которые сохраняются на вашем устройстве при посещении веб-сайта. Они используются для:\",\"обеспечения работы сайта\"],\"listDisc\":[\"Сессионные куки (удаляются при закрытии браузера)\",\"Постоянные куки (хранятся определённый срок или до удаления).\"]},{\"title\":\"2. Типы используемых куки\",\"subsections\":[{\"title\":\"2.1 Строго необходимые куки\",\"paragraphs\":[\"Постоянные cookies (хранятся определённый срок или до удаления)\"],\"listDisc\":[\"безопасный вход и аутентификация\",\"поддержание пользовательских сессий\",\"защита от мошенничества и злоупотреблений\"],\"paragraphsAfter\":[\"Без этих куки сервис не может работать должным образом.\"]},{\"title\":\"2.2 Функциональные куки\",\"paragraphs\":[\"защита от мошенничества и злоупотреблений\"],\"listDisc\":[\"язык и регион\",\"настройки аккаунта\"],\"paragraphsAfter\":[\"Они улучшают удобство, но не являются строго необходимыми.\"]},{\"title\":\"2.3 Аналитические и производительные куки\",\"paragraphs\":[\"2.3 Аналитические и производительные cookies\"],\"listDisc\":[\"посещённые страницы\",\"продолжительность сессий\",\"данные об ошибках и производительности\"],\"paragraphsAfter\":[\"данные об ошибках и производительности\"]},{\"title\":\"2.4 Сторонние куки\",\"paragraphs\":[\"2.4 Сторонние cookies\"],\"listDisc\":[\"Некоторые cookies устанавливаются сторонними поставщиками:\",\"платёжные системы (например, Stripe)\"],\"paragraphsAfter\":[\"аналитические и инфраструктурные провайдеры\"]}]},{\"title\":\"3. Для чего мы НЕ используем куки\",\"listDisc\":[\"реклама и поведенческий таргетинг\",\"продажа cookie-данных\",\"сбор чувствительной персональной информации\"]},{\"title\":\"4. Управление куки\",\"paragraphs\":[\"4. Управление cookies\"],\"listDisc\":[\"просмотр куки\",\"удаление куки\",\"блокировка куки\"],\"paragraphsAfter\":[\"Отключение некоторых куки может повлиять на работу сервиса.\"]},{\"title\":\"5. Изменения политики\",\"paragraphs\":[\"5. Изменения политики\"]},{\"title\":\"6. Контакты\",\"paragraphs\":[\"6. Контакты\",\"support@iccandle.ai\"]}],\"content\":\"Политика использования файлов cookie\\n\\nНастоящая Политика использования файлов cookie объясняет, как Pixel Nexus Global Pte. Ltd. («мы», «нас») использует файлы cookie и аналогичные технологии при посещении или использовании iccandle.ai и связанных сервисов (далее — «Сервисы»).\\n\\nЭта Политика должна рассматриваться совместно с Политикой конфиденциальности.\\n\\n1. Что такое cookies\\n\\nCookies — это небольшие текстовые файлы, которые сохраняются на вашем устройстве при посещении веб-сайта. Они используются для:\\n\\nобеспечения работы сайта\\nулучшения пользовательского опыта\\nпредоставления информации владельцам сайта\\n\\nCookies бывают:\\n\\nСессионные cookies (удаляются при закрытии браузера)\\nПостоянные cookies (хранятся определённый срок или до удаления)\\n2. Типы используемых cookies\\n2.1 Строго необходимые cookies\\n\\nЭти cookies необходимы для работы сервиса и не могут быть отключены.\\n\\nбезопасный вход и аутентификация\\nподдержание пользовательских сессий\\nзащита от мошенничества и злоупотреблений\\n2.2 Функциональные cookies\\n\\nИспользуются для запоминания ваших настроек:\\n\\nязык и регион\\nнастройки аккаунта\\n2.3 Аналитические и производительные cookies\\n\\nИспользуются для анализа того, как пользователи взаимодействуют с сервисом:\\n\\nпосещённые страницы\\nпродолжительность сессий\\nданные об ошибках и производительности\\n\\nЭти данные используются только для улучшения сервиса и не идентифицируют пользователей напрямую.\\n\\n2.4 Сторонние cookies\\n\\nНекоторые cookies устанавливаются сторонними поставщиками:\\n\\nплатёжные системы (например, Stripe)\\nаналитические и инфраструктурные провайдеры\\n\\nЭти третьи стороны используют cookies в соответствии со своими политиками.\\n\\n3. Для чего мы НЕ используем cookies\\nреклама и поведенческий таргетинг\\nпродажа cookie-данных\\nсбор чувствительной персональной информации\\n4. Управление cookies\\n\\nВы можете управлять cookies через настройки браузера:\\n\\nпросмотр cookies\\nудаление cookies\\nблокировка cookies\\n\\nОтключение некоторых cookies может повлиять на работу сервиса.\\n\\n5. Изменения политики\\n\\nМы можем обновлять эту Политику. Существенные изменения будут опубликованы на сайте. Продолжение использования сервиса означает согласие с обновлениями.\\n\\n6. Контакты\\n\\nsupport@iccandle.ai\"}}")
7403
7403
  }
7404
7404
  };
7405
- function ce(e, t) {
7405
+ function re(e, t) {
7406
7406
  let n = t.split("."), r = e;
7407
7407
  for (let e of n) {
7408
7408
  if (!r || typeof r != "object" || !(e in r)) return;
@@ -7410,38 +7410,38 @@ function ce(e, t) {
7410
7410
  }
7411
7411
  return typeof r == "string" ? r : void 0;
7412
7412
  }
7413
- function K(e, t) {
7413
+ function ie(e, t) {
7414
7414
  return t ? e.replace(/\{(\w+)\}/g, (e, n) => t[n] == null ? `{${n}}` : String(t[n])) : e;
7415
7415
  }
7416
- function q(e, t, n) {
7417
- return K(ce(se[e], t) ?? ce(se.en, t) ?? t, n);
7416
+ function ae(e, t, n) {
7417
+ return ie(re(ne[e], t) ?? re(ne.en, t) ?? t, n);
7418
7418
  }
7419
7419
  //#endregion
7420
7420
  //#region src/context/widget-language.ts
7421
- var J = Symbol("widget-language");
7422
- function le(e) {
7421
+ var oe = Symbol("widget-language");
7422
+ function se(e) {
7423
7423
  let t = {
7424
7424
  language: e,
7425
- t: (t, n) => q(e.value, t, n)
7425
+ t: (t, n) => ae(e.value, t, n)
7426
7426
  };
7427
- return S(J, t), t;
7427
+ return S(oe, t), t;
7428
7428
  }
7429
- function Y() {
7430
- return f(J) || {
7429
+ function Z() {
7430
+ return f(oe) || {
7431
7431
  language: r(() => "en"),
7432
- t: ((e, t) => q("en", e, t))
7432
+ t: ((e, t) => ae("en", e, t))
7433
7433
  };
7434
7434
  }
7435
7435
  //#endregion
7436
7436
  //#region src/lib/search-filter-storage.ts
7437
- var X = "search-filter", ue = "search-filter-session", de = "scanner-always-show";
7438
- function fe() {
7439
- return typeof window > "u" ? !1 : localStorage.getItem(de) === "true";
7437
+ var ce = "search-filter", le = "search-filter-session", ue = "scanner-always-show";
7438
+ function de() {
7439
+ return typeof window > "u" ? !1 : localStorage.getItem(ue) === "true";
7440
7440
  }
7441
- function pe(e) {
7442
- typeof window > "u" || localStorage.setItem(de, String(e));
7441
+ function fe(e) {
7442
+ typeof window > "u" || localStorage.setItem(ue, String(e));
7443
7443
  }
7444
- function Z(e) {
7444
+ function pe(e) {
7445
7445
  if (!e) return {};
7446
7446
  try {
7447
7447
  return JSON.parse(e);
@@ -7450,7 +7450,7 @@ function Z(e) {
7450
7450
  }
7451
7451
  }
7452
7452
  function me() {
7453
- return typeof window > "u" ? {} : Z(localStorage.getItem(X));
7453
+ return typeof window > "u" ? {} : pe(localStorage.getItem(ce));
7454
7454
  }
7455
7455
  function he() {
7456
7456
  let e = me();
@@ -7459,15 +7459,15 @@ function he() {
7459
7459
  function ge(e, t) {
7460
7460
  if (typeof window > "u") return;
7461
7461
  let n = JSON.stringify(e);
7462
- t ? (localStorage.setItem(X, n), sessionStorage.removeItem(ue)) : (sessionStorage.setItem(ue, n), ve());
7462
+ t ? (localStorage.setItem(ce, n), sessionStorage.removeItem(le)) : (sessionStorage.setItem(le, n), ve());
7463
7463
  }
7464
7464
  function _e() {
7465
7465
  if (typeof window > "u") return {};
7466
- let e = Z(sessionStorage.getItem(ue));
7466
+ let e = pe(sessionStorage.getItem(le));
7467
7467
  return Object.keys(e).length > 0 ? e : me();
7468
7468
  }
7469
7469
  function ve() {
7470
- typeof window > "u" || localStorage.removeItem(X);
7470
+ typeof window > "u" || localStorage.removeItem(ce);
7471
7471
  }
7472
7472
  //#endregion
7473
7473
  //#region src/components/common/SimpleTooltip.vue?vue&type=script&setup=true&lang.ts
@@ -7740,7 +7740,7 @@ var ye = { class: "iccandle-simple-tooltip-trigger" }, be = {
7740
7740
  }
7741
7741
  },
7742
7742
  setup(t) {
7743
- let n = t, { t: c } = Y(), l = w(!0), d = w(null), f = w({
7743
+ let n = t, { t: c } = Z(), l = w(!0), d = w(null), f = w({
7744
7744
  x: 0,
7745
7745
  y: 0
7746
7746
  }), p = r(() => !n.iframeLoaded || n.isLoading), m = r(() => p.value ? "#9ca3af" : "#ffb84d"), h = r(() => p.value ? "text-theme-color" : "iccandle-scanner-popup__label"), y = r(() => ({ transform: `translate(${f.value.x}px, ${f.value.y}px)` })), b = null;
@@ -7778,7 +7778,7 @@ var ye = { class: "iccandle-simple-tooltip-trigger" }, be = {
7778
7778
  });
7779
7779
  async function D() {
7780
7780
  if (n.selectedCandles?.length) {
7781
- G({
7781
+ Y({
7782
7782
  title: c("Common.error"),
7783
7783
  description: c("Selector.clearReplayFirst"),
7784
7784
  variant: "error"
@@ -7826,19 +7826,19 @@ var ye = { class: "iccandle-simple-tooltip-trigger" }, be = {
7826
7826
  let e = i - o.period * 365.25 * 24 * 60 * 60;
7827
7827
  l.filter ||= {}, l.filter.period = e;
7828
7828
  }
7829
- let u = `${z}/${n.language}?symbol=${l.symbol}&ref_res=${l.reference_resolution}&tk=${l.top_k}&res=${l.resolution}&cid=${l.candle_id}&from=${l.start_timestamp * 1e3}&to=${l.end_timestamp * 1e3}` + (l.filter?.symbols?.length ? `&fs=${l.filter.symbols}` : "") + (l.filter?.period == null ? "" : `&period=${l.filter.period}`) + (o.model ? `&model=${o.model}` : "") + (o.temperature == null ? "" : `&temp=${o.temperature}`) + (n.theme === "dark" ? "&theme=dark" : "&theme=light");
7829
+ let u = `${B}/${n.language}?symbol=${l.symbol}&ref_res=${l.reference_resolution}&tk=${l.top_k}&res=${l.resolution}&cid=${l.candle_id}&from=${l.start_timestamp * 1e3}&to=${l.end_timestamp * 1e3}` + (l.filter?.symbols?.length ? `&fs=${l.filter.symbols}` : "") + (l.filter?.period == null ? "" : `&period=${l.filter.period}`) + (o.model ? `&model=${o.model}` : "") + (o.temperature == null ? "" : `&temp=${o.temperature}`) + (n.theme === "dark" ? "&theme=dark" : "&theme=light");
7830
7830
  n.clearScannerNewsMarks(), n.submitCallback(u);
7831
7831
  }
7832
7832
  function O() {
7833
7833
  if (n.selectedCandles?.length) {
7834
- G({
7834
+ Y({
7835
7835
  title: c("Common.error"),
7836
7836
  description: c("Selector.clearReplayFirst"),
7837
7837
  variant: "error"
7838
7838
  });
7839
7839
  return;
7840
7840
  }
7841
- if (he() && !fe()) {
7841
+ if (he() && !de()) {
7842
7842
  let e = me().timeframe;
7843
7843
  e && n.onApplySavedTimeframe?.(e), D();
7844
7844
  return;
@@ -8417,7 +8417,7 @@ var et = (e, t) => {
8417
8417
  }),
8418
8418
  emits: /*@__PURE__*/ m(["temperatureChange"], ["update:modelValue"]),
8419
8419
  setup(t, { emit: n }) {
8420
- let r = j(t, "modelValue"), i = n, { t: a } = Y(), c = [
8420
+ let r = j(t, "modelValue"), i = n, { t: a } = Z(), c = [
8421
8421
  {
8422
8422
  label: "15M",
8423
8423
  value: "15"
@@ -8544,7 +8544,7 @@ var et = (e, t) => {
8544
8544
  100,
8545
8545
  150,
8546
8546
  200
8547
- ], i = j(t, "topK"), a = n, { t: c } = Y();
8547
+ ], i = j(t, "topK"), a = n, { t: c } = Z();
8548
8548
  return (n, d) => (x(), o("div", Ct, [s("div", wt, [s("label", Tt, [l(k(A(c)("Selector.result")) + " ", 1), u(xe, { text: A(c)("Selector.topResultsTooltip") }, null, 8, ["text"])]), s("div", Et, [s("select", {
8549
8549
  class: "iccandle-scanner-ai-settings__select",
8550
8550
  value: String(i.value ?? 30),
@@ -8771,17 +8771,17 @@ var et = (e, t) => {
8771
8771
  crypto: "Layout.helperBar.groupCrypto",
8772
8772
  indices: "Layout.helperBar.groupIndices",
8773
8773
  stock: "Layout.helperBar.groupStock"
8774
- }, f = n, p = c, { t: m } = Y(), y = r(() => f.selectedCount ?? Object.values(f.selectedSymbols).filter(Boolean).length), b = w(null), S = w(null), C = w(null), E = w(null), D = w(!1), O = w("body"), j = r(() => !!((typeof O.value == "string" ? null : O.value)?.closest(".iccandle-dark") || b.value?.closest(".iccandle-dark"))), M = w(null), P = w({});
8774
+ }, f = n, p = c, { t: m } = Z(), y = r(() => f.selectedCount ?? Object.values(f.selectedSymbols).filter(Boolean).length), b = w(null), S = w(null), C = w(null), E = w(null), D = w(!1), O = w("body"), j = r(() => !!((typeof O.value == "string" ? null : O.value)?.closest(".iccandle-dark") || b.value?.closest(".iccandle-dark"))), M = w(null), P = w({});
8775
8775
  function F(e) {
8776
8776
  b.value = e;
8777
8777
  let t = e?.closest(".iccandle-theme-scope, .iccandle-selector-widget") ?? document.body;
8778
8778
  O.value = t;
8779
8779
  }
8780
- let L = r(() => (f.allSymbols ?? f.filteredSymbols ?? []).filter((e) => f.selectedSymbols[e.ticker])), R = r(() => L.value.slice(0, vn)), ee = r(() => L.value.length - R.value.length), z = r(() => {
8780
+ let L = r(() => (f.allSymbols ?? f.filteredSymbols ?? []).filter((e) => f.selectedSymbols[e.ticker])), R = r(() => L.value.slice(0, vn)), z = r(() => L.value.length - R.value.length), B = r(() => {
8781
8781
  let e = /* @__PURE__ */ new Set();
8782
8782
  for (let t of L.value) e.add(t.type);
8783
8783
  return e;
8784
- }), B = r(() => {
8784
+ }), V = r(() => {
8785
8785
  let e = /* @__PURE__ */ new Map();
8786
8786
  for (let t of l) e.set(t, []);
8787
8787
  return f.filteredSymbols?.forEach((t) => {
@@ -8791,14 +8791,14 @@ var et = (e, t) => {
8791
8791
  type: t,
8792
8792
  symbols: e.get(t) ?? []
8793
8793
  })).filter((e) => e.symbols.length > 0);
8794
- }), V = r(() => B.value.flatMap((e) => e.symbols));
8794
+ }), ee = r(() => V.value.flatMap((e) => e.symbols));
8795
8795
  function H(e) {
8796
8796
  if (e.length === 0) return "none";
8797
8797
  let t = e.filter((e) => f.selectedSymbols[e.ticker]).length;
8798
8798
  return t === 0 ? "none" : t === e.length ? "all" : "some";
8799
8799
  }
8800
8800
  function U(e) {
8801
- return f.searchTerm.trim().length > 0 ? !0 : Object.prototype.hasOwnProperty.call(P.value, e) ? P.value[e] === !0 : z.value.has(e);
8801
+ return f.searchTerm.trim().length > 0 ? !0 : Object.prototype.hasOwnProperty.call(P.value, e) ? P.value[e] === !0 : B.value.has(e);
8802
8802
  }
8803
8803
  function W(e) {
8804
8804
  let t = U(e);
@@ -8807,31 +8807,31 @@ var et = (e, t) => {
8807
8807
  [e]: !t
8808
8808
  };
8809
8809
  }
8810
- function te(e) {
8810
+ function G(e) {
8811
8811
  p("symbolChange", e, !f.selectedSymbols[e]);
8812
8812
  }
8813
- function ne(e) {
8813
+ function K(e) {
8814
8814
  let t = e.map((e) => e.ticker), n = H(e) !== "all";
8815
8815
  p("groupChange", t, n);
8816
8816
  }
8817
- function re() {
8818
- let e = V.value.map((e) => e.ticker), t = H(V.value) !== "all";
8817
+ function q() {
8818
+ let e = ee.value.map((e) => e.ticker), t = H(ee.value) !== "all";
8819
8819
  p("groupChange", e, t);
8820
8820
  }
8821
- function ie(e, t) {
8821
+ function J(e, t) {
8822
8822
  t.preventDefault(), t.stopPropagation(), p("symbolChange", e, !1);
8823
8823
  }
8824
- function G() {
8824
+ function Y() {
8825
8825
  D.value = !1, M.value = null, p("searchChange", "");
8826
8826
  }
8827
- function ae(e) {
8827
+ function X(e) {
8828
8828
  if (e) {
8829
8829
  D.value = !0;
8830
8830
  return;
8831
8831
  }
8832
- G();
8832
+ Y();
8833
8833
  }
8834
- function oe() {
8834
+ function te() {
8835
8835
  let e = S.value;
8836
8836
  if (!e) return;
8837
8837
  let t = e.getBoundingClientRect(), n = window.innerHeight - t.bottom - 4 - 8, r = t.top - 8, i = n < 240 && r > n, a = Math.max(160, Math.min(384, i ? r : n)), o = i ? Math.max(8, t.top - 4 - a) : t.bottom + 4;
@@ -8842,24 +8842,24 @@ var et = (e, t) => {
8842
8842
  maxHeight: a
8843
8843
  };
8844
8844
  }
8845
- function se(e) {
8845
+ function ne(e) {
8846
8846
  let t = e.target;
8847
- t && (b.value?.contains(t) || C.value?.contains(t) || G());
8847
+ t && (b.value?.contains(t) || C.value?.contains(t) || Y());
8848
8848
  }
8849
- function ce(e) {
8850
- e.key === "Escape" && G();
8849
+ function re(e) {
8850
+ e.key === "Escape" && Y();
8851
8851
  }
8852
- function K() {
8853
- oe();
8852
+ function ie() {
8853
+ te();
8854
8854
  }
8855
8855
  N(D, async (e) => {
8856
- window.removeEventListener("resize", K), window.removeEventListener("scroll", K, !0), document.removeEventListener("mousedown", se), document.removeEventListener("keydown", ce), e && (oe(), window.addEventListener("resize", K), window.addEventListener("scroll", K, !0), document.addEventListener("mousedown", se), document.addEventListener("keydown", ce), await h(), requestAnimationFrame(() => {
8856
+ window.removeEventListener("resize", ie), window.removeEventListener("scroll", ie, !0), document.removeEventListener("mousedown", ne), document.removeEventListener("keydown", re), e && (te(), window.addEventListener("resize", ie), window.addEventListener("scroll", ie, !0), document.addEventListener("mousedown", ne), document.addEventListener("keydown", re), await h(), requestAnimationFrame(() => {
8857
8857
  E.value?.focus();
8858
8858
  }));
8859
8859
  }), v(() => {
8860
- window.removeEventListener("resize", K), window.removeEventListener("scroll", K, !0), document.removeEventListener("mousedown", se), document.removeEventListener("keydown", ce);
8860
+ window.removeEventListener("resize", ie), window.removeEventListener("scroll", ie, !0), document.removeEventListener("mousedown", ne), document.removeEventListener("keydown", re);
8861
8861
  });
8862
- let q = r(() => H(V.value)), J = r(() => y.value <= 1 ? m("Pattern.symbolSelected", { count: y.value }) : m("Pattern.symbolsSelected", { count: y.value })), le = r(() => M.value ? Math.max(120, M.value.maxHeight - 48) : 120);
8862
+ let ae = r(() => H(ee.value)), oe = r(() => y.value <= 1 ? m("Pattern.symbolSelected", { count: y.value }) : m("Pattern.symbolsSelected", { count: y.value })), se = r(() => M.value ? Math.max(120, M.value.maxHeight - 48) : 120);
8863
8863
  return (r, c) => (x(), o("div", {
8864
8864
  ref: (e) => F(e),
8865
8865
  class: "iccandle-scanner-symbol-search iccandle-scanner-symbol-search--combobox"
@@ -8871,7 +8871,7 @@ var et = (e, t) => {
8871
8871
  "aria-expanded": D.value,
8872
8872
  "aria-haspopup": "listbox",
8873
8873
  class: "iccandle-scanner-symbol-search__trigger",
8874
- onClick: c[0] ||= (e) => ae(!D.value)
8874
+ onClick: c[0] ||= (e) => X(!D.value)
8875
8875
  }, [s("div", Jt, [L.value.length === 0 ? (x(), o("span", Yt, k(A(m)("Selector.searchSymbol")), 1)) : (x(), o(e, { key: 1 }, [(x(!0), o(e, null, T(R.value, (e) => (x(), o("span", {
8876
8876
  key: e.ticker,
8877
8877
  class: "iccandle-scanner-symbol-search__chip"
@@ -8883,12 +8883,12 @@ var et = (e, t) => {
8883
8883
  tabindex: "0",
8884
8884
  "aria-label": `Remove ${e.display_name}`,
8885
8885
  class: "iccandle-scanner-symbol-search__chip-remove",
8886
- onClick: (t) => ie(e.ticker, t),
8886
+ onClick: (t) => J(e.ticker, t),
8887
8887
  onKeydown: (t) => {
8888
8888
  (t.key === "Enter" || t.key === " ") && (t.preventDefault(), t.stopPropagation(), p("symbolChange", e.ticker, !1));
8889
8889
  }
8890
8890
  }, [u(rt, { size: 10 })], 40, Qt)
8891
- ]))), 128)), ee.value > 0 ? (x(), o("span", $t, " +" + k(ee.value), 1)) : a("", !0)], 64))]), s("div", en, [s("span", null, k(J.value), 1), u(Ht, {
8891
+ ]))), 128)), z.value > 0 ? (x(), o("span", $t, " +" + k(z.value), 1)) : a("", !0)], 64))]), s("div", en, [s("span", null, k(oe.value), 1), u(Ht, {
8892
8892
  size: 16,
8893
8893
  "class-name": "iccandle-scanner-symbol-search__trigger-meta-icon"
8894
8894
  })])], 8, qt), D.value && M.value ? (x(), i(t, {
@@ -8920,27 +8920,27 @@ var et = (e, t) => {
8920
8920
  onInput: c[1] ||= (e) => p("searchChange", e.target.value.toUpperCase())
8921
8921
  }, null, 40, nn)]), s("div", {
8922
8922
  class: "iccandle-scanner-symbol-search__command-list",
8923
- style: _({ maxHeight: `${le.value}px` })
8923
+ style: _({ maxHeight: `${se.value}px` })
8924
8924
  }, [
8925
- n.searchTerm.trim() && V.value.length === 0 ? (x(), o("div", rn, k(A(m)("Selector.noResultsFound")), 1)) : a("", !0),
8926
- V.value.length > 0 ? (x(), o("div", an, [s("button", {
8925
+ n.searchTerm.trim() && ee.value.length === 0 ? (x(), o("div", rn, k(A(m)("Selector.noResultsFound")), 1)) : a("", !0),
8926
+ ee.value.length > 0 ? (x(), o("div", an, [s("button", {
8927
8927
  type: "button",
8928
8928
  class: "iccandle-scanner-symbol-search__group-check-btn",
8929
8929
  "aria-label": A(m)("Selector.selectAll"),
8930
- onClick: re
8931
- }, [q.value === "all" ? (x(), o("div", sn, [u(Bt, { size: 12 })])) : q.value === "some" ? (x(), o("div", cn, [u(Wt, { size: 12 })])) : (x(), o("div", ln))], 8, on), s("button", {
8930
+ onClick: q
8931
+ }, [ae.value === "all" ? (x(), o("div", sn, [u(Bt, { size: 12 })])) : ae.value === "some" ? (x(), o("div", cn, [u(Wt, { size: 12 })])) : (x(), o("div", ln))], 8, on), s("button", {
8932
8932
  type: "button",
8933
8933
  class: "iccandle-scanner-symbol-search__group-label-btn",
8934
- onClick: re
8934
+ onClick: q
8935
8935
  }, k(A(m)("Selector.selectAll")), 1)])) : a("", !0),
8936
- (x(!0), o(e, null, T(B.value, (t) => (x(), o("div", {
8936
+ (x(!0), o(e, null, T(V.value, (t) => (x(), o("div", {
8937
8937
  key: t.type,
8938
8938
  class: "iccandle-scanner-symbol-search__group"
8939
8939
  }, [s("div", un, [s("button", {
8940
8940
  type: "button",
8941
8941
  class: "iccandle-scanner-symbol-search__group-check-btn",
8942
8942
  "aria-label": `${A(m)("Selector.selectAll")} ${A(m)(d[t.type])}`,
8943
- onClick: I((e) => ne(t.symbols), ["stop", "prevent"])
8943
+ onClick: I((e) => K(t.symbols), ["stop", "prevent"])
8944
8944
  }, [H(t.symbols) === "all" ? (x(), o("div", fn, [u(Bt, { size: 12 })])) : H(t.symbols) === "some" ? (x(), o("div", pn, [u(Wt, { size: 12 })])) : (x(), o("div", mn))], 8, dn), s("button", {
8945
8945
  type: "button",
8946
8946
  class: "iccandle-scanner-symbol-search__group-expand-btn",
@@ -8955,7 +8955,7 @@ var et = (e, t) => {
8955
8955
  role: "option",
8956
8956
  "aria-selected": !!n.selectedSymbols[e.ticker],
8957
8957
  class: "iccandle-scanner-symbol-search__item",
8958
- onClick: (t) => te(e.ticker)
8958
+ onClick: (t) => G(e.ticker)
8959
8959
  }, [
8960
8960
  s("div", { class: g(A(Qe)("iccandle-scanner-symbol-search__check", n.selectedSymbols[e.ticker] && "iccandle-scanner-symbol-search__check--on")) }, [n.selectedSymbols[e.ticker] ? (x(), i(Bt, {
8961
8961
  key: 0,
@@ -8985,7 +8985,7 @@ var et = (e, t) => {
8985
8985
  },
8986
8986
  emits: ["cancel", "scanConfigSaved"],
8987
8987
  setup(e, { emit: t }) {
8988
- let n = e, c = t, { t: d } = Y();
8988
+ let n = e, c = t, { t: d } = Z();
8989
8989
  function f() {
8990
8990
  let e = me();
8991
8991
  return Object.keys(e).length > 0 ? e : null;
@@ -8996,7 +8996,7 @@ var et = (e, t) => {
8996
8996
  function h(e, t) {
8997
8997
  return e?.symbols?.length ? e.symbols : t ? [t] : [];
8998
8998
  }
8999
- let _ = w(fe()), b = f(), S = w(""), T = w(""), E = null, D = w(!1), O = w(b?.model ?? "light"), j = w(b?.temperature ?? 1), M = w(m(b, n.currentSymbol)), P = w(null), F = null, I = C({
8999
+ let _ = w(de()), b = f(), S = w(""), T = w(""), E = null, D = w(!1), O = w(b?.model ?? "light"), j = w(b?.temperature ?? 1), M = w(m(b, n.currentSymbol)), P = w(null), F = null, I = C({
9000
9000
  probability: 0,
9001
9001
  top_k: Math.min(Bn, b?.top_k || 30),
9002
9002
  timeframe: n.timeframe === "1" || n.timeframe === "5" ? "60" : n.timeframe || "60",
@@ -9012,7 +9012,7 @@ var et = (e, t) => {
9012
9012
  let e = T.value.toLowerCase();
9013
9013
  return Q.filter((t) => t.display_name.toLowerCase().includes(e));
9014
9014
  }), R = r(() => Object.values(M.value).filter(Boolean).length);
9015
- function ee(e) {
9015
+ function z(e) {
9016
9016
  let t = Object.entries(e).filter(([, e]) => e).map(([e]) => e);
9017
9017
  I.symbols = t;
9018
9018
  }
@@ -9021,19 +9021,19 @@ var et = (e, t) => {
9021
9021
  }), N(() => I.symbols.length, (e) => {
9022
9022
  e > 0 && (P.value = null);
9023
9023
  });
9024
- function z(e, t) {
9024
+ function B(e, t) {
9025
9025
  let n = {
9026
9026
  ...M.value,
9027
9027
  [e]: t
9028
9028
  };
9029
- M.value = n, ee(n);
9029
+ M.value = n, z(n);
9030
9030
  }
9031
- function B(e, t) {
9031
+ function V(e, t) {
9032
9032
  let n = { ...M.value };
9033
9033
  for (let r of e) n[r] = t;
9034
- M.value = n, ee(n);
9034
+ M.value = n, z(n);
9035
9035
  }
9036
- function V() {
9036
+ function ee() {
9037
9037
  let e = I.symbols ?? [];
9038
9038
  if (e.length === 0) {
9039
9039
  P.value = d("Pattern.signalDialog.selectOneSymbol"), F && clearTimeout(F), F = setTimeout(() => {
@@ -9052,28 +9052,28 @@ var et = (e, t) => {
9052
9052
  isAllSelected: r,
9053
9053
  model: O.value,
9054
9054
  temperature: j.value
9055
- }, !0), pe(_.value), n.setResolution(I.timeframe), c("cancel"), n.intent === "settings" ? G({
9055
+ }, !0), fe(_.value), n.setResolution(I.timeframe), c("cancel"), n.intent === "settings" ? Y({
9056
9056
  title: d("Common.success"),
9057
9057
  description: d("Selector.searchFilterSaved"),
9058
9058
  variant: "success"
9059
9059
  }) : c("scanConfigSaved");
9060
9060
  }
9061
9061
  function H(e) {
9062
- e.preventDefault(), V();
9062
+ e.preventDefault(), ee();
9063
9063
  }
9064
9064
  function U(e) {
9065
- _.value = e, pe(e);
9065
+ _.value = e, fe(e);
9066
9066
  }
9067
9067
  function W() {
9068
9068
  c("cancel");
9069
9069
  }
9070
- function te(e) {
9070
+ function G(e) {
9071
9071
  e.key === "Escape" && W();
9072
9072
  }
9073
- y(() => window.addEventListener("keydown", te)), v(() => {
9074
- window.removeEventListener("keydown", te), E && clearTimeout(E), F && clearTimeout(F);
9073
+ y(() => window.addEventListener("keydown", G)), v(() => {
9074
+ window.removeEventListener("keydown", G), E && clearTimeout(E), F && clearTimeout(F);
9075
9075
  });
9076
- let ne = r(() => n.intent === "scan" ? d("Selector.scan") : d("Selector.saveOptions"));
9076
+ let K = r(() => n.intent === "scan" ? d("Selector.scan") : d("Selector.saveOptions"));
9077
9077
  return (t, n) => (x(), o("div", bn, [
9078
9078
  s("div", xn, [s("div", Sn, [s("div", Cn, k(A(d)("Selector.scannerOptions")), 1), s("div", wn, k(A(d)("Selector.scannerOptionsDescription")), 1)]), s("button", {
9079
9079
  type: "button",
@@ -9093,8 +9093,8 @@ var et = (e, t) => {
9093
9093
  "selected-count": R.value,
9094
9094
  "all-symbols": A(Q),
9095
9095
  onSearchChange: n[0] ||= (e) => S.value = e,
9096
- onSymbolChange: z,
9097
- onGroupChange: B
9096
+ onSymbolChange: B,
9097
+ onGroupChange: V
9098
9098
  }, null, 8, [
9099
9099
  "search-term",
9100
9100
  "selected-symbols",
@@ -9138,7 +9138,7 @@ var et = (e, t) => {
9138
9138
  key: 0,
9139
9139
  size: 14,
9140
9140
  color: "#ffb84d"
9141
- })) : a("", !0), l(" " + k(ne.value), 1)], 2)])])])
9141
+ })) : a("", !0), l(" " + k(K.value), 1)], 2)])])])
9142
9142
  ]));
9143
9143
  }
9144
9144
  }), Hn = /* @__PURE__ */ d({
@@ -9254,7 +9254,7 @@ var et = (e, t) => {
9254
9254
  },
9255
9255
  emits: ["patternNameChange"],
9256
9256
  setup(e, { emit: t }) {
9257
- let n = t, { t: r } = Y();
9257
+ let n = t, { t: r } = Z();
9258
9258
  function i(e) {
9259
9259
  let t = e.target.value.slice(0, 20);
9260
9260
  n("patternNameChange", t);
@@ -9375,7 +9375,7 @@ var et = (e, t) => {
9375
9375
  "groupChange"
9376
9376
  ],
9377
9377
  setup(n, { emit: c }) {
9378
- let l = n, d = c, { t: f } = Y(), p = w(null), m = w(null), y = w(null), b = w(null), S = w(!1), C = w("body"), E = r(() => !!((typeof C.value == "string" ? null : C.value)?.closest(".iccandle-dark") || p.value?.closest(".iccandle-dark"))), D = w(null);
9378
+ let l = n, d = c, { t: f } = Z(), p = w(null), m = w(null), y = w(null), b = w(null), S = w(!1), C = w("body"), E = r(() => !!((typeof C.value == "string" ? null : C.value)?.closest(".iccandle-dark") || p.value?.closest(".iccandle-dark"))), D = w(null);
9379
9379
  function O(e) {
9380
9380
  p.value = e;
9381
9381
  let t = e?.closest(".iccandle-theme-scope, .iccandle-selector-widget") ?? document.body;
@@ -9396,22 +9396,22 @@ var et = (e, t) => {
9396
9396
  function R(e) {
9397
9397
  d("timeframeChange", e, !l.selectedTimeframes[e]);
9398
9398
  }
9399
- function ee() {
9399
+ function z() {
9400
9400
  let e = M.value.map((e) => e.value), t = F(M.value) !== "all";
9401
9401
  d("groupChange", e, t);
9402
9402
  }
9403
- function z(e, t) {
9403
+ function B(e, t) {
9404
9404
  t.preventDefault(), t.stopPropagation(), d("timeframeChange", e, !1);
9405
9405
  }
9406
- function B() {
9406
+ function V() {
9407
9407
  S.value = !1, D.value = null, d("searchChange", "");
9408
9408
  }
9409
- function V(e) {
9409
+ function ee(e) {
9410
9410
  if (e) {
9411
9411
  S.value = !0;
9412
9412
  return;
9413
9413
  }
9414
- B();
9414
+ V();
9415
9415
  }
9416
9416
  function H() {
9417
9417
  let e = m.value;
@@ -9426,10 +9426,10 @@ var et = (e, t) => {
9426
9426
  }
9427
9427
  function U(e) {
9428
9428
  let t = e.target;
9429
- t && (p.value?.contains(t) || y.value?.contains(t) || B());
9429
+ t && (p.value?.contains(t) || y.value?.contains(t) || V());
9430
9430
  }
9431
9431
  function W(e) {
9432
- e.key === "Escape" && B();
9432
+ e.key === "Escape" && V();
9433
9433
  }
9434
9434
  N(S, async (e) => {
9435
9435
  window.removeEventListener("resize", H), window.removeEventListener("scroll", H, !0), document.removeEventListener("mousedown", U), document.removeEventListener("keydown", W), e && (H(), window.addEventListener("resize", H), window.addEventListener("scroll", H, !0), document.addEventListener("mousedown", U), document.addEventListener("keydown", W), await h(), requestAnimationFrame(() => {
@@ -9438,7 +9438,7 @@ var et = (e, t) => {
9438
9438
  }), v(() => {
9439
9439
  window.removeEventListener("resize", H), window.removeEventListener("scroll", H, !0), document.removeEventListener("mousedown", U), document.removeEventListener("keydown", W);
9440
9440
  });
9441
- let te = r(() => F(M.value)), ne = r(() => l.selectedCount <= 1 ? f("Pattern.timeframeSelected", { count: l.selectedCount }) : f("Pattern.timeframesSelected", { count: l.selectedCount })), re = r(() => D.value ? Math.max(120, D.value.maxHeight - 48) : 120);
9441
+ let G = r(() => F(M.value)), K = r(() => l.selectedCount <= 1 ? f("Pattern.timeframeSelected", { count: l.selectedCount }) : f("Pattern.timeframesSelected", { count: l.selectedCount })), q = r(() => D.value ? Math.max(120, D.value.maxHeight - 48) : 120);
9442
9442
  return (r, c) => (x(), o("div", {
9443
9443
  ref: (e) => O(e),
9444
9444
  class: "iccandle-scanner-timeframe-search iccandle-scanner-timeframe-search--combobox"
@@ -9450,7 +9450,7 @@ var et = (e, t) => {
9450
9450
  "aria-expanded": S.value,
9451
9451
  "aria-haspopup": "listbox",
9452
9452
  class: "iccandle-scanner-timeframe-search__trigger",
9453
- onClick: c[0] ||= (e) => V(!S.value)
9453
+ onClick: c[0] ||= (e) => ee(!S.value)
9454
9454
  }, [s("div", mr, [P.value.length === 0 ? (x(), o("span", hr, k(A(f)("Selector.searchTimeframe")), 1)) : (x(!0), o(e, { key: 1 }, T(P.value, (e) => (x(), o("span", {
9455
9455
  key: e.value,
9456
9456
  class: "iccandle-scanner-timeframe-search__chip"
@@ -9459,11 +9459,11 @@ var et = (e, t) => {
9459
9459
  tabindex: "0",
9460
9460
  "aria-label": `Remove ${e.label}`,
9461
9461
  class: "iccandle-scanner-timeframe-search__chip-remove",
9462
- onClick: (t) => z(e.value, t),
9462
+ onClick: (t) => B(e.value, t),
9463
9463
  onKeydown: (t) => {
9464
9464
  (t.key === "Enter" || t.key === " ") && (t.preventDefault(), t.stopPropagation(), d("timeframeChange", e.value, !1));
9465
9465
  }
9466
- }, [u(rt, { size: 10 })], 40, _r)]))), 128))]), s("div", vr, [s("span", null, k(ne.value), 1), u(Ht, {
9466
+ }, [u(rt, { size: 10 })], 40, _r)]))), 128))]), s("div", vr, [s("span", null, k(K.value), 1), u(Ht, {
9467
9467
  size: 16,
9468
9468
  style: { opacity: .6 }
9469
9469
  })])], 8, pr), (x(), i(t, { to: C.value }, [S.value && D.value ? (x(), o("div", {
@@ -9493,18 +9493,18 @@ var et = (e, t) => {
9493
9493
  onInput: c[1] ||= (e) => d("searchChange", e.target.value.toUpperCase())
9494
9494
  }, null, 40, br)]), s("div", {
9495
9495
  class: "iccandle-scanner-timeframe-search__command-list",
9496
- style: _({ maxHeight: `${re.value}px` })
9496
+ style: _({ maxHeight: `${q.value}px` })
9497
9497
  }, [
9498
9498
  n.searchTerm.trim() && M.value.length === 0 ? (x(), o("div", xr, k(A(f)("Selector.noResultsFound")), 1)) : a("", !0),
9499
9499
  M.value.length > 0 ? (x(), o("div", Sr, [s("button", {
9500
9500
  type: "button",
9501
9501
  class: "iccandle-scanner-timeframe-search__group-check-btn",
9502
9502
  "aria-label": A(f)("Selector.selectAllTimeframes"),
9503
- onClick: ee
9504
- }, [te.value === "all" ? (x(), o("div", wr, [u(Bt, { size: 12 })])) : te.value === "some" ? (x(), o("div", Tr, [u(Wt, { size: 12 })])) : (x(), o("div", Er))], 8, Cr), s("button", {
9503
+ onClick: z
9504
+ }, [G.value === "all" ? (x(), o("div", wr, [u(Bt, { size: 12 })])) : G.value === "some" ? (x(), o("div", Tr, [u(Wt, { size: 12 })])) : (x(), o("div", Er))], 8, Cr), s("button", {
9505
9505
  type: "button",
9506
9506
  class: "iccandle-scanner-timeframe-search__group-label-btn",
9507
- onClick: ee
9507
+ onClick: z
9508
9508
  }, k(A(f)("Selector.selectAllTimeframes")), 1)])) : a("", !0),
9509
9509
  (x(!0), o(e, null, T(M.value, (e) => (x(), o("button", {
9510
9510
  key: e.value,
@@ -9527,7 +9527,7 @@ var et = (e, t) => {
9527
9527
  __name: "TimeframesTab",
9528
9528
  props: { form: {} },
9529
9529
  setup(e) {
9530
- let t = e, { t: n } = Y(), i = w(""), a = w(""), c = 0;
9530
+ let t = e, { t: n } = Z(), i = w(""), a = w(""), c = 0;
9531
9531
  N(i, (e) => {
9532
9532
  cancelAnimationFrame(c), c = requestAnimationFrame(() => {
9533
9533
  a.value = e;
@@ -9575,7 +9575,7 @@ var et = (e, t) => {
9575
9575
  __name: "SymbolsTab",
9576
9576
  props: { form: {} },
9577
9577
  setup(e) {
9578
- let t = e, { t: n } = Y(), i = w(""), a = w(""), c = 0;
9578
+ let t = e, { t: n } = Z(), i = w(""), a = w(""), c = 0;
9579
9579
  N(i, (e) => {
9580
9580
  cancelAnimationFrame(c), c = requestAnimationFrame(() => {
9581
9581
  a.value = e;
@@ -9740,17 +9740,17 @@ var et = (e, t) => {
9740
9740
  }, d = n, f = (e, t) => {
9741
9741
  let n = t.trim().toLowerCase();
9742
9742
  return n ? e.filter((e) => e.toLowerCase().includes(n)) : e;
9743
- }, { t: p } = Y(), m = w(null), y = w(null), b = w(null), S = w(null), C = w(null), E = w("body"), D = r(() => !!((typeof E.value == "string" ? null : E.value)?.closest(".iccandle-dark") || m.value?.closest(".iccandle-dark"))), O = w(!1), j = w(!1), P = w(""), I = w(""), L = w(null), R = w(null);
9744
- function ee(e) {
9743
+ }, { t: p } = Z(), m = w(null), y = w(null), b = w(null), S = w(null), C = w(null), E = w("body"), D = r(() => !!((typeof E.value == "string" ? null : E.value)?.closest(".iccandle-dark") || m.value?.closest(".iccandle-dark"))), O = w(!1), j = w(!1), P = w(""), I = w(""), L = w(null), R = w(null);
9744
+ function z(e) {
9745
9745
  m.value = e;
9746
9746
  let t = e?.closest(".iccandle-theme-scope, .iccandle-selector-widget") ?? document.body;
9747
9747
  E.value = t;
9748
9748
  }
9749
- let z = Intl.DateTimeFormat().resolvedOptions().timeZone, B = r(() => Gr(d.timeconfig, z)), V = (e) => p(c[e]), H = r(() => d.timeconfig?.timezone?.trim() || z || "UTC"), U = r(() => B.value === "all_time" ? p("TimeConfig.yourTimezone") : H.value), W = r(() => Kr(z)), te = r(() => {
9749
+ let B = Intl.DateTimeFormat().resolvedOptions().timeZone, V = r(() => Gr(d.timeconfig, B)), ee = (e) => p(c[e]), H = r(() => d.timeconfig?.timezone?.trim() || B || "UTC"), U = r(() => V.value === "all_time" ? p("TimeConfig.yourTimezone") : H.value), W = r(() => Kr(B)), G = r(() => {
9750
9750
  let e = P.value.trim().toLowerCase();
9751
- return e ? Br.filter((t) => V(t.value).toLowerCase().includes(e) || t.value.toLowerCase().includes(e)) : Br;
9752
- }), ne = r(() => f(W.value, I.value)), re = r(() => `iccandle-time-config-section ${d.containerClassName}`.trim());
9753
- function ie(e, t) {
9751
+ return e ? Br.filter((t) => ee(t.value).toLowerCase().includes(e) || t.value.toLowerCase().includes(e)) : Br;
9752
+ }), K = r(() => f(W.value, I.value)), q = r(() => `iccandle-time-config-section ${d.containerClassName}`.trim());
9753
+ function J(e, t) {
9754
9754
  if (!e) return;
9755
9755
  let n = e.getBoundingClientRect(), r = window.innerHeight - n.bottom - 4 - 8, i = n.top - 8, a = r < 180 && i > r, o = Math.max(160, Math.min(320, a ? i : r));
9756
9756
  t({
@@ -9760,23 +9760,23 @@ var et = (e, t) => {
9760
9760
  maxHeight: o
9761
9761
  });
9762
9762
  }
9763
- function G() {
9763
+ function Y() {
9764
9764
  j.value = !1, P.value = "", L.value = null;
9765
9765
  }
9766
- function ae() {
9766
+ function X() {
9767
9767
  O.value = !1, I.value = "", R.value = null;
9768
9768
  }
9769
- function oe(e, t) {
9770
- let n = d.timeconfig || { timezone: z };
9769
+ function te(e, t) {
9770
+ let n = d.timeconfig || { timezone: B };
9771
9771
  d.onTimeConfigChange({
9772
9772
  ...n,
9773
9773
  [e]: t,
9774
9774
  preset_session: "customize"
9775
9775
  }, { shouldDirty: !0 });
9776
9776
  }
9777
- function se(e) {
9778
- if (G(), e === "all_time") {
9779
- d.timeconfig && d.onTimeConfigChange(void 0, { shouldDirty: !0 }), ae();
9777
+ function ne(e) {
9778
+ if (Y(), e === "all_time") {
9779
+ d.timeconfig && d.onTimeConfigChange(void 0, { shouldDirty: !0 }), X();
9780
9780
  return;
9781
9781
  }
9782
9782
  if (e === "customize") {
@@ -9786,65 +9786,65 @@ var et = (e, t) => {
9786
9786
  }, { shouldDirty: !0 }) : d.onTimeConfigChange({
9787
9787
  start_time: "08:00",
9788
9788
  end_time: "23:00",
9789
- timezone: z,
9789
+ timezone: B,
9790
9790
  preset_session: "customize"
9791
9791
  }, { shouldDirty: !0 });
9792
9792
  return;
9793
9793
  }
9794
- let t = Wr(e, d.timeconfig?.timezone || z);
9794
+ let t = Wr(e, d.timeconfig?.timezone || B);
9795
9795
  t && d.onTimeConfigChange({
9796
9796
  ...t,
9797
9797
  preset_session: e
9798
9798
  }, { shouldDirty: !0 });
9799
9799
  }
9800
- function ce(e) {
9801
- if (B.value !== "all_time" && B.value !== "customize") {
9802
- let t = Wr(B.value, e);
9800
+ function re(e) {
9801
+ if (V.value !== "all_time" && V.value !== "customize") {
9802
+ let t = Wr(V.value, e);
9803
9803
  t && d.onTimeConfigChange({
9804
9804
  ...t,
9805
- preset_session: B.value
9805
+ preset_session: V.value
9806
9806
  }, { shouldDirty: !0 });
9807
9807
  } else d.onTimeConfigChange({
9808
9808
  ...d.timeconfig || {},
9809
9809
  timezone: e
9810
9810
  }, { shouldDirty: !0 });
9811
- ae();
9811
+ X();
9812
9812
  }
9813
- function K(e) {
9814
- if (B.value !== "customize") return;
9813
+ function ie(e) {
9814
+ if (V.value !== "customize") return;
9815
9815
  let t = e.currentTarget;
9816
9816
  try {
9817
9817
  t.showPicker?.();
9818
9818
  } catch {}
9819
9819
  }
9820
- function q() {
9821
- j.value && ie(y.value, (e) => {
9820
+ function ae() {
9821
+ j.value && J(y.value, (e) => {
9822
9822
  L.value = e;
9823
- }), O.value && ie(b.value, (e) => {
9823
+ }), O.value && J(b.value, (e) => {
9824
9824
  R.value = e;
9825
9825
  });
9826
9826
  }
9827
- function J(e) {
9827
+ function oe(e) {
9828
9828
  let t = e.target;
9829
- t && (m.value?.contains(t) || S.value?.contains(t) || C.value?.contains(t) || (j.value && G(), O.value && ae()));
9829
+ t && (m.value?.contains(t) || S.value?.contains(t) || C.value?.contains(t) || (j.value && Y(), O.value && X()));
9830
9830
  }
9831
- function le(e) {
9832
- e.key === "Escape" && (j.value && G(), O.value && ae());
9831
+ function se(e) {
9832
+ e.key === "Escape" && (j.value && Y(), O.value && X());
9833
9833
  }
9834
- N(() => [d.timeconfig, B.value], () => {
9835
- !d.timeconfig || B.value === "all_time" || d.timeconfig.timezone || d.onTimeConfigChange({
9834
+ N(() => [d.timeconfig, V.value], () => {
9835
+ !d.timeconfig || V.value === "all_time" || d.timeconfig.timezone || d.onTimeConfigChange({
9836
9836
  ...d.timeconfig,
9837
- timezone: z
9837
+ timezone: B
9838
9838
  }, { shouldDirty: !1 });
9839
9839
  }, { immediate: !0 }), N([j, O], async ([e, t]) => {
9840
- window.removeEventListener("resize", q), window.removeEventListener("scroll", q, !0), document.removeEventListener("mousedown", J), document.removeEventListener("keydown", le), !(!e && !t) && (await h(), q(), window.addEventListener("resize", q), window.addEventListener("scroll", q, !0), document.addEventListener("mousedown", J), document.addEventListener("keydown", le));
9840
+ window.removeEventListener("resize", ae), window.removeEventListener("scroll", ae, !0), document.removeEventListener("mousedown", oe), document.removeEventListener("keydown", se), !(!e && !t) && (await h(), ae(), window.addEventListener("resize", ae), window.addEventListener("scroll", ae, !0), document.addEventListener("mousedown", oe), document.addEventListener("keydown", se));
9841
9841
  }), v(() => {
9842
- window.removeEventListener("resize", q), window.removeEventListener("scroll", q, !0), document.removeEventListener("mousedown", J), document.removeEventListener("keydown", le);
9842
+ window.removeEventListener("resize", ae), window.removeEventListener("scroll", ae, !0), document.removeEventListener("mousedown", oe), document.removeEventListener("keydown", se);
9843
9843
  });
9844
- let X = r(() => L.value ? Math.max(120, L.value.maxHeight - 52) : 120), ue = r(() => R.value ? Math.max(120, R.value.maxHeight - 96) : 120);
9844
+ let ce = r(() => L.value ? Math.max(120, L.value.maxHeight - 52) : 120), le = r(() => R.value ? Math.max(120, R.value.maxHeight - 96) : 120);
9845
9845
  return (r, c) => (x(), o("div", {
9846
- ref: (e) => ee(e),
9847
- class: g(re.value)
9846
+ ref: (e) => z(e),
9847
+ class: g(q.value)
9848
9848
  }, [
9849
9849
  s("div", qr, [s("h3", Jr, k(A(p)("TimeConfig.title")), 1)]),
9850
9850
  s("div", Yr, [s("div", Xr, [s("div", Zr, [s("label", Qr, k(A(p)("TimeConfig.session")), 1), s("div", { class: g(["iccandle-time-config-section__select-wrap", j.value && "iccandle-time-config-section__select-wrap--open"]) }, [s("button", {
@@ -9856,40 +9856,40 @@ var et = (e, t) => {
9856
9856
  "aria-expanded": j.value,
9857
9857
  onClick: c[0] ||= () => {
9858
9858
  if (j.value) {
9859
- G();
9859
+ Y();
9860
9860
  return;
9861
9861
  }
9862
- ae(), j.value = !0;
9862
+ X(), j.value = !0;
9863
9863
  }
9864
- }, [s("span", ei, k(V(B.value) || A(p)("TimeConfig.selectSession")), 1)], 8, $r)], 2)]), s("div", ti, [s("label", ni, k(A(p)("TimeConfig.timezone")), 1), s("div", { class: g(["iccandle-time-config-section__select-wrap", O.value && "iccandle-time-config-section__select-wrap--open"]) }, [s("button", {
9864
+ }, [s("span", ei, k(ee(V.value) || A(p)("TimeConfig.selectSession")), 1)], 8, $r)], 2)]), s("div", ti, [s("label", ni, k(A(p)("TimeConfig.timezone")), 1), s("div", { class: g(["iccandle-time-config-section__select-wrap", O.value && "iccandle-time-config-section__select-wrap--open"]) }, [s("button", {
9865
9865
  ref_key: "timezoneTriggerRef",
9866
9866
  ref: b,
9867
9867
  type: "button",
9868
9868
  class: "iccandle-time-config-section__select-btn",
9869
9869
  "aria-haspopup": "listbox",
9870
9870
  "aria-expanded": O.value,
9871
- disabled: B.value === "all_time",
9871
+ disabled: V.value === "all_time",
9872
9872
  onClick: c[1] ||= () => {
9873
9873
  if (O.value) {
9874
- ae();
9874
+ X();
9875
9875
  return;
9876
9876
  }
9877
- G(), O.value = !0;
9877
+ Y(), O.value = !0;
9878
9878
  }
9879
9879
  }, [s("span", ii, k(U.value), 1)], 8, ri)], 2)])]), s("div", ai, [s("div", oi, [s("label", si, k(A(p)("TimeConfig.startTime")), 1), s("input", {
9880
9880
  type: "time",
9881
- disabled: B.value !== "customize",
9881
+ disabled: V.value !== "customize",
9882
9882
  value: n.timeconfig?.start_time ?? "",
9883
9883
  class: "iccandle-time-config-section__input",
9884
- onInput: c[2] ||= (e) => oe("start_time", e.target.value),
9885
- onClick: K
9884
+ onInput: c[2] ||= (e) => te("start_time", e.target.value),
9885
+ onClick: ie
9886
9886
  }, null, 40, ci)]), s("div", li, [s("label", ui, k(A(p)("TimeConfig.endTime")), 1), s("input", {
9887
9887
  type: "time",
9888
- disabled: B.value !== "customize",
9888
+ disabled: V.value !== "customize",
9889
9889
  value: n.timeconfig?.end_time ?? "",
9890
9890
  class: "iccandle-time-config-section__input",
9891
- onInput: c[3] ||= (e) => oe("end_time", e.target.value),
9892
- onClick: K
9891
+ onInput: c[3] ||= (e) => te("end_time", e.target.value),
9892
+ onClick: ie
9893
9893
  }, null, 40, di)])])]),
9894
9894
  (x(), i(t, { to: E.value }, [j.value && L.value ? (x(), o("div", {
9895
9895
  key: 0,
@@ -9911,14 +9911,14 @@ var et = (e, t) => {
9911
9911
  autofocus: ""
9912
9912
  }, null, 8, pi), [[M, P.value]])]), s("ul", {
9913
9913
  class: "iccandle-time-config-section__dropdown-list",
9914
- style: _({ maxHeight: `${X.value}px` })
9915
- }, [s("li", mi, k(A(p)("TimeConfig.sessionsHeading")), 1), te.value.length === 0 ? (x(), o("li", hi, k(A(p)("TimeConfig.noSessionFound")), 1)) : (x(!0), o(e, { key: 1 }, T(te.value, (e) => (x(), o("li", { key: e.value }, [s("button", {
9914
+ style: _({ maxHeight: `${ce.value}px` })
9915
+ }, [s("li", mi, k(A(p)("TimeConfig.sessionsHeading")), 1), G.value.length === 0 ? (x(), o("li", hi, k(A(p)("TimeConfig.noSessionFound")), 1)) : (x(!0), o(e, { key: 1 }, T(G.value, (e) => (x(), o("li", { key: e.value }, [s("button", {
9916
9916
  type: "button",
9917
9917
  role: "option",
9918
- "aria-selected": B.value === e.value,
9919
- class: g(["iccandle-time-config-section__dropdown-item", B.value === e.value && "iccandle-time-config-section__dropdown-item--selected"]),
9920
- onClick: (t) => se(e.value)
9921
- }, [u(Bt, { "class-name": ["iccandle-time-config-section__check", B.value === e.value && "iccandle-time-config-section__check--visible"].filter(Boolean).join(" ") }, null, 8, ["class-name"]), l(" " + k(V(e.value)), 1)], 10, gi)]))), 128))], 4)], 6)) : a("", !0)], 8, ["to"])),
9918
+ "aria-selected": V.value === e.value,
9919
+ class: g(["iccandle-time-config-section__dropdown-item", V.value === e.value && "iccandle-time-config-section__dropdown-item--selected"]),
9920
+ onClick: (t) => ne(e.value)
9921
+ }, [u(Bt, { "class-name": ["iccandle-time-config-section__check", V.value === e.value && "iccandle-time-config-section__check--visible"].filter(Boolean).join(" ") }, null, 8, ["class-name"]), l(" " + k(ee(e.value)), 1)], 10, gi)]))), 128))], 4)], 6)) : a("", !0)], 8, ["to"])),
9922
9922
  (x(), i(t, { to: E.value }, [O.value && R.value ? (x(), o("div", {
9923
9923
  key: 0,
9924
9924
  ref_key: "timezonePopoverRef",
@@ -9942,13 +9942,13 @@ var et = (e, t) => {
9942
9942
  }, null, 8, xi), [[M, I.value]])]),
9943
9943
  s("ul", {
9944
9944
  class: "iccandle-time-config-section__dropdown-list",
9945
- style: _({ maxHeight: `${ue.value}px` })
9946
- }, [s("li", Si, k(A(p)("TimeConfig.timezonesHeading")), 1), ne.value.length === 0 ? (x(), o("li", Ci, k(A(p)("TimeConfig.noTimezoneFound")), 1)) : (x(!0), o(e, { key: 1 }, T(ne.value, (e) => (x(), o("li", { key: e }, [s("button", {
9945
+ style: _({ maxHeight: `${le.value}px` })
9946
+ }, [s("li", Si, k(A(p)("TimeConfig.timezonesHeading")), 1), K.value.length === 0 ? (x(), o("li", Ci, k(A(p)("TimeConfig.noTimezoneFound")), 1)) : (x(!0), o(e, { key: 1 }, T(K.value, (e) => (x(), o("li", { key: e }, [s("button", {
9947
9947
  type: "button",
9948
9948
  role: "option",
9949
9949
  "aria-selected": H.value === e,
9950
9950
  class: g(["iccandle-time-config-section__dropdown-item", H.value === e && "iccandle-time-config-section__dropdown-item--selected"]),
9951
- onClick: (t) => ce(e)
9951
+ onClick: (t) => re(e)
9952
9952
  }, [u(Bt, { "class-name": ["iccandle-time-config-section__check", H.value === e && "iccandle-time-config-section__check--visible"].filter(Boolean).join(" ") }, null, 8, ["class-name"]), l(" " + k(e), 1)], 10, wi)]))), 128))], 4)
9953
9953
  ], 6)) : a("", !0)], 8, ["to"]))
9954
9954
  ], 2));
@@ -9967,7 +9967,7 @@ var et = (e, t) => {
9967
9967
  errorMessage: {}
9968
9968
  },
9969
9969
  setup(e) {
9970
- let t = e, { t: n } = Y(), i = w(null), c = r(() => n("Pattern.signalDialog.selectOneTimeframe")), l = r(() => n("Pattern.signalDialog.selectOneSymbol")), d = r(() => i.value === c.value && (t.form.timeframes?.length ?? 0) > 0 || i.value === l.value && (t.form.symbols?.length ?? 0) > 0 ? null : i.value), f = r(() => d.value || t.errorMessage);
9970
+ let t = e, { t: n } = Z(), i = w(null), c = r(() => n("Pattern.signalDialog.selectOneTimeframe")), l = r(() => n("Pattern.signalDialog.selectOneSymbol")), d = r(() => i.value === c.value && (t.form.timeframes?.length ?? 0) > 0 || i.value === l.value && (t.form.symbols?.length ?? 0) > 0 ? null : i.value), f = r(() => d.value || t.errorMessage);
9971
9971
  N(() => t.form.timeframes?.length ?? 0, (e) => {
9972
9972
  e > 0 && i.value === c.value && (i.value = null);
9973
9973
  }), N(() => t.form.symbols?.length ?? 0, (e) => {
@@ -10039,12 +10039,12 @@ async function Vi(e) {
10039
10039
  //#region src/lib/find-error-message.ts
10040
10040
  var Hi = (e) => {
10041
10041
  if (typeof e == "string") return e;
10042
- if (typeof e != "object" || !e) return ee;
10042
+ if (typeof e != "object" || !e) return z;
10043
10043
  for (let t in e) if (Object.prototype.hasOwnProperty.call(e, t)) {
10044
10044
  let n = Hi(e[t]);
10045
10045
  if (n) return n;
10046
10046
  }
10047
- return ee;
10047
+ return z;
10048
10048
  }, Ui = (e) => R(e) ? Hi(e.response?.data) : e.message, Wi = ["aria-label"], Gi = /* @__PURE__ */ d({
10049
10049
  __name: "PatternTrackerSubscriptionModal",
10050
10050
  props: {
@@ -10064,7 +10064,7 @@ var Hi = (e) => {
10064
10064
  function l(e) {
10065
10065
  r.onOpenChange?.(e), c("update:open", e);
10066
10066
  }
10067
- let { t: u } = Y(), d = w(""), f = w(!1), p = w(null), m = w(!1), h = C({
10067
+ let { t: u } = Z(), d = w(""), f = w(!1), p = w(null), m = w(!1), h = C({
10068
10068
  timeframes: [],
10069
10069
  symbols: []
10070
10070
  });
@@ -10127,14 +10127,14 @@ var Hi = (e) => {
10127
10127
  };
10128
10128
  m.value = !0;
10129
10129
  try {
10130
- await Vi(a), G({
10130
+ await Vi(a), Y({
10131
10131
  title: u("Pattern.patternSubscribed"),
10132
10132
  description: u("Pattern.patternSubscribedDesc", { name: d.value }),
10133
10133
  variant: "success"
10134
10134
  }), l(!1);
10135
10135
  } catch (e) {
10136
10136
  let t = Ui(e);
10137
- p.value = t, G({
10137
+ p.value = t, Y({
10138
10138
  title: u("Pattern.patternSubscriptionError"),
10139
10139
  description: t,
10140
10140
  variant: "error"
@@ -10196,7 +10196,7 @@ var Hi = (e) => {
10196
10196
  },
10197
10197
  emits: ["close", "goToEventDetail"],
10198
10198
  setup(e, { emit: t }) {
10199
- let n = e, r = t, { t: i, language: c } = Y(), l = w(null), d = w(null);
10199
+ let n = e, r = t, { t: i, language: c } = Z(), l = w(null), d = w(null);
10200
10200
  function f(e, t) {
10201
10201
  try {
10202
10202
  return new Intl.DateTimeFormat(t, {
@@ -10402,11 +10402,11 @@ var Hi = (e) => {
10402
10402
  }
10403
10403
  });
10404
10404
  function c() {
10405
- t.toast.action?.onClick(), ie(t.toast.id);
10405
+ t.toast.action?.onClick(), J(t.toast.id);
10406
10406
  }
10407
10407
  function l() {
10408
10408
  let e = t.toast.dismiss;
10409
- e && typeof e == "object" && e.onClick?.(), ie(t.toast.id);
10409
+ e && typeof e == "object" && e.onClick?.(), J(t.toast.id);
10410
10410
  }
10411
10411
  return (t, r) => (x(), o("div", ba, [s("div", xa, [(x(), i(D(n.value), { class: "custom-toast__icon" }))]), s("div", Sa, [
10412
10412
  s("div", Ca, [s("p", wa, k(e.toast.title), 1)]),
@@ -10446,7 +10446,7 @@ var Hi = (e) => {
10446
10446
  tag: "div",
10447
10447
  class: "iccandle-toast-list"
10448
10448
  }, {
10449
- default: P(() => [(x(!0), o(e, null, T(A(re), (e) => (x(), i(Da, {
10449
+ default: P(() => [(x(!0), o(e, null, T(A(q), (e) => (x(), i(Da, {
10450
10450
  key: e.id,
10451
10451
  toast: e
10452
10452
  }, null, 8, ["toast"]))), 128))]),
@@ -10509,7 +10509,7 @@ function Pa(e, t) {
10509
10509
  setTimeout(() => {
10510
10510
  c?.clearMarks(2), e(!0);
10511
10511
  }, 150);
10512
- }), localStorage.setItem(V, JSON.stringify(a)), c?.refreshMarks();
10512
+ }), localStorage.setItem(ee, JSON.stringify(a)), c?.refreshMarks();
10513
10513
  try {
10514
10514
  if (t.current && t.current.length > 0 && (t.current.forEach((e) => {
10515
10515
  try {
@@ -11210,7 +11210,7 @@ var jo = (e, t) => {
11210
11210
  }
11211
11211
  }, Mo = (e) => {
11212
11212
  try {
11213
- localStorage.removeItem(B);
11213
+ localStorage.removeItem(V);
11214
11214
  } catch {}
11215
11215
  try {
11216
11216
  let t = e?.activeChart?.();
@@ -11219,7 +11219,7 @@ var jo = (e, t) => {
11219
11219
  } catch {}
11220
11220
  }, No = (e, t) => {
11221
11221
  try {
11222
- localStorage.setItem(B, JSON.stringify(t));
11222
+ localStorage.setItem(V, JSON.stringify(t));
11223
11223
  } catch {}
11224
11224
  try {
11225
11225
  (e?.activeChart?.())?.refreshMarks();
@@ -11509,35 +11509,15 @@ function Wo(e, t, n, r, i, a, o) {
11509
11509
  });
11510
11510
  }
11511
11511
  //#endregion
11512
- //#region src/tradingview/handle-result-iframe-load.ts
11513
- var Go = (e) => {
11514
- let t = e?.contentWindow;
11515
- if (!t || !e?.src) return;
11516
- let n = new URL(e.src).origin;
11517
- if (t.postMessage(JSON.stringify({
11518
- type: "parent-origin",
11519
- origin: window.location.origin
11520
- }), n), new URLSearchParams(window.location.search).get("payment") === "success") {
11521
- let e = () => t.postMessage(JSON.stringify({ type: "payment-success" }), n);
11522
- [
11523
- 0,
11524
- 600,
11525
- 1500
11526
- ].forEach((t) => window.setTimeout(e, t));
11527
- let r = new URL(window.location.href);
11528
- [
11529
- "payment",
11530
- "session_id",
11531
- "lookup_key"
11532
- ].forEach((e) => r.searchParams.delete(e)), window.history.replaceState({}, "", r);
11533
- }
11534
- }, Ko = ["lang"], qo = {
11512
+ //#region src/tradingview/WidgetIccandle.vue?vue&type=script&setup=true&lang.ts
11513
+ var Go = ["lang"], Ko = {
11535
11514
  key: 4,
11536
11515
  class: "iccandle-selector-widget__overlay"
11537
- }, Jo = ["aria-orientation", "aria-valuenow"], Yo = ["src"], Xo = 30, Zo = 60, Qo = 60, $o = "(max-width: 1023px)", es = /* @__PURE__ */ d({
11516
+ }, qo = /* @__PURE__ */ d({
11538
11517
  __name: "WidgetIccandle",
11539
11518
  props: {
11540
11519
  chartWidget: {},
11520
+ submitCallback: {},
11541
11521
  theme: { default: "light" },
11542
11522
  language: {},
11543
11523
  onCloseResult: {},
@@ -11548,9 +11528,6 @@ var Go = (e) => {
11548
11528
  },
11549
11529
  setup(e, { expose: t }) {
11550
11530
  function n(e) {
11551
- return Math.min(Zo, Math.max(Xo, e));
11552
- }
11553
- function c(e) {
11554
11531
  return {
11555
11532
  o: e[1],
11556
11533
  h: e[2],
@@ -11559,7 +11536,7 @@ var Go = (e) => {
11559
11536
  timestamp: e[0]
11560
11537
  };
11561
11538
  }
11562
- function l(e) {
11539
+ function s(e) {
11563
11540
  try {
11564
11541
  let t = JSON.parse(localStorage.getItem("tv:clicked-news-event") || "null");
11565
11542
  if (t && String(t.id) === String(e)) return t;
@@ -11570,32 +11547,30 @@ var Go = (e) => {
11570
11547
  return null;
11571
11548
  }
11572
11549
  }
11573
- function d(e) {
11550
+ function c(e) {
11574
11551
  return !(!e?.event_name || !e.currency || e.event_name === "Holiday" || e.status === "early");
11575
11552
  }
11576
- let f = e, p = r(() => oe(f.language));
11577
- le(p);
11578
- let m = {
11553
+ let l = e, d = r(() => te(l.language));
11554
+ se(d);
11555
+ let f = {
11579
11556
  highlightBarsRef: { current: [] },
11580
11557
  generatedCandlesBackgroundStudyIdRef: { current: null },
11581
11558
  generatedCandlesStudyIdRef: { current: null }
11582
11559
  };
11583
- t({ chartRefs: m });
11584
- let h = { current: null }, S = { current: null }, C = { current: !1 }, T = w(null), D = { current: [] }, k = w(null), A = w(null), j = w(null), M = { current: !1 }, P = { current: "horizontal" }, F = w(Qo), I = w(!1), L = w(typeof window < "u" && window.matchMedia($o).matches), R = qa(), ee = w(!1), H = w(null), U = w(!1), W = w(null), te = w(null), ne = w(!0), re = () => j.value && getComputedStyle(j.value).getPropertyValue("--iccandle-primary").trim() || void 0, ie = { current: re };
11585
- N(j, () => {
11586
- ie.current = re;
11560
+ t({ chartRefs: f });
11561
+ let p = { current: null }, m = { current: null }, h = { current: !1 }, y = w(null), S = { current: [] }, C = w(null), T = qa(), D = w(!1), k = w(null), A = w(!1), j = w(null), M = w(null), P = w(!0), F = () => C.value && getComputedStyle(C.value).getPropertyValue("--iccandle-primary").trim() || void 0, I = { current: F };
11562
+ N(C, () => {
11563
+ I.current = F;
11587
11564
  }, { immediate: !0 });
11588
- let G = r(() => f.theme === "system" ? window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light" : f.theme), ae = w(`${z}?theme=${f.theme ?? "light"}`), se = (e) => {
11589
- ae.value !== e && (ae.value = e);
11590
- }, ce = r(() => ({ zIndex: 9999999999 })), K = w(!1), q = w(!1), J = w(!1), Y = w(25), X = w([]), ue = w(null), de = w(!1), fe = w("60"), pe = w(Ma.interval || "60"), Z = w(""), me = () => {
11565
+ let L = r(() => l.theme === "system" ? window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light" : l.theme), R = r(() => ({ zIndex: 9999999999 })), z = w(!1), H = w(!1), U = w(!1), W = w(25), G = w([]), K = w(null), q = w(!1), J = w("60"), Y = w(Ma.interval || "60"), X = w(""), ne = () => {
11591
11566
  try {
11592
- let e = f.chartWidget?.activeChart?.();
11567
+ let e = l.chartWidget?.activeChart?.();
11593
11568
  if (e) {
11594
- if (h.current) {
11569
+ if (p.current) {
11595
11570
  try {
11596
- e.removeEntity(h.current);
11571
+ e.removeEntity(p.current);
11597
11572
  } catch {}
11598
- h.current = null;
11573
+ p.current = null;
11599
11574
  }
11600
11575
  e.getAllShapes().filter((e) => e.name === "date_range").forEach((t) => {
11601
11576
  try {
@@ -11604,46 +11579,34 @@ var Go = (e) => {
11604
11579
  });
11605
11580
  }
11606
11581
  } catch {}
11607
- J.value = !1, X.value = [], R.setTargetCandles([]);
11608
- }, he = (e) => {
11609
- ne.value = e !== "/news", e === "/news" && me(), H.value?.length && (R.setPlayEndTimestamp(null), R.setGapCount(0), H.value = null, no(!1), Ro(Ie.value));
11610
- }, ge = () => {
11611
- q.value = !0;
11612
- }, _e = () => {
11582
+ U.value = !1, G.value = [], T.setTargetCandles([]);
11583
+ }, re = (e) => {
11584
+ P.value = e !== "/news", e === "/news" && ne(), k.value?.length && (T.setPlayEndTimestamp(null), T.setGapCount(0), k.value = null, no(!1), Ro(ye.value));
11585
+ }, ie = () => {
11586
+ H.value = !0;
11587
+ }, ae = () => {
11588
+ H.value = !1;
11589
+ }, oe = () => {
11590
+ T.setPlayEndTimestamp(null), T.setGapCount(0);
11591
+ let e = !!k.value?.length;
11592
+ k.value = null, no(!1), e && Ro(ye.value), y.value?.();
11593
+ }, Z = () => {
11594
+ K.value = "settings";
11595
+ }, ce = () => {
11596
+ K.value = "scan";
11597
+ }, le = () => {
11598
+ K.value = null;
11599
+ }, ue = () => {
11613
11600
  q.value = !1;
11614
- }, ve = (e) => {
11615
- e.preventDefault();
11616
- let t = e.currentTarget;
11617
- t && (M.current = !0, P.current = L.value ? "vertical" : "horizontal", I.value = !0, t.setPointerCapture(e.pointerId));
11618
- }, ye = (e) => {
11619
- if (!M.current || !k.value) return;
11620
- let t = k.value.getBoundingClientRect(), r = P.current === "vertical" ? (e.clientY - t.top) / t.height * 100 : (e.clientX - t.left) / t.width * 100;
11621
- F.value = n(r);
11622
- }, be = (e) => {
11623
- M.current && (M.current = !1, I.value = !1, e.currentTarget?.releasePointerCapture(e.pointerId));
11624
- }, xe = () => {
11625
- R.setPlayEndTimestamp(null), R.setGapCount(0);
11626
- let e = !!H.value?.length;
11627
- H.value = null, no(!1), e && Ro(Ie.value), T.value?.();
11628
- }, Se = () => {
11629
- ue.value = "settings";
11630
- }, Ce = () => {
11631
- ue.value = "scan";
11632
- }, we = () => {
11633
- ue.value = null;
11634
- }, Te = () => {
11635
- de.value = !1;
11636
- }, Ee = () => {
11637
- de.value = !0;
11638
- }, De = () => {
11639
- U.value = !1, W.value = null, te.value = null;
11640
- }, Oe = () => {
11641
- K.value = !0;
11642
- }, ke = w(null), Ae = () => {
11643
- Go(ke.value);
11644
- }, je = (e) => {
11645
- let t = e.default_symbol || Z.value, n = G.value === "dark" ? "dark" : "light", r = Ie.value;
11646
- ne.value = !1, me(), H.value = null, R.setPlayEndTimestamp(null);
11601
+ }, de = () => {
11602
+ q.value = !0;
11603
+ }, fe = () => {
11604
+ A.value = !1, j.value = null, M.value = null;
11605
+ }, pe = () => {
11606
+ z.value = !0;
11607
+ }, me = (e) => {
11608
+ let t = e.default_symbol || X.value, n = L.value === "dark" ? "dark" : "light", r = ye.value;
11609
+ P.value = !1, ne(), k.value = null, T.setPlayEndTimestamp(null);
11647
11610
  let i = {
11648
11611
  id: e.id,
11649
11612
  event_name: e.event_name,
@@ -11657,44 +11620,44 @@ var Go = (e) => {
11657
11620
  status: e.status
11658
11621
  };
11659
11622
  try {
11660
- localStorage.setItem(B, JSON.stringify(i));
11623
+ localStorage.setItem(V, JSON.stringify(i));
11661
11624
  } catch {}
11662
11625
  try {
11663
11626
  r?.activeChart?.()?.refreshMarks();
11664
11627
  } catch {}
11665
11628
  (async () => {
11666
11629
  await Lo(r, e.timestamp, {
11667
- lastEntity: h,
11668
- applyingPatternRef: C,
11630
+ lastEntity: p,
11631
+ applyingPatternRef: h,
11669
11632
  setHasActiveShape: (e) => {
11670
- J.value = e;
11633
+ U.value = e;
11671
11634
  },
11672
11635
  setCandles: (e) => {
11673
- X.value = e;
11636
+ G.value = e;
11674
11637
  },
11675
11638
  setWindowSize: (e) => {
11676
- Y.value = e;
11639
+ W.value = e;
11677
11640
  },
11678
11641
  setSymbol: (e) => {
11679
- Z.value = e;
11642
+ X.value = e;
11680
11643
  },
11681
11644
  setResolution: (e) => {
11682
- pe.value = e;
11645
+ Y.value = e;
11683
11646
  },
11684
11647
  setTimeframe: (e) => {
11685
- fe.value = e;
11648
+ J.value = e;
11686
11649
  },
11687
11650
  setTargetCandles: (e) => {
11688
- R.setTargetCandles(e);
11651
+ T.setTargetCandles(e);
11689
11652
  },
11690
11653
  clearSelectedCandles: () => {
11691
- H.value = null;
11654
+ k.value = null;
11692
11655
  }
11693
- }), await Fo(r, e.timestamp, S);
11694
- })(), se(`${z}/${p.value}/news/similar-events/${e.id}?symbol=${encodeURIComponent(t)}&theme=${n}`);
11695
- }, Me = (e) => {
11656
+ }), await Fo(r, e.timestamp, m);
11657
+ })(), l.submitCallback(`${B}/${d.value}/news/similar-events/${e.id}?symbol=${encodeURIComponent(t)}&theme=${n}`);
11658
+ }, he = (e) => {
11696
11659
  if (!e) return;
11697
- let t = Ie.value;
11660
+ let t = ye.value;
11698
11661
  if (!t) return;
11699
11662
  let n;
11700
11663
  try {
@@ -11706,72 +11669,72 @@ var Go = (e) => {
11706
11669
  if (!n) return;
11707
11670
  let r = n.getTimeScale(), i = n.getVisibleRange();
11708
11671
  if (!i?.from || !i?.to) return;
11709
- let a = j.value?.firstElementChild || j.value;
11672
+ let a = C.value?.firstElementChild || C.value;
11710
11673
  if (!a) return;
11711
- let o = a.getBoundingClientRect(), s = r.width(), c = (e) => {
11712
- let t = 0, n = s, a = s / 2;
11674
+ let o = a.getBoundingClientRect(), l = r.width(), u = (e) => {
11675
+ let t = 0, n = l, a = l / 2;
11713
11676
  for (let o = 0; o < 30; o++) {
11714
- let o = (t + n) / 2, c = r.coordinateToTime(o);
11715
- if (c === null) {
11677
+ let o = (t + n) / 2, s = r.coordinateToTime(o);
11678
+ if (s === null) {
11716
11679
  let t = (e - i.from) / (i.to - i.from);
11717
- a = Math.max(0, Math.min(s, t * s));
11680
+ a = Math.max(0, Math.min(l, t * l));
11718
11681
  break;
11719
11682
  }
11720
- let l = c - e;
11721
- if (Math.abs(l) < .1) {
11683
+ let c = s - e;
11684
+ if (Math.abs(c) < .1) {
11722
11685
  a = o;
11723
11686
  break;
11724
11687
  }
11725
- l > 0 ? n = o : t = o, a = o;
11688
+ c > 0 ? n = o : t = o, a = o;
11726
11689
  }
11727
11690
  return {
11728
11691
  x: o.left + a + 53,
11729
11692
  y: o.bottom - 103
11730
11693
  };
11731
- }, u = l(e);
11732
- if (!d(u)) return;
11733
- let f = u.timestamp ? u.timestamp / 1e3 : null, p = i.to - i.from, m = c(f ?? i.from + p * .5);
11734
- m && (te.value = m), W.value = u, U.value = !0;
11735
- }, Ne = () => {
11736
- C.current || (h.current = null, J.value = !1);
11737
- }, Pe = (e) => {
11738
- e === "1" || e === "5" ? fe.value = "60" : fe.value = e, pe.value = e, Ne();
11739
- }, Fe = (e) => {
11740
- Z.value = e.library_custom_fields?.ticker || e.ticker || e.name || e.base_name + "" || "", Ne();
11741
- }, Ie = O(f.chartWidget);
11742
- N(() => f.chartWidget, (e) => {
11743
- Ie.value = e;
11744
- }), N(Ie, (e) => {
11745
- let t, n, r;
11694
+ }, d = s(e);
11695
+ if (!c(d)) return;
11696
+ let f = d.timestamp ? d.timestamp / 1e3 : null, p = i.to - i.from, m = u(f ?? i.from + p * .5);
11697
+ m && (M.value = m), j.value = d, A.value = !0;
11698
+ }, ge = () => {
11699
+ h.current || (p.current = null, U.value = !1);
11700
+ }, _e = (e) => {
11701
+ e === "1" || e === "5" ? J.value = "60" : J.value = e, Y.value = e, ge();
11702
+ }, ve = (e) => {
11703
+ X.value = e.library_custom_fields?.ticker || e.ticker || e.name || e.base_name + "" || "", ge();
11704
+ }, ye = O(l.chartWidget);
11705
+ N(() => l.chartWidget, (e) => {
11706
+ ye.value = e;
11707
+ }), N(ye, (e) => {
11708
+ let t, r, i;
11746
11709
  b(() => {
11747
- J.value = !1, h.current = null, T.value = null;
11710
+ U.value = !1, p.current = null, y.value = null;
11748
11711
  try {
11749
- if (n && clearTimeout(n), e) {
11712
+ if (r && clearTimeout(r), e) {
11750
11713
  let n = e.activeChart();
11751
- n && (r && n.onVisibleRangeChanged().unsubscribe(null, r), n.onIntervalChanged().unsubscribe(null, Pe), n.onSymbolChanged().unsubscribe(null, Fe)), t && e.unsubscribe("drawing_event", t);
11714
+ n && (i && n.onVisibleRangeChanged().unsubscribe(null, i), n.onIntervalChanged().unsubscribe(null, _e), n.onSymbolChanged().unsubscribe(null, ve)), t && e.unsubscribe("drawing_event", t);
11752
11715
  }
11753
11716
  } catch (e) {
11754
11717
  console.log(e);
11755
11718
  }
11756
11719
  }), e && e.onChartReady(() => {
11757
- let i = e.activeChart();
11758
- if (i) {
11759
- let a = i.resolution();
11760
- fe.value = a, pe.value = a;
11761
- let o = Q?.find((e) => e.display_name === i.symbol());
11762
- Z.value = o?.ticker || i.symbol();
11763
- let s = async (e, t) => {
11764
- if (((i?.getAllShapes())?.filter((e) => e.name === "date_range"))?.forEach((e) => {
11765
- i?.removeEntity(e.id);
11720
+ let a = e.activeChart();
11721
+ if (a) {
11722
+ let o = a.resolution();
11723
+ J.value = o, Y.value = o;
11724
+ let s = Q?.find((e) => e.display_name === a.symbol());
11725
+ X.value = s?.ticker || a.symbol();
11726
+ let c = async (e, t) => {
11727
+ if (((a?.getAllShapes())?.filter((e) => e.name === "date_range"))?.forEach((e) => {
11728
+ a?.removeEntity(e.id);
11766
11729
  }), t) {
11767
- let { data: n } = await i.exportData(), r = n.findIndex((e) => e[0] === t);
11768
- r === -1 && (r = n.length - 1);
11769
- let a = n.findIndex((t) => t[0] === e), o = Math.floor((a + r) / 2), s = n.slice(o - 13, o + 12), l = n.slice(o + 12 - 49, o + 12);
11770
- Y.value = s.length, X.value = s.map(c), R.setTargetCandles(l.map(c)), J.value = !0;
11771
- let u = s[0], d = s[s.length - 1];
11730
+ let { data: r } = await a.exportData(), i = r.findIndex((e) => e[0] === t);
11731
+ i === -1 && (i = r.length - 1);
11732
+ let o = r.findIndex((t) => t[0] === e), s = Math.floor((o + i) / 2), c = r.slice(s - 13, s + 12), l = r.slice(s + 12 - 49, s + 12);
11733
+ W.value = c.length, G.value = c.map(n), T.setTargetCandles(l.map(n)), U.value = !0;
11734
+ let u = c[0], d = c[c.length - 1];
11772
11735
  if (!u || !d) return;
11773
- if (h.current = await i.createMultipointShape([{ time: u[0] }, { time: d[0] }], Aa(ie.current())), h.current) {
11774
- let e = i.getShapeById(h.current);
11736
+ if (p.current = await a.createMultipointShape([{ time: u[0] }, { time: d[0] }], Aa(I.current())), p.current) {
11737
+ let e = a.getShapeById(p.current);
11775
11738
  e && e.setSavingEnabled && (e.setProperties({ customText: {
11776
11739
  visible: !0,
11777
11740
  text: ja
@@ -11779,281 +11742,261 @@ var Go = (e) => {
11779
11742
  }
11780
11743
  }
11781
11744
  };
11782
- t = $e(async (t, n) => {
11783
- if (!C.current && (n === "remove" && (h.current === t && (h.current = null), J.value = !1), n === "points_changed" && i.getAllShapes().filter((e) => e.name === "date_range").some((e) => e.id === t) && e)) {
11784
- let e = i.getShapeById(t);
11745
+ t = $e(async (t, r) => {
11746
+ if (!h.current && (r === "remove" && (p.current === t && (p.current = null), U.value = !1), r === "points_changed" && a.getAllShapes().filter((e) => e.name === "date_range").some((e) => e.id === t) && e)) {
11747
+ let e = a.getShapeById(t);
11785
11748
  if (!e) return;
11786
- let n = e.getPoints(), r = n[0].time, a = n[1].time, { data: o } = await i.exportData(), s = o.findIndex((e) => e[0] === a), l = o.findIndex((e) => e[0] === r);
11787
- s === -1 && (s = o.length - 2, l = o.length - 1 - 25);
11788
- let u = o.slice(l, s + 1).length - 1;
11789
- u > tt.max ? (u = Math.round(u / 10) * 10 - 1, u > tt.custom[tt.custom.length - 1] && (u = tt.custom[tt.custom.length - 1] - 1)) : u <= tt.min && (u = tt.min - 1), h.current && i.removeEntity(h.current), i.getAllShapes().filter((e) => e.name === "date_range").forEach((e) => {
11790
- i.removeEntity(e.id);
11749
+ let r = e.getPoints(), i = r[0].time, o = r[1].time, { data: s } = await a.exportData(), c = s.findIndex((e) => e[0] === o), l = s.findIndex((e) => e[0] === i);
11750
+ c === -1 && (c = s.length - 2, l = s.length - 1 - 25);
11751
+ let u = s.slice(l, c + 1).length - 1;
11752
+ u > tt.max ? (u = Math.round(u / 10) * 10 - 1, u > tt.custom[tt.custom.length - 1] && (u = tt.custom[tt.custom.length - 1] - 1)) : u <= tt.min && (u = tt.min - 1), p.current && a.removeEntity(p.current), a.getAllShapes().filter((e) => e.name === "date_range").forEach((e) => {
11753
+ a.removeEntity(e.id);
11791
11754
  });
11792
- let d = o.slice(s - u, s + 1), f = o.slice(s - 49, s + 1), p = d[0], m = d[d.length - 1];
11793
- if (!p || !m) return;
11794
- if (h.current = await i.createMultipointShape([{ time: p[0] }, { time: m[0] }], Aa(ie.current())), Y.value = d.length, X.value = d.map(c), R.setTargetCandles(f.map(c)), J.value = !0, h.current) {
11795
- let e = i.getShapeById(h.current);
11755
+ let d = s.slice(c - u, c + 1), f = s.slice(c - 49, c + 1), m = d[0], h = d[d.length - 1];
11756
+ if (!m || !h) return;
11757
+ if (p.current = await a.createMultipointShape([{ time: m[0] }, { time: h[0] }], Aa(I.current())), W.value = d.length, G.value = d.map(n), T.setTargetCandles(f.map(n)), U.value = !0, p.current) {
11758
+ let e = a.getShapeById(p.current);
11796
11759
  e && e.setSavingEnabled && (e.setProperties({ customText: {
11797
11760
  visible: !0,
11798
11761
  text: ja
11799
11762
  } }), e.setSavingEnabled(!1));
11800
11763
  }
11801
11764
  }
11802
- }, 500), T.value = () => {
11803
- J.value = !0;
11804
- let e = i.getVisibleRange();
11805
- e?.from && e?.to && s(e.from, e.to);
11765
+ }, 500), y.value = () => {
11766
+ U.value = !0;
11767
+ let e = a.getVisibleRange();
11768
+ e?.from && e?.to && c(e.from, e.to);
11806
11769
  };
11807
11770
  let l = (e) => {
11808
- if (!h.current || !e) return !1;
11771
+ if (!p.current || !e) return !1;
11809
11772
  try {
11810
- let t = i?.getShapeById(h.current);
11773
+ let t = a?.getShapeById(p.current);
11811
11774
  if (!t) return !1;
11812
11775
  let n = t.getPoints();
11813
11776
  if (n.length === 0) return !1;
11814
11777
  let r = n.map((e) => e.time).filter((e) => typeof e == "number");
11815
11778
  if (r.length === 0) return !1;
11816
- let a = Math.min(...r);
11817
- return Math.max(...r) < e.from || a > e.to;
11779
+ let i = Math.min(...r);
11780
+ return Math.max(...r) < e.from || i > e.to;
11818
11781
  } catch {
11819
11782
  return !1;
11820
11783
  }
11821
11784
  };
11822
- r = (e) => {
11823
- n && clearTimeout(n), n = setTimeout(() => {
11824
- l(e) ? J.value = !1 : h.current && (J.value = !0);
11785
+ i = (e) => {
11786
+ r && clearTimeout(r), r = setTimeout(() => {
11787
+ l(e) ? U.value = !1 : p.current && (U.value = !0);
11825
11788
  }, 150);
11826
- }, i.onIntervalChanged().subscribe(null, Pe), i.onSymbolChanged().subscribe(null, Fe), i.onVisibleRangeChanged().subscribe(null, r), e.subscribe?.("drawing_event", t);
11789
+ }, a.onIntervalChanged().subscribe(null, _e), a.onSymbolChanged().subscribe(null, ve), a.onVisibleRangeChanged().subscribe(null, i), e.subscribe?.("drawing_event", t);
11827
11790
  }
11828
11791
  });
11829
11792
  }, { immediate: !0 });
11830
- let Le = r(() => X.value[X.value.length - 1]?.timestamp ?? null);
11831
- Pa(Ie, D);
11832
- let Re = {
11833
- lastEntity: h,
11834
- applyingPatternRef: C,
11793
+ let be = r(() => G.value[G.value.length - 1]?.timestamp ?? null);
11794
+ Pa(ye, S);
11795
+ let xe = {
11796
+ lastEntity: p,
11797
+ applyingPatternRef: h,
11835
11798
  setHasActiveShape: (e) => {
11836
- J.value = e;
11799
+ U.value = e;
11837
11800
  },
11838
11801
  setCandles: (e) => {
11839
- X.value = e;
11802
+ G.value = e;
11840
11803
  },
11841
11804
  setWindowSize: (e) => {
11842
- Y.value = e;
11805
+ W.value = e;
11843
11806
  },
11844
11807
  setSymbol: (e) => {
11845
- Z.value = e;
11808
+ X.value = e;
11846
11809
  },
11847
11810
  setResolution: (e) => {
11848
- pe.value = e;
11811
+ Y.value = e;
11849
11812
  },
11850
11813
  setTimeframe: (e) => {
11851
- fe.value = e;
11814
+ J.value = e;
11852
11815
  },
11853
11816
  setTargetCandles: (e) => {
11854
- R.setTargetCandles(e);
11817
+ T.setTargetCandles(e);
11855
11818
  },
11856
11819
  clearSelectedCandles: () => {
11857
- H.value = null;
11820
+ k.value = null;
11858
11821
  }
11859
11822
  };
11860
- Wo(Ie, (e) => {
11861
- H.value = e;
11862
- }, Le, (e) => {
11863
- ee.value = e;
11864
- }, f.onCloseResult, Re, he), N(Ie, (e) => {
11823
+ Wo(ye, (e) => {
11824
+ k.value = e;
11825
+ }, be, (e) => {
11826
+ D.value = e;
11827
+ }, l.onCloseResult, xe, re), N(ye, (e) => {
11865
11828
  if (!e) return;
11866
11829
  let t = !1;
11867
11830
  b(() => {
11868
11831
  t = !0;
11869
11832
  try {
11870
- e.unsubscribe("onTimescaleMarkClick", Me);
11833
+ e.unsubscribe("onTimescaleMarkClick", he);
11871
11834
  } catch {}
11872
11835
  }), e.onChartReady(async () => {
11873
11836
  if (!t) {
11874
11837
  try {
11875
- await Do(e.activeChart(), m, G.value);
11838
+ await Do(e.activeChart(), f, L.value);
11876
11839
  } catch (e) {
11877
11840
  console.error("Failed to create generated candle studies:", e);
11878
11841
  }
11879
11842
  try {
11880
- e.subscribe("onTimescaleMarkClick", Me);
11843
+ e.subscribe("onTimescaleMarkClick", he);
11881
11844
  } catch {}
11882
11845
  }
11883
11846
  });
11884
- }, { immediate: !0 }), N(G, (e) => {
11885
- let t = Ie.value;
11847
+ }, { immediate: !0 }), N(L, (e) => {
11848
+ let t = ye.value;
11886
11849
  if (t) try {
11887
11850
  t.onChartReady(() => {
11888
11851
  try {
11889
- Eo(t.activeChart(), m, e);
11852
+ Eo(t.activeChart(), f, e);
11890
11853
  } catch {}
11891
11854
  });
11892
11855
  } catch {}
11893
- }), ko(Ie, m, pe, Z, H);
11894
- let ze = () => {
11856
+ }), ko(ye, f, Y, X, k);
11857
+ let Se = () => {
11895
11858
  try {
11896
- localStorage.removeItem(V), localStorage.removeItem(B);
11859
+ localStorage.removeItem(ee), localStorage.removeItem(V);
11897
11860
  } catch {}
11898
- let e = f.chartWidget?.activeChart?.();
11861
+ let e = l.chartWidget?.activeChart?.();
11899
11862
  if (e) {
11900
- D.current && D.current.length > 0 && (D.current.forEach((t) => {
11863
+ S.current && S.current.length > 0 && (S.current.forEach((t) => {
11901
11864
  try {
11902
11865
  e.removeEntity(t);
11903
11866
  } catch {}
11904
- }), D.current = []);
11867
+ }), S.current = []);
11905
11868
  try {
11906
11869
  e.clearMarks(2);
11907
11870
  } catch {}
11908
11871
  }
11909
- }, Be = (e) => {
11910
- fe.value = e;
11911
- }, Ve = (e) => {
11912
- K.value = e;
11913
- }, He = r(() => Q.find((e) => e.ticker === Z.value)?.type ?? "forex"), Ue = r(() => Z.value || localStorage.getItem("tv:latest-symbol") || "XAU_USD"), We = r(() => ({ "--chart-pane-size": `${F.value}%` }));
11914
- return y(() => {
11915
- let e = A.value, t = null;
11916
- e && (t = new ResizeObserver(() => {
11917
- window.dispatchEvent(new Event("resize"));
11918
- }), t.observe(e));
11919
- let n = window.matchMedia($o), r = () => {
11920
- L.value = n.matches;
11921
- };
11922
- n.addEventListener("change", r), v(() => {
11923
- t?.disconnect(), n.removeEventListener("change", r);
11924
- });
11925
- }), v(() => {
11926
- J.value = !1, h.current = null, T.value = null;
11872
+ }, Ce = (e) => {
11873
+ J.value = e;
11874
+ }, we = (e) => {
11875
+ z.value = e;
11876
+ }, Te = r(() => Q.find((e) => e.ticker === X.value)?.type ?? "forex"), Ee = r(() => X.value || localStorage.getItem("tv:latest-symbol") || "XAU_USD");
11877
+ return v(() => {
11878
+ U.value = !1, p.current = null, y.value = null;
11927
11879
  }), (t, n) => (x(), o("div", {
11928
- ref_key: "containerEl",
11929
- ref: k,
11930
- class: "iccandle-selector-widget__container",
11931
- style: _(We.value)
11880
+ ref_key: "rootEl",
11881
+ ref: C,
11882
+ lang: d.value,
11883
+ class: g(["iccandle-selector-widget", L.value === "dark" ? "iccandle-dark" : ""])
11932
11884
  }, [
11933
- s("div", {
11934
- ref_key: "chartPaneEl",
11935
- ref: A,
11936
- class: "iccandle-selector-widget__chart-pane"
11937
- }, [s("div", {
11938
- ref_key: "rootEl",
11939
- ref: j,
11940
- lang: p.value,
11941
- class: g(["iccandle-selector-widget", G.value === "dark" ? "iccandle-dark" : ""])
11942
- }, [
11943
- E(t.$slots, "default", { chartRefs: m }),
11944
- ne.value ? (x(), i(Ze, {
11945
- key: 0,
11946
- "submit-callback": se,
11947
- "handle-show-dialog": Se,
11948
- "on-open-scan-config": Ce,
11949
- "on-apply-saved-timeframe": Be,
11950
- "pending-scan-after-config": de.value,
11951
- "on-pending-scan-handled": Te,
11952
- "trigger-scanner": xe,
11953
- window_size: Y.value,
11954
- "current-symbol": Z.value,
11955
- resolution: pe.value,
11956
- timeframe: fe.value,
11957
- "chart-widget": e.chartWidget,
11958
- candles: X.value,
11959
- "handle-start-drag": ge,
11960
- "handle-stop-drag": _e,
11961
- "has-active-shape": J.value,
11962
- theme: G.value,
11963
- language: p.value,
11964
- "clear-scanner-news-marks": ze,
11965
- "selected-candles": H.value,
11966
- "iframe-loaded": e.iframeLoaded,
11967
- "is-loading": ee.value,
11968
- "handle-track-pattern-click": Oe
11969
- }, null, 8, [
11970
- "pending-scan-after-config",
11971
- "window_size",
11972
- "current-symbol",
11973
- "resolution",
11974
- "timeframe",
11975
- "chart-widget",
11976
- "candles",
11977
- "has-active-shape",
11978
- "theme",
11979
- "language",
11980
- "selected-candles",
11981
- "iframe-loaded",
11982
- "is-loading"
11983
- ])) : a("", !0),
11984
- K.value ? (x(), i(Gi, {
11985
- key: 1,
11986
- open: K.value,
11987
- "onUpdate:open": Ve,
11988
- resolution: pe.value,
11989
- type: He.value,
11990
- symbol: Z.value,
11991
- candles: X.value,
11992
- percent: 90,
11993
- theme: G.value
11994
- }, null, 8, [
11995
- "open",
11996
- "resolution",
11997
- "type",
11998
- "symbol",
11999
- "candles",
12000
- "theme"
12001
- ])) : a("", !0),
12002
- ue.value ? (x(), i(Hn, {
12003
- key: 2,
12004
- intent: ue.value,
12005
- "set-resolution": Be,
12006
- timeframe: fe.value,
12007
- "handle-close-dialog": we,
12008
- "current-symbol": Z.value,
12009
- theme: G.value,
12010
- onScanConfigSaved: Ee
12011
- }, null, 8, [
12012
- "intent",
12013
- "timeframe",
12014
- "current-symbol",
12015
- "theme"
12016
- ])) : a("", !0),
12017
- U.value && W.value ? (x(), i(ua, {
12018
- key: 3,
12019
- event: W.value,
12020
- symbol: Ue.value,
12021
- position: te.value,
12022
- onClose: De,
12023
- onGoToEventDetail: je
12024
- }, null, 8, [
12025
- "event",
12026
- "symbol",
12027
- "position"
12028
- ])) : a("", !0),
12029
- q.value || I.value ? (x(), o("div", qo)) : a("", !0),
12030
- u(Oa, {
12031
- theme: G.value,
12032
- style: _(ce.value)
12033
- }, null, 8, ["theme", "style"])
12034
- ], 10, Ko)], 512),
12035
- s("div", {
12036
- class: g(["iccandle-selector-widget__resize-handle", L.value ? "iccandle-selector-widget__resize-handle--stacked" : ""]),
12037
- role: "separator",
12038
- "aria-orientation": L.value ? "horizontal" : "vertical",
12039
- "aria-valuenow": F.value,
12040
- "aria-valuemin": Xo,
12041
- "aria-valuemax": Zo,
12042
- onPointerdown: ve,
12043
- onPointermove: ye,
12044
- onPointerup: be,
12045
- onPointercancel: be
12046
- }, null, 42, Jo),
12047
- s("iframe", {
12048
- ref_key: "resultIframeRef",
12049
- ref: ke,
12050
- src: ae.value,
12051
- class: "iccandle-selector-widget__iframe",
12052
- title: "ICCandle results",
12053
- onLoad: Ae
12054
- }, null, 40, Yo)
12055
- ], 4));
11885
+ E(t.$slots, "default", { chartRefs: f }),
11886
+ P.value ? (x(), i(Ze, {
11887
+ key: 0,
11888
+ "submit-callback": e.submitCallback,
11889
+ "handle-show-dialog": Z,
11890
+ "on-open-scan-config": ce,
11891
+ "on-apply-saved-timeframe": Ce,
11892
+ "pending-scan-after-config": q.value,
11893
+ "on-pending-scan-handled": ue,
11894
+ "trigger-scanner": oe,
11895
+ window_size: W.value,
11896
+ "current-symbol": X.value,
11897
+ resolution: Y.value,
11898
+ timeframe: J.value,
11899
+ "chart-widget": e.chartWidget,
11900
+ candles: G.value,
11901
+ "handle-start-drag": ie,
11902
+ "handle-stop-drag": ae,
11903
+ "has-active-shape": U.value,
11904
+ theme: L.value,
11905
+ language: d.value,
11906
+ "clear-scanner-news-marks": Se,
11907
+ "selected-candles": k.value,
11908
+ "iframe-loaded": e.iframeLoaded,
11909
+ "is-loading": D.value,
11910
+ "handle-track-pattern-click": pe
11911
+ }, null, 8, [
11912
+ "submit-callback",
11913
+ "pending-scan-after-config",
11914
+ "window_size",
11915
+ "current-symbol",
11916
+ "resolution",
11917
+ "timeframe",
11918
+ "chart-widget",
11919
+ "candles",
11920
+ "has-active-shape",
11921
+ "theme",
11922
+ "language",
11923
+ "selected-candles",
11924
+ "iframe-loaded",
11925
+ "is-loading"
11926
+ ])) : a("", !0),
11927
+ z.value ? (x(), i(Gi, {
11928
+ key: 1,
11929
+ open: z.value,
11930
+ "onUpdate:open": we,
11931
+ resolution: Y.value,
11932
+ type: Te.value,
11933
+ symbol: X.value,
11934
+ candles: G.value,
11935
+ percent: 90,
11936
+ theme: L.value
11937
+ }, null, 8, [
11938
+ "open",
11939
+ "resolution",
11940
+ "type",
11941
+ "symbol",
11942
+ "candles",
11943
+ "theme"
11944
+ ])) : a("", !0),
11945
+ K.value ? (x(), i(Hn, {
11946
+ key: 2,
11947
+ intent: K.value,
11948
+ "set-resolution": Ce,
11949
+ timeframe: J.value,
11950
+ "handle-close-dialog": le,
11951
+ "current-symbol": X.value,
11952
+ theme: L.value,
11953
+ onScanConfigSaved: de
11954
+ }, null, 8, [
11955
+ "intent",
11956
+ "timeframe",
11957
+ "current-symbol",
11958
+ "theme"
11959
+ ])) : a("", !0),
11960
+ A.value && j.value ? (x(), i(ua, {
11961
+ key: 3,
11962
+ event: j.value,
11963
+ symbol: Ee.value,
11964
+ position: M.value,
11965
+ onClose: fe,
11966
+ onGoToEventDetail: me
11967
+ }, null, 8, [
11968
+ "event",
11969
+ "symbol",
11970
+ "position"
11971
+ ])) : a("", !0),
11972
+ H.value ? (x(), o("div", Ko)) : a("", !0),
11973
+ u(Oa, {
11974
+ theme: L.value,
11975
+ style: _(R.value)
11976
+ }, null, 8, ["theme", "style"])
11977
+ ], 10, Go));
12056
11978
  }
12057
- });
11979
+ }), Jo = (e) => {
11980
+ let t = e?.contentWindow;
11981
+ if (!t || !e?.src) return;
11982
+ let n = new URL(e.src).origin;
11983
+ if (t.postMessage(JSON.stringify({
11984
+ type: "parent-origin",
11985
+ origin: window.location.origin
11986
+ }), n), new URLSearchParams(window.location.search).get("payment") === "success") {
11987
+ let e = () => t.postMessage(JSON.stringify({ type: "payment-success" }), n);
11988
+ [
11989
+ 0,
11990
+ 600,
11991
+ 1500
11992
+ ].forEach((t) => window.setTimeout(e, t));
11993
+ let r = new URL(window.location.href);
11994
+ [
11995
+ "payment",
11996
+ "session_id",
11997
+ "lookup_key"
11998
+ ].forEach((e) => r.searchParams.delete(e)), window.history.replaceState({}, "", r);
11999
+ }
12000
+ };
12058
12001
  //#endregion
12059
- export { z as WIDGET_RESULT_URL, es as WidgetIccandle, xo as getCustomIndicators, Go as handleResultIframeLoad, to as withPlayChart };
12002
+ export { B as WIDGET_RESULT_URL, qo as WidgetIccandle, xo as getCustomIndicators, Jo as handleResultIframeLoad, to as withPlayChart };