diff --git a/html/share/Agreement.html b/html/share/Agreement.html new file mode 100644 index 0000000..199a96d --- /dev/null +++ b/html/share/Agreement.html @@ -0,0 +1 @@ +

用户协议

更新日期:2025年8月15日

生效日期:2025年8月15日

目录:

引言

一、帐号管理

二、服务内容

三、用户个人信息保护

四、内容规范

五、使用规则

六、未成年人保护及监护人提示

七、数据储存

八、风险承担

九、知识产权声明

十、法律责任

十一、不可抗力及其他免责事由

十二、服务的变更、中断、终止

十三、其他

十四、如何联系我们

引言

特别提示

智驾定位(以下简称“我们”)在此特别提醒您(用户)在注册成为用户之前,请认真阅读本《用户协议》(以下简称“协议”),确保您充分理解本协议中各条款。请您审慎阅读并选择接受或不接受本协议。除非您接受本协议所有条款,否则您无权注册、登录或使用本协议所涉服务。您的注册、登录、使用等行为将视为对本协议的接受,并同意接受本协议各项条款的约束。

本协议约定我们与用户之间关于“智驾定位”软件服务(以下简称“服务”)的权利义务。“用户”是指注册、登录、使用本服务的个人。

本协议可由我们随时更新,更新后的协议条款一旦公布即代替原来的协议条款,恕不再另行通知,用户可在智驾定位查阅最新版协议条款。在我们修改协议条款后,如果用户不接受修改后的条款,请立即停止使用我们提供的服务,用户继续使用我们提供的服务将被视为接受修改后的协议。

1          帐号管理

1、用户在使用本服务前需要注册一个“智驾定位”帐号。“智驾定位”帐号应当使用手机号或微信、Apple等第三方账号作为登录方式进行绑定注册,请用户使用尚未与“智驾定位”帐号绑定以及未被我们根据本协议封禁的手机号或第三方账号。我们可以根据用户需求或产品需要对帐号注册和绑定的方式进行变更,而无须事先通知用户。

2、在用户注册及使用本服务时,我们可能需要搜集能识别用户身份的个人信息以便我们可以在必要时联系用户,或为用户提供更好的使用体验。我们搜集的信息包括但不限于用户的姓名、性别、年龄、出生日期、身份证号、地址、学校情况、公司情况、所属行业、兴趣爱好、常出没的地方、个人说明等。我们同意对这些信息的使用将受限于用户个人隐私信息保护的约束。用户可以在“智驾定位”查看与编辑个人信息。

3、 “智驾定位”帐号的所有权归我们所有,用户完成申请注册手续后,获得“智驾定位”帐号的使用权,该使用权仅属于初始申请注册人,禁止赠与、借用、租用、转让或售卖。我们因经营需要,有权回收用户的“智驾定位”帐号。

4、用户有责任妥善保管注册帐号信息及密码等帐号登录方式的安全,因用户保管不善可能导致遭受盗号或密码等信息失窃,责任由用户自行承担。用户需要对注册帐号以及帐号下的行为承担法律责任。用户同意在任何情况下不使用其他用户的帐号或密码。在用户怀疑他人使用其帐号或密码时,用户同意立即通知我们。

5、用户应遵守本协议的各项条款,正确、适当地使用本服务,如因用户违反本协议中的任何条款,我们在通知用户后有权依据协议中断或终止对违约用户“智驾定位”帐号提供服务。同时,我们保留在任何时候收回“智驾定位”帐号、用户名的权利。

6、如用户注册“智驾定位”帐号后一年不登录,通知用户后,我们可以收回该帐号,以免造成资源浪费,由此造成的不利后果由用户自行承担。

7、用户可以在“智驾定位”使用进行账号注销服务,用户确认注销账号是不可恢复的操作,用户应自行备份与智驾定位账号相关的信息和数据,用户确认操作之前与智驾定位账号相关的所有服务均已进行妥善处理。用户确认并同意注销账号后并不代表本智驾定位账号注销前的账号行为和相关责任得到豁免或减轻,如在注销期间,用户的账号被他人投诉、被国家机关调查或者正处于诉讼、仲裁程序中,我们有权自行终止用户的账号注销并无需另行得到用户的同意。

2          服务内容

本服务的具体内容由我们根据实际情况提供,可能包括各种工具、内容等。我们可以对其提供的服务予以变更,且我们提供的服务内容可能随时变更。

3          用户个人信息保护

1、填写信息

用户在注册帐号或使用本服务的过程中,可能需要填写或提交一些必要的个人信息,如法律法规、规章规范性文件(以下称“法律法规”)规定的需要填写的身份信息。如用户提交的信息不完整或不符合法律法规的规定,则用户可能无法使用本服务或在使用本服务的过程中受到限制。

2、用户个人信息包括

1)用户自行提供的用户个人信息(如注册时填写的手机号码,昵称,头像等个人信息,使用服务时提供的共享信息等);

2)其他方式分享的用户个人信息;

3)我们为提供服务而合法收集的用户必要个人信息(如使用服务时系统自动采集的设备或软件信息,浏览历史信息,通讯时间信息等技术信息,用户开启定位功能并使用服务时的地理位置信息等)。

其中个人隐私信息是指涉及用户个人身份或个人隐私的信息,比如,用户真实姓名、身份证号、手机号码、手机设备识别码、IP地址、用户聊天记录。非个人隐私信息是指用户对本服务的操作状态以及使用习惯等明确且客观反映在我们服务器端的基本记录信息、个人隐私信息范围外的其它普通信息,以及用户同意公开的上述隐私信息。我们保证在取得用户同意的情况下收集、使用或公开用户的个人隐私信息,用户同意我们无需获得用户的另行确认与授权即可收集、使用或公开用户的非个人隐私信息。

本产品包含基于位置的服务,需要使用用户地理位置信息,用户成功注册帐号视为确认授权我们提取、公开及使用用户的地理位置信息。用户地理位置信息将作为用户公开资料之一,由我们向其他用户公开以便我们向用户提供基于地理位置的产品服务。如用户需要终止向其他用户公开其地理位置信息,可随时自行设置为隐身状态。

3、尊重用户个人信息

尊重用户个人信息的私有性是我们的一贯制度,我们将采取技术措施和其他必要措施,确保用户个人信息安全,防止在本服务中收集的用户个人信息泄露、毁损或丢失。在发生前述情形或者我们发现存在发生前述情形的可能时,我们将及时采取补救措施并告知用户,用户如发现存在前述情形亦需立即与我们联系。

4、我们未经用户同意不向任何第三方公开、 透露用户个人隐私信息

但以下特定情形除外:

(1) 我们根据法律法规规定或有权机关的指示提供用户的个人隐私信息;

(2) 由于用户将其用户密码告知他人或与他人共享注册帐户与密码,由此导致的任何个人信息的泄漏,或其他非因我们原因导致的个人隐私信息的泄露;

(3) 用户自行向第三方公开其个人隐私信息;

(4) 用户与我们及合作单位之间就用户个人隐私信息的使用公开达成约定,我们因此向合作单位公开用户个人隐私信息;

(5) 任何由于黑客攻击、电脑病毒侵入及其他不可抗力事件导致用户个人隐私信息的泄露;

(6) 用户个人信息已经经过处理无法识别特定个人且不能复原。

5、用户同意我们可在以下事项中使用用户的个人隐私信息

(1) 我们向用户及时发送重要通知,如软件更新、本协议条款的变更;

(2) 我们内部进行审计、数据分析和研究等,以改进我们的产品、服务和与用户之间的沟通;

(3) 依本协议约定,我们管理、审查用户信息及进行处理措施;

(4) 适用法律法规规定的其他事项。除上述事项外,如未取得用户事先同意,我们不会将用户个人隐私信息使用于任何其他用途。

6、信息收集

为了改善我们的技术和服务,向用户提供更好的服务体验,我们或可会自行收集使用或向第三方提供用户的非个人隐私信息。

我们保证在合法、正当与必要的原则下收集、使用或者公开用户个人信息且不会收集与提供的服务无关的用户个人信息。

7、注重隐私安全

我们十分注重保护用户的个人隐私,并制定了《智驾定位隐私协议政策》,用户亦可以通过“设置”页面里的“关于”来进行具体查看,用户确认并同意使用我们提供的服务将被视为接受《智驾定位隐私协议政策》。

4          内容规范

1、本条所述内容是指用户使用本服务过程中所制作、上载、复制、发布、传播的任何内容,包括但不限于帐号头像、名称、用户说明等注册信息及认证资料,或文字、语音、图片、视频、图文等发送、回复或自动回复消息和相关链接页面,以及其他使用帐号或本服务所产生的内容。

2、用户不得利用“智驾定位”帐号或本服务制作、上载、复制、发布、传播如下法律、法规和政策禁止的内容:

(1) 反对宪法所确定的基本原则的;

(2) 危害国家安全,泄露国家秘密,颠覆国家政权,破坏国家统一的;

(3) 损害国家荣誉和利益的;

(4) 煽动民族仇恨、民族歧视,破坏民族团结的;

(5) 破坏国家宗教政策,宣扬邪教和封建迷信的;

(6) 散布谣言,扰乱社会秩序,破坏社会稳定的;

(7) 散布淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪的;

(8) 侮辱或者诽谤他人,侵害他人合法权益的;

(9) 不遵守法律法规底线、社会主义制度底线、国家利益底线、公民合法权益底线、社会公共秩序底线、道德风尚底线和信息真实性底线的“七条底线”要求的;

(10) 含有法律、行政法规禁止的其他内容的信息。

3、用户不得利用“智驾定位”帐号或本服务制作、上载、复制、发布、传播如下干扰“智驾定位”正常运营,以及侵犯其他用户或第三方合法权益的内容:

(1) 含有任何性或性暗示的;

(2) 含有辱骂、恐吓、威胁内容的;

(3) 含有骚扰、垃圾广告、恶意信息、诱骗信息的;

(4) 涉及他人隐私、个人信息或资料的;

(5) 侵害他人名誉权、肖像权、知识产权、商业秘密等合法权利的;

(6) 含有其他干扰本服务正常运营和侵犯其他用户或第三方合法权益内容的信息。

5          使用规则

1、用户在本服务中或通过本服务所传送、发布的任何内容并不反映或代表,也不得被视为反映或代表我们的观点、立场或政策,我们对此不承担任何责任。

2、用户不得利用“智驾定位”帐号或本服务进行如下行为:

(1) 提交、发布虚假信息,或盗用他人头像或资料,冒充、利用他人名义的;

(2) 强制、诱导其他用户关注、点击链接页面或分享信息的;

(3) 虚构事实、隐瞒真相以误导、欺骗他人的;

(4) 利用技术手段批量建立虚假帐号的;

(5) 利用“智驾定位”帐号或本服务从事任何违法犯罪活动的;

(6) 制作、发布与以上行为相关的方法、工具,或对此类方法、工具进行运营或传播,无论这些行为是否为商业目的;

(7) 其他违反法律法规规定、侵犯其他用户合法权益、干扰“智驾定位”正常运营或我们未明示授权的行为。

3、用户须对利用“智驾定位”帐号或本服务传送信息的真实性、合法性、无害性、准确性、有效性等全权负责,与用户所传播的信息相关的任何法律责任由用户自行承担,与我们无关。如因此给我们或第三方造成损害的,用户应当依法予以赔偿。

4、我们提供的服务中可能包括广告,用户同意在使用过程中显示我们和第三方供应商、合作伙伴提供的广告。除法律法规明确规定外,用户应自行对依该广告信息进行的交易负责,对用户因依该广告信息进行的交易或前述广告商提供的内容而遭受的损失或损害,我们不承担任何责任。

5、除非我们书面许可,用户不得从事下列任一行为:

(1) 删除软件及其副本上关于著作权的信息;

(2) 对软件进行反向工程、反向汇编、反向编译,或者以其他方式尝试发现软件的源代码;

(3) 对我们拥有知识产权的内容进行使用、出租、出借、复制、修改、链接、转载、汇编、发表、出版、建立镜像站点等;

(4) 对软件或者软件运行过程中释放到任何终端内存中的数据、软件运行过程中客户端与服务器端的交互数据,以及软件运行所必需的系统数据,进行复制、修改、增加、删除、挂接运行或创作任何衍生作品,形式包括但不限于使用插件、外挂或非经我们授权的第三方工具/服务接入软件和相关系统;

(5) 通过修改或伪造软件运行中的指令、数据,增加、删减、变动软件的功能或运行效果,或者将用于上述用途的软件、方法进行运营或向公众传播,无论这些行为是否为商业目的;

(6) 通过非我们开发、授权的第三方软件、插件、外挂、系统,登录或使用我们软件及服务,或制作、发布、传播非我们开发、授权的第三方软件、插件、外挂、系统。

6          未成年人保护及监护人提示

1、 若您是未满18周岁的未成年人,您应在您的监护人同意的情况下,并在监护人的监护、指导下,认真阅读并同意本协议后,方可使用“智驾定位”软件及相关服务。

2、未成年人用户及其监护人理解并确认,如您违反法律法规、本协议内容,则您及您的监护人应依照法律规定承担因此而可能导致的全部法律责任。

3、青少年用户必须遵守《全国青少年网络文明公约》。(1)要善于网上学习,不浏览不良信息;(2)要诚实友好交流,不侮辱欺诈他人;(3)要增强自护意识,不随意约会网友;(4)要维护网络安全,不破坏网络秩序;(5)要有益身心健康,不沉溺虚拟时空。

4、监护人特别提示。如您的被监护人使用“智驾定位”软件及相关服务时,您作为监护人应指导并监督被监护人的使用行为,如您的监护人申请注册使用“智驾定位”帐号,我们有权认为其已取得您的同意。

7          数据储存

1、我们不对用户在本服务中相关数据的删除或储存失败负责。

2、我们可以根据实际情况自行决定用户在本服务中数据的最长储存期限,并在服务器上为其分配数据最大存储空间等。用户可根据自己的需要自行备份本服务中的相关数据。

3、如用户超过1年没有使用本服务或本服务终止,为避免持续占用服务器资源,我们将从服务器上永久地删除用户的数据。本服务停止、终止后,我们没有义务向用户返还任何数据。

8          风险承担

1、用户理解并同意,“智驾定位”仅为用户提供各种服务,用户必须为自己注册帐号下的一切行为负责,包括用户所传送的任何内容以及由此产生的任何后果。用户应对“智驾定位”及本服务中的内容自行加以判断,并承担因使用内容而引起的所有风险,包括因对内容的正确性、完整性或实用性的依赖而产生的风险。我们无法且不会对因用户行为而导致的任何损失或损害承担责任。如果用户发现任何人违反本协议约定或以其他不当的方式使用本服务,请立即向我们举报或投诉,我们将依本协议约定进行处理。

2、用户理解并同意,因业务发展需要,我们保留单方面对本服务的全部或部分服务内容变更、暂停、终止或撤销的权利,用户需承担此风险。

9          知识产权声明

智驾定位尊重和鼓励用户创作的内容,认识到保护知识产权对智驾定位平台生存与发展的重要性,承诺将保护知识产权作为智驾定位平台运营的基本原则之一。

但智驾定位不是知识产权专业机构,不具备审查、判断作品是否侵权的能力,也不具备对用户所发布内容的合法性、真实性及其品质等进行审查的能力。任何用户应当为自己上传文件的行为独立、完全承担法律责任。因您的个人行为所产生的一切争议和纠纷以及诉讼,与智驾定位无关。

1、除本服务中涉及广告的知识产权由相应广告商享有外,我们在本服务中提供的内容(包括但不限于网页、文字、图片、音频、视频、图表等)的知识产权均归我们所有,但用户在使用本服务前对自己发布的内容已合法取得知识产权的除外。

2、除另有特别声明外,我们提供本服务时所依托软件的著作权、专利权及其他知识产权均归我们所有。

3、我们在本服务中所涉及的图形、文字或其组成,以及其他我们标志及产品、服务名称(以下统称“我们标识”),其著作权或商标权归我们所有。未经我们事先书面同意,用户不得将我们标识以任何方式展示或使用或作其他处理,也不得向他人表明用户有权展示、使用、或其他有权处理我们标识的行为。

4、上述及其他任何我们或相关广告商依法拥有的知识产权均受到法律保护,未经我们或相关广告商书面许可,用户不得以任何形式进行使用或创造相关衍生作品。

5、用户在使用智驾定位服务时发表上传的文字、图片、视频、音频、软件以及表演等信息,此部分信息的知识产权归用户,责任由用户承担。但用户的发表、上传行为视为对我们的授权,用户理解并同意授予我们及其关联公司全球范围内完全免费、不可撤销、独家、永久、可转授权和可再许可的权利,包括但不限于:复制权、发行权、出租权、展览权、表演权、放映权、广播权、信息网络传播权、摄制权、改编权、翻译权、汇编权以及《著作权法》规定的由著作权人享有的其他著作财产权利及邻接权利。我们可自行选择是否使用以及使用方式,包括但不限于将前述信息在我们旗下的服务平台上使用与传播,将上述信息再次编辑后使用,以及由我们授权给合作方使用、编辑与传播等。

6、智驾定位有权但无义务对用户发布的内容进行审核,有权根据相关证据结合《中华人民共和国民法典》、《中华人民共和国著作权法》、《信 息网络传播权保护条例》等法律法规对侵权信息进行处理。

7、在智驾定位网站及移动端app中上传或发表的内容,用户应保证其为著作权人或已取得合法授权,并且该内容不会侵犯任何第三方的合法权益。如果第三方提出关于著作权的异议,智驾定位有权根据实际情况删除相关的内容有权追究用户的法律责任,给智驾定位平台或任何第三方造成损失的,用户应负责全额赔偿。

8、智驾定位平台十分重视网络版权及其它知识产权以及用户权益的保护,如果个人或单位发现智驾定位平台上存在侵犯自身合法权益的内容,请与智驾定位平台取得联系(邮箱:zuomeng2@batiao8.com)。为了保证问题能够及时有效地处理,请务必提交真实有效、完整清晰的材料,否则 不予受理。请使用以下格式(包括各条款的序号) :

  1. 权利人对涉嫌侵权内容拥有商标权、著作权或其他依法可以行使权利的权属证明;如果举报人非权利人,请举报人提供代表企业进行举报的书面授权证明。

  2.充分、 明确地描述侵犯了权利人合法权益的内容,提供涉嫌侵权内容在智驾定位上的具体页面地址,指明涉嫌侵权内容中的哪些内容侵犯了上述列明的权利人的合法权益;

  3.权利人具体的联络信息,包括姓名、身份证或护照 复印件(对自然人)、单位登记证明复印件(对单位)、 通信地址、电话号码、传真和电子邮件;

  4.在侵权举报中加入如下关于举报内容真实性的声明:

   a.我本人为所举报内容的合法权利人;

   b.我举报发布在智驾定位平台中的内容侵犯了本人相应的合法权益;

   c. 如果本侵权举报内容不完全属实,本人将承担由此产生的一切法律责任。

智驾定位平台工作人员会在收到相关材料并经相关机构核实后,在10个工作日内处理完毕并给出回复。处理期期间,不提供任何电话、邮件及其他方式的查询服务。若出现智驾定位已经删除或处理的内容,但是百度、谷歌等搜索引擎依然可以搜索到的现象,是因为百度、谷歌等搜索引擎自带缓存,此类问题智驾定位无权也无法处理, 因此相关申请不予受理。用户在智驾定位中的商业行为引发的法律纠纷,由交易双方自行处理,与智驾定位无关。

10     法律责任

1、如果我们发现或收到他人举报或投诉用户违反本协议约定的,我们有权不经通知随时对相关内容,包括但不限于用户资料、聊天记录进行审查、删除,并视情节轻重对违规帐号处以包括但不限于警告、帐号封禁 、设备封禁 、功能封禁 的处罚,且通知用户处理结果。

2、因违反用户协议被封禁的用户,可向我们网站相关页面提交申诉,我们将对申诉进行审查,并自行合理判断决定是否变更处罚措施。

3、用户理解并同意,我们有权依合理判断对违反有关法律法规或本协议规定的行为进行处罚,对违法违规的任何用户采取适当的法律行动,并依据法律法规保存有关信息向有关部门报告等,用户应承担由此而产生的一切法律责任。

4、用户理解并同意,因用户违反本协议约定,导致或产生的任何第三方主张的任何索赔、要求或损失,包括合理的律师费,用户应当赔偿我们与合作公司、关联公司,并使之免受损害。

11     不可抗力及其他免责事由

1、用户理解并确认,在使用本服务的过程中,可能会遇到不可抗力等风险因素,使本服务发生中断。不可抗力是指不能预见、不能克服并不能避免且对一方或双方造成重大影响的客观事件,包括但不限于自然灾害如洪水、地震、瘟疫流行和风暴等以及社会事件如战争、动乱、政府行为等。出现上述情况时,我们将努力在第一时间与相关单位配合,及时进行修复,但是由此给用户或第三方造成的损失,我们及合作单位在法律允许的范围内免责。

2、本服务同大多数互联网服务一样,受包括但不限于用户原因、网络服务质量、社会环境等因素的差异影响,可能受到各种安全问题的侵扰,如他人利用用户的资料,造成现实生活中的骚扰;用户下载安装的其它软件或访问的其他网站中含有“特洛伊木马”等病毒,威胁到用户的计算机信息和数据的安全,继而影响本服务的正常使用等等。用户应加强信息安全及使用者资料的保护意识,要注意加强密码保护,以免遭致损失和骚扰。

3、用户理解并确认,本服务存在因不可抗力、计算机病毒或黑客攻击、系统不稳定、用户所在位置、用户关机以及其他任何技术、互联网络、通信线路原因等造成的服务中断或不能满足用户要求的风险,因此导致的用户或第三方任何损失,我们不承担任何责任。

4、用户理解并确认,在使用本服务过程中存在来自任何他人的包括误导性的、欺骗性的、威胁性的、诽谤性的、令人反感的或非法的信息,或侵犯他人权利的匿名或冒名的信息,以及伴随该等信息的行为,因此导致的用户或第三方的任何损失,我们不承担任何责任。

5、用户理解并确认,我们需要定期或不定期地对“智驾定位”平台或相关的设备进行检修或者维护,如因此类情况而造成服务在合理时间内的中断,我们无需为此承担任何责任,但我们应事先进行通告。

6、我们依据法律法规、本协议约定获得处理违法违规或违约内容的权利,该权利不构成我们的义务或承诺,我们不能保证及时发现违法违规或违约行为或进行相应处理。

7、用户理解并确认,对于我们向用户提供的下列产品或者服务的质量缺陷及其引发的任何损失,我们无需承担任何责任:

(1) 我们向用户免费提供的服务;

(2) 我们向用户赠送的任何产品或者服务;

8、在任何情况下,我们均不对任何间接性、后果性、惩罚性、偶然性、特殊性或刑罚性的损害,包括因用户使用“智驾定位”或本服务而遭受的利润损失,承担责任(即使我们已被告知该等损失的可能性亦然)。尽管本协议中可能含有相悖的规定,我们对用户承担的全部责任,无论因何原因或何种行为方式,始终不超过用户因使用我们提供的服务而支付给我们的费用(如有)。

12     服务的变更、中断、终止

1、鉴于网络服务的特殊性,用户同意我们有权随时变更、中断或终止部分或全部的服务(包括收费服务)。我们变更、中断或终止的服务,我们应当在变更、中断或终止之前通知用户,并应向受影响的用户提供等值的替代性的服务;

2、如发生下列任何一种情形,我们有权变更、中断或终止向用户提供的免费服务或收费服务,而无需对用户或任何第三方承担任何责任:

(1) 根据法律规定用户应提交真实信息,而用户提供的个人资料不真实、或与注册时信息不一致又未能提供合理证明;

(2) 用户违反相关法律法规或本协议的约定;

(3) 按照法律规定或有权机关的要求;

(4) 出于安全的原因或其他必要的情形。

13     其他

1、我们郑重提醒用户注意本协议中免除我们责任和限制用户权利的条款,请用户仔细阅读,自主考虑风险

2、本协议的效力、解释及纠纷的解决,适用于中华人民共和国法律。若用户和我们之间发生任何纠纷或争议,首先应友好协商解决,协商不成的,用户同意将纠纷或争议提交我们住所地有管辖权的人民法院管辖。

3、本协议的任何条款无论因何种原因无效或不具可执行性,其余条款仍有效,对双方具有约束力。

4、由于互联网高速发展,您与我们签署的本协议列明的条款可能并不能完整罗列并覆盖您与智驾定位所有权利与义务,现有的约定也不能保证完全符合未来发展的需求。因此,智驾定位隐私权政策、智驾定位平台行为规范等均为本协议的补充协议,与本协议不可分割且具有同等法律效力。如您使用智驾定位平台服务,视为您同意上述补充协议。

5、本协议中的标题仅为方便阅读而设,并不影响本协议中任何规定的含义或解释。

14     如何联系我们

如果您对本协议有任何疑问、意见或建议,欢迎发送至zuomeng2@batiao8.com与我们进行联系

 

\ No newline at end of file diff --git a/html/share/Cancellation.html b/html/share/Cancellation.html new file mode 100644 index 0000000..c74d860 --- /dev/null +++ b/html/share/Cancellation.html @@ -0,0 +1,5 @@ +

账号注销协议

更新日期:2025811

生效日期:2025811

尊敬的用户,在您正式开始下一步有关本产品或服务的账号注销流程前,我们先为您做出如下特别说明:注销本产品或服务的账号后,除法律法规或本协议另有规定外,您在该账号下的个人信息将进行删除或匿名化处理,且此前已关联该账号的相关产品与服务将不再关联。该账号一旦注销完成,将无法恢复,请您谨慎操作。

若您经过慎重考虑后仍决定注销本产品或服务账号的,请您务必先行仔细阅读和充分理解本《账号注销协议》(本协议),并同意本协议全部内容,尤其是本协议免责、限制条款(如第一条、第3.3条)及争议解决方式和管辖条款(第4.2条、4.3条和4.4条),前述条款可能以黑体加粗、颜色标记或其他合理方式提示您注意,本协议由您与本产品或服务的提供方(以下称智驾定位我们)共同缔结,本协议具有合同效力。您按照我们的注销操作流程开始注销流程的,或者您勾选本协议并开始下一步操作的,均视为您已经同意和遵守本协议全部内容。

为确保注销的顺利完成,请您在约定的账号注销申请处理期间内不要使用该账号登录本产品或服务,否则视为您撤销注销该账号。

如您在注销后需要再次使用我们的服务的,欢迎您使用认可的其他账号等方式重新注册登录(可支持登录的账号以产品具体提供的为准)。

 

一、您知悉并同意:在您的账号注销后,将(可能)产生包括但不限于如下结果,并需要您自行承担:

1.1您将无法登录、使用该账号,您的好友可能无法与您在本产品或服务内进行互动;

1.2除法律法规或本协议另有规定外,您该产品账号下的个人信息将会被删除或匿名化处理。您无法再找回您的个人信息,也无权要求我们找回,前述个人信息包括但不限于:头像、昵称、订阅和消费记录、聊天记录等内容(如有);

如您的账号曾因违反国家相关法律法规及(或)本产品或服务的相关协议、规则相关规定被我们采取封号及(或)其他处理措施的,为了维护您及其他相关权利人的合法权益所必须,在您账号注销后我们可能会对与该账号违规行为有关的数据保留3个月。在保留期限内,我们除将该数据用于维护您及其他相关权利人的合法权益外,不会用于其他目的;

1.3您知悉,账号注销的,该产品账号下的相关权益也将会被删除,据此,也特别提示您,在您注销本产品账号前请您妥善处理您账号下的相关权益。一旦您注销本账号,如该账号下还存在相关权益的(包括在本产品使用期间已产生的及未来可能产生的权益),视为您自愿放弃该等权益,我们有权对该账号下的全部权益做清除处理,因此产生的后果由您自行承担,您同意不会要求我们恢复或赔偿该等权益。前述权益包括但不限于:会员权益、等级;尚未使用的优惠券、兑换券、其他虚拟物品(如有)(如卡券、钻石、道具及其他等);已经购买的未到期的服务;已产生但未消耗完毕的其他未来预期的权益等;

1.4本产品或服务账号一旦注销,将无法恢复。即使您在注销后以相同手机号码微信认可的其他账号作为本产品或服务账号再次向我们申请注册登录本产品或服务的,此时该账号将视为新的用户账号。因此,我们善意地提醒您在申请注销前对需要备份的内容提前做好备份;

1.5本产品或服务账号一旦注销,您与我们签署的有关本产品或服务的服务协议终止(但已约定继续生效的除外)。但前述服务协议的终止并不影响该账号注销前您使用本产品或服务应当承担的相关责任,您仍需要对该账号注销前使用本产品或服务的行为承担相应责任,包括但不限于可能产生的违约责任、损害赔偿责任及履约义务等;

1.6其他因账号注销(可能)产生的结果。

 

二、在您向我们申请/继续申请注销账号之前,为保障您的账号安全和相关权益,您需先行检查,并确保和承诺您申请注销的账号已经同时满足以下条件,这些条件包括但不限于:

2.1该账号为您本人合法拥有并登录使用,且符合有关该账号服务提供方制定的相关协议和规则,包括但不限于用户服务协议

2.2注销条件账号处于安全状态:账号正常使用中,未处于违规处理期间,且没有被盗、被封等风险;

2.3该账号中的相关权益已得到妥善处理:包括但不限于会员权益及其他益等。请您妥善处理您的相关权益,若注销时未处理,视为您自愿放弃该等权益;

2.4该账号无处于未完成状态订单:包括但不限于基于该账号产生的有关虚拟道具、周边商品等的订单;

2.5该账号无任何纠纷:包括投诉举报、被投诉举报、国家机关调查、仲裁、诉讼等纠纷;

2.6本产品或服务官方公布的其他条件;

上述问题您可首先尝试自行处理,如您无法处理的或在处理过程中有任何疑惑的,可联系我们的客服协助处理。

 

三、如何注销账号?

3.1您需按照我们的官方渠道提供的注销流程和操作指引,在相关功能设置页面进行注销操作;

3.2您已经同意本注销协议的全部内容;同时,您已经检查与确认满足了本协议第二条的要求;

3.3在您完成上述第3.2条后,为进一步保障您的相关合法权益,我们有权视情况验证您是否满足本协议第二条规定的部分或全部注销条件。如我们验证的,我们有权根据您的账号安全状态以及您对相关产品与服务的使用情况等综合判断您的账号是否符合该注销条件。为保障您的账号安全和财产权益,我们有权进行注销申请的身份验证以判断您是该账号的有权使用人。如我们在综合判断后发现该账号不符合注销条件的,或者身份验证失败的,您的注销可能会失败,您可以按照我们的指引进行后续操作或联系我们的客服协助处理。即使我们判断您符合注销条件的,也是基于您的承诺(即您自身确保账号符合上述注销条件的承诺)进行的形式审查,仍由您自身对账号符合上述注销条件承担保证责任,我们对此不承担相应的法律责任;

3.4我们将在15个工作日内完成您的注销申请核查和处理。具体注销流程和规则以本产品或服务官方说明的账号注销规则为准。

但请注意,若您在约定的账号注销申请处理期间使用该账号登录和使用本产品或服务,则视为您撤销该账号注销申请。同时您理解并同意,在对该账号下的个人信息删除或匿名化之前,为最大程度保障您和其他用户合法权益,我们需要一定时间对该账号下的个人信息作相应梳理和处理,因此,我们删除或匿名化处理该账号下个人信息可能会存在一定的延迟;

3.5您理解并同意,在您申请注销账号期间,如我们需要对相关交易、投诉或其他与您的账号相关的事项进行核实的,或者我们有其他合理的理由的,我们有权冻结您的账号注销申请并暂停为您提供注销服务。

 

四、其他

4.1您知悉并同意:即使您该产品(或服务)的账号被注销,也并不减轻或免除您应根据相关法律法规、相关协议、规则等(可能)需要承担的相关责任。

4.2本协议的成立、生效、履行、解释及纠纷解决,适用中华人民共和国大陆地区法律(不包括冲突法)。

4.3您和智驾定位之间因本协议发生的(和/或与本协议有关的)任何纠纷或争议,首先友好协商解决;协商不成的,您同意将纠纷或争议提交至本协议签订地有管辖权的人民法院管辖。

4.4如在账号注销过程中有任何问题您无法处理的或在处理过程中有任何疑惑的,可联系客服协助处理。

 

+
+ 档铺网——在线文档免费处理 +
+ \ No newline at end of file diff --git a/html/share/KidsPrivacy.html b/html/share/KidsPrivacy.html new file mode 100644 index 0000000..e834bd2 --- /dev/null +++ b/html/share/KidsPrivacy.html @@ -0,0 +1,153 @@ + + + + + + + + + + +
+

+ 儿童隐私保护声明

+

+ 本隐私协议依据《个人信息保护法》、《未成年人保护法》等相关法律法规更新相关内容,以更清晰、明确地向您告知我们收集儿童个人信息的场景、目的、方式和范围,帮助您更好地管理儿童的个人信息。

+

+ 本声明中“儿童”,是指不满14周岁的未成年人。《儿童隐私保护声明》(以下简称“本声明”)和《APP隐私政策》旨在向监护人(以下简称“您”)和儿童说明我们如何收集、使用、存储和处理儿童的个人信息,以及我们为您与儿童提供的访问、更正、删除和保护这些信息的方式。

+

+ 儿童监护人特别说明:

+

+ 如果您是儿童的监护人(父母或其他监护人),请您仔细阅读和选择是否同意本声明。我们希望您与我们共同保护儿童的个人信息,教育引导儿童增强个人信息保护意识和能力。

+

+ 儿童特别说明:

+

+ 如果您是儿童,您需要和您的监护人(父母或其他监护人)共同仔细阅读本声明,并在征得监护人同意后,使用我们的产品、服务或向我们提供信息。

+

+ 请监护人和儿童在仔细阅读并充分理解《APP隐私政策》、具体产品的隐私保护指引和本声明后,由监护人选择是否同意相关隐私政策以及是否同意儿童使用我们的产品和服务。 + 如果监护人不同意相关隐私政策和本声明的内容或不同意提供服务所必要的信息,将可能导致我们的产品和服务无法正常运行,或者无法达到我们拟达到的服务效果,监护人和儿童可能无法正常使用我们的产品、服务或相关的具体业务功能。

+

+ 监护人点击“同意”即表示监护人同意我们按照《APP隐私政策》、具体产品的隐私保护指引和本声明的约定收集、使用和处理监护人和儿童的信息。

+

+ 请仔细阅读本声明并确认了解我们对儿童个人信息的处理规则,如您在阅读本声明过程中有任何疑问或权利请求等个人信息相关事宜的,可联系我们解决。

+

+ 我们收集哪些信息

+

+ 我们严格遵守法律法规的规定及与用户的约定,根据用户选择产品和服务的具体情况,收集监护人和儿童的以下个人信息。

+

+ 当我们根据法律法规及行业管理要求,需要为儿童用户配置保护措施时, + 我们可能会提示您提供监护人的手机号码、电子邮箱或者通过“扫码验证”等方式,与我们建立联系。在某些涉及支付的产品和服务中,我们可能会要求监护 + 人填写和绑定监护人的银行 + 卡相关 + 信息,以便监护人知悉和管理儿童的支付行为 +

+

+ 在儿童使用产品和服务过程中,我们会要求您提供相关必要的信息,具体请查阅《APP隐私政策》“我们收集的信息”一节。

+

+ 如果我们需要收集监护人或儿童的其他个人信息,我们将再次告知监护人和儿童,并征得监护人的同意。

+

+ 监护人可以选择是否填写或向我们提供特定的信息。请您理解, + 监护人如果不填写或不提供某些特定的信息,可能会导致我们的产品和服务无法正常运行,或者无法实现我们拟提供的服务效果,监护人和儿童可能无法正常使用我们的产品、服务或相关的具体业务功能。

+

+ 我们如何使用这些信息

+

+ 我们严格遵守法律法规的规定及与用户的约定,将收集的监护人和儿童的信息可能用于以下用途:

+

+ 验证儿童和监护人身份 +

+

+ 提供必要的产品和服务、产品和服务的具体功能 +

+

+ 用于优化产品和服务、安全保障 +

+

+ 如果我们需要超出上述用途使用监护人或儿童的个人信息,我们将再次告知监护人和儿童,并征得监护人的同意。

+

+ 管理、披露儿童个人信息

+

+ 我们遵照法律法规的规定,严格管理儿童的个人信息。

+

+ 我们仅在监护人事先同意并采取符合《个人信息保护法》等法律法规要求的相关合 + + 措施的情况下,才可能与监护人共享儿童的个人信息:

+

+ 例如,我们会将部分儿童个人信息(如儿童用户名、账号,以及该儿童在我们某些产品和服务中的支付记录等)与监护人进行共享,监护人可以访问和管理相关个人信息。

+

+ 发生合并、收购、资产转让等

+

+ 随着我们业务的持续发展,当发生合并、收购、资产转让等交易导致向第三方共享或转移监护人和儿童的个人信息时,我们将通过推送通知、公告等形式告知监护人和儿童相关情形,按照法律法规及不低于本声明所要求的标准继续保护或要求新的管理者继续保护监护人和儿童的个人信息。

+

+ 一般情况下,我们禁止披露儿童个人信息,但我们可能基于以下目的使用儿童的个人信息:

+

+ +   + 遵守适用的法律法规等有关规定;

+

+ +   + 遵守法院判决、裁定或其他法律程序的规定;

+

+ +   + 遵守相关政府机关或其他法定授权组织的要求;

+

+ +   + 我们有理由确信需要遵守法律法规等有关规定;

+

+ +   + 为执行相关服务协议或本声明、维护社会公共利益,为保护我们的客户、我们或我们的关联公司、其他用户或雇员的人身财产安全或其他合法权益合理 + 且必要 + 的用途。

+

+ 存储儿童个人信息

+

+ 我们会采取加密等技术措施存储儿童个人信息,确保信息安全。我们存储儿童个人信息,不会超过实现其收集、使用目的所必需的期限。请查阅《时刻守护隐私政策》详细了解我们如何存储和保护儿童个人信息。

+

+ 当我们的产品和服务发生停止运营的情形或监护人和儿童的个人信息存储期限届满时,我们将采取例如,推送通知、公告等形式通知监护人和儿童,并在合理的期限内删除或匿名化处理监护人和儿童的个人信息。

+

+ 更正、删除儿童个人信息

+

+ 在儿童用户使用我们的产品和服务期间,为了监护人和儿童可以更加便捷地访问、更正、删除相关个人信息,监护人可以通过我们提供的联系方式,来反馈和咨询相关信息。我们会在核实监护人反馈的问题后及时与监护人联系。请监护人理解,在核实过程中,我们可能需要监护人提供儿童账号、儿童身份信息、联系方式等个人信息,以便在完成身份验证和核实问题后继续响应监护人的需求。

+

+ 访问儿童个人信息

+

+ 监护人和儿童可以查看儿童在使用我们产品和服务中提供或产生的个人信息,包括但不限于用户名、密码、头像、昵称、性别、主动发布的内容等。

+

+ 更正儿童个人信息

+

+ 当监护人和儿童发现我们收集、使用和处理的儿童个人信息有错误时,可以联系我们进行更正。我们会在完成身份验证和核实问题后,及时采取措施予以更正。

+

+ 删除儿童个人信息

+

+ 如存在以下情况,监护人和儿童可以联系我们删除收集、使用和处理的儿童个人信息。我们会在完成身份验证和核实问题后,及时采取措施予以删除:

+

+ -若我们违反法律、行政法规的规定或者双方的约定收集、存储、使用、转移、披露儿童个人信息;

+

+ -若我们超出目的范围或者必要期限收集、存储、使用、转移、披露儿童个人信息;

+

+ -若监护人撤回同意;

+

+ -若监护人或儿童通过注销等方式终止使用产品或者服务的。

+

+ 但请注意,若监护人和儿童要求我们删除特定儿童个人信息,可能导致该儿童用户无法继续使用我们的产品和服务或产品和服务中的某些具体业务功能。 如监护人发现在未事先征得监护人同意的情况下收集了儿童的个人信息,请及时联系我们,我们会采取措施尽快删除相关数据。

+

+ 本声明的适用

+

+ 请您理解,如本声明未规定之处,参照适用《APP隐私政策》或具体产品的隐私保护指引。

+

+ 在适用本声明的情况下,如本声明与《APP隐私政策》和具体产品的隐私保护指引的条款规定存在不一致的,以本声明为准。

+

+ 联系我们

+

+ 如您对本声明有任何疑问和反馈,请通过 + zuomeng2@batiao8.com + 与我们联系;

+

+  

+
+ + + \ No newline at end of file diff --git a/html/share/Privacy.html b/html/share/Privacy.html new file mode 100644 index 0000000..a59b5c5 --- /dev/null +++ b/html/share/Privacy.html @@ -0,0 +1,489 @@ + + + + + + + + + + + 《APP用户隐私政策》 + + + +
+
+ +
+ +

版本发布日期: 2025 年 8 月 10 日

+ +

版本更新日期: 2025 年 9 月 17 日

+ +

版本生效日期: 2025 年 9 月 17 日

+ +

一、总则

+

+ 智驾定位非常重视用户个人信息的保护。您在使用我们的产品或服务时,我们可能会收集和使用您的相关信息。我们希望通过《智驾定位隐私政策》(以下简称“本政策”)向您说明我们在收集和使用您相关个人信息时对应的处理规则相关事宜,以便更好地保障您的权益。请在使用智驾定位服务前仔细阅读本《隐私政策》。如果您进一步访问并使用智驾定位,则表示您了解并接受了本《隐私政策》中所述的全部内容,并同意受其约束。如果您不接受前述任何内容,请停止访问或使用智驾定位。

+ +

如您对本隐私政策或相关事宜有任何疑问,您可随时通过发送邮件至account@batiao8.com与我们联系。

+ +

二.权限申请及应用场景

+

+ 我们对于软件需要在用户使用设备上获取的权限非常严格和克制,在使用本应用过程中,我们会向您申请使用该功能所必须的权限,若您不同意开启该权限,请点击“我不同意”,拒绝该权限的申请仅将影响您对特定产品功能的使用。我们在此向您列举产品将可能申请的权限及其使用目的。

+

+ (1)设备信息:为了保障您正常使用提供本产品和服务,以及向您展示内容或者服务信息,我们会在APP前台运行、静默状态下或后台运行时收集您的设备信息,包括:设备型号、设备名称、设备配置、设备序列号、IP地址、MAC地址及唯一设备标识符(IMEI、AndroidID、OAID、VAID、AAID、CAID、ADID、GUID、GAID、UUID、UAID、MEID、IMEISV、IMSI、EMMCID、UFSID 、SUCI、ICCID、SN码、SIM卡序列号)、已安装应用列表、运行中的进程、获取/监听传感器、剪切板、蓝牙信息以及读取/写入/删除SD卡数据等软硬件特征信息、操作系统和应用程序版本、语言设置、分辨率、电信运营商、设备所在位置相关信息(包括您授权的GPS位置信息及WLAN接入点和基站传感器信息)、浏览器类型、网络信息(网络状态、网络类型、SSID、BSSID、WiFi 状态、WiFi信息、WiFi列表)、联系人等,来对相应的内容或者服务内容进行排序以适应您的设备界面和鉴别用户身份、记录系统故障和分析系统故障时产生的原因等。 +

+ + +

(2)存储权限:读取、存储将应用的图片及其他文件缓存/存储到手机上,以及读取一存储的图片及其他文件

+ +

+ (3)我们会从微信第三方获取您授权共享的账户信息(头像、昵称、地区)。登录后将您的第三方账户与智驾定位绑定,使您可以通过第三方账户直接登录并使用我们的产品和服务。我们会将依据与第三方的约定、对个人信息来源的合法性进行确认后,在符合相关法律和法规规定的前提下,使用您的个人信息。 +

+

+ (4)我们会通过登录、完善个人信息方式收集手机号身份证号姓名企业名称企业地址职位电子邮箱信息,用于商务对接。我们会履行隐私保护协议,在符合相关法律和法规规定的前提下使用用户个人信息,对用户个人信息进行加密存储、严格保密 +

+

(5)我们会在首页和搜索页面读取您的剪切板,用于快速粘贴搜索链接,为您提供更方便的服务。

+

(6)相机权限:我的->意见反馈界面和作文批改界面 + 需要拍摄照片上传,更好的向我们传达用户的意见以及正常使用我们的产品

+

(7)光线传感器和加速度传感器权限:我们会在使用相机的时候使用传感器,使拍照时有更好的交互使用体验

+

(8)收集频率:Android系统下,GPS频率为移动距离超过5米采集1次;IOS系统下,GPS频率为移动距离超过1米采集1次;高频轨迹数据,采集频率不低于1Hz的车辆轨迹数据;低频轨迹数据,采集频率低于1Hz的车辆轨迹数据

+ + +

三.我们收集和使用这些信息的目的

+ +

对于我们收集或接收的有关您的信息,我们可能会用于多种目的,包括但不限于:

+ +

1、将您的公开信息进行汇总、分析以形成报告;

+ +

2、处理您提交的咨询、订阅或定制服务或让您参与有关我们产品和服务的调查;

+ +

3、管理会员资格及会员权益(如认证身份、管理会员账户、组织会员活动、发放会员福利);

+ +

+ 4、对智驾定位进行推广(如对用户信息进行统计并制作反映用户分布及兴趣偏好总体状况的分析报告、制作市场营销图表或其它营销材料,评估我们服务中的广告和其他促销及推广活动的效果,并加以改善),但我们会对该材料进行去个体识别化处理。

+ +

+ 5、用于网络安全防范(在我们提供服务时,用于身份验证、客户服务、安全防范、诈骗监测、存档和备份用途,确保我们向您提供的产品和服务的安全性);

+ +

6、应用户特殊要求而提供特定服务时,需要将信息提供给我们的关联公司、第三方或其他用户;

+ +

7、其他有利于用户和智驾定位运营者利益且不违反任何强制性法律法规的情况。

+ + +

四、我们如何共享、转让、公开披露个人信息

+

(一)个人信息的共享、转让

+ +

+ 我们不会向第三方共享、转让您的个人信息,除非经过您本人事先授权同意,或者共享、转让的个人信息是去标识化处理后的信息,且共享第三方无法重新识别此类信息的自然人主体。

+ +

1.在下列情况下,我们可能会共享的个人信息 + +

(1)为实现特定功能而与业务合作伙伴共享 + +

+ 为保障智驾定位相关功能的实现与应用安全稳定的运行,我们可能会接入由第三方提供的软件开发包(SDK)实现相关目的。在使用第三方SDK前,我们将通过弹窗或单独协议明确告知其名称、目的及数据范围,并需您主动授权,若您拒绝授权,相关功能将无法正常使用。我们会对合作方获取信息的软件工具开发包(SDK)进行严格的安全监测,以保护数据安全。我们对接入的相关第三方SDK在本隐私政策中列出,请注意,第三方SDK可能因为其版本升级、策略调整原因导致数据处理类型存在一定变化,请以其公示的官方说明为准。

+ +

(二)个人信息的公开披露

+ +

+ 除对违规账号、欺诈行为进行处罚公告时,我们会披露相关账号的必要信息外,我们不会公开披露您的信息,除非遵循国家法律法规规定或者获得您的同意。我们公开披露您的个人信息会采用符合行业内标准的安全保护措施。

+ +

(三)依法豁免征得同意共享、转让、公开披露的个人信息

+ +

请您理解,在下列情形中,根据法律法规及国家标准,我们共享、转让、公开披露您的个人信息无需征得您的授权同意

+ +

(1)与国家安全、国防安全直接相关的;

+ +

(2)与公共安全、公共卫生、重大公共利益直接相关的;

+ +

(3)与犯罪侦查、起诉、审判和判决执行直接相关的;

+ +

(4)出于维护您或其他个人的生命、财产重大合法权益但又很难得到您的同意的;

+ +

(5)您自行向社会公众公开的个人信息;

+ +

(6)从合法公开披露的信息中收集个人信息的,包括合法的新闻报道、政府信息公开渠道。

+ +

五、我们如何保护用户信息

+

+ 1、我们将采取合理的技术措施和其它必要措施,以确保用户信息的安全,并努力防止用户信息泄露、丢失或遭受破坏。其中包括:(1)使用加密技术来确保您的数据在传输过程中保持私密性;(2)审查我们在收集、存储和处理信息方面的做法(包括实体安全措施),以防未经授权的人员访问我们的系统;(4)所有因提供服务而必须接触个人信息的智驾定位员工、承包商和代理商,都需要遵守合同中规定的严格保密义务,否则可将被处分或被解约。

+ +

+ 2、尽管严格遵守法律法规要求的标准并已经采取了上述合理有效措施,但由于技术的限制以及可能存在的各种恶意手段我们无法控制的原因,智驾定位我们将采取行业标准的安全措施保护您的信息,但因不可抗力或非我方过错导致的泄露,我们将在法律允许范围内及时补救并通知,我们将尽力确保您提供给我们的个人信息的安全性。因此,我们强烈建议您采取积极措施保护个人信息的安全,包括但不限于使用复杂密码、定期修改密码、不将自己的账号密码个人信息透露给他人。

+ +

+ 3.我们会制定应急处理预案,并在发生用户信息安全事件时立即应急预案,努力阻止该安全事件的影响和后果扩大。在不幸发生用户信息安全事件(泄露、丢失)后,我们将按照法律法规的要求,及时向您告知。同时,我们还将按照监管部门要求,上报个人信息安全事件的处置情况。

+ +

六、如何更新、变更、删除您的信息

+

+ 您在使用我们的产品和服务时,会被要求提供您真实的个人信息,您应当对您所提供信息的真实性、合法性、有效性及完整性负责,并及时更新和维护您的个人信息,以保证信息的真实、合法和有效。您可以随时管理您的个人信息,例如您的个人账户注册信息。您可以自行从智驾定位账号中删除您的内容或个人信息(若您之前已创建了会员账户),或要求我们删除或修改信息,例如您想要删除个人帐户,您可以通过“个人中心-设置-注销账户”进行操作,当您注销账号后,我们将依据《中国人民共和国网络安全法》的规定留存你的相关信息,超出法定保存期限后,我们将删除或匿名化处理你的个人信息。

+ +

七.Cookies及类似技术

+

+ 1、Cookies是用户访问网站时存放于用户的计算机设备中的小文件,可被用于存储与您的计算机或设备绑定的唯一识别码,以便用户在不同网站的不同浏览进程中被识别为同一个用户。Cookies提供了多种有用的功能,例如可以用来记忆用户的密码或记录用户已经注册过的项目,使用户在网站上的操作更加有效率。

+ +

+ 2、我们可能通过Cookies收集用户信息。用户拥有完全的自主权,自行设置浏览器以禁用或限用Cookies。但是,该设置可能导致用户无法登录或使用依赖于Cookie的智驾定位的某些服务或功能。

+ +

+ 3、我们还可能使用其他类似的技术,例如beacons、flashcookies和HTML5本地存储。这些技术与Cookies的相似之处在于他们均被存储于用户的设备中,并可用于存储与用户的行为和偏好有关的信息。用户拥有完全的自主权,自行设置以禁用或限用该技术。同样,该设置可能导致用户无法登录或使用智驾定位的某些服务或功能。

+ +

八、未成年人使用我们的服务

+

+ 我们建议若您是18周岁以下的未成年人,在使用我们的产品或服务前,应事先取得其父母或监护人的同意,并建议未成年人在提交的个人信息之前寻求父母或监护人的同意和指导。

+ +

九、本政策的适用范围

+

+ 本隐私政策适用于智驾定位及其关联公司提供的所有服务。但是不包括附有独立隐私政策的服务(如第三方提供的产品和服务)。请您注意,本隐私政策不适用于以下情况:

+ +

+ 1、通过我们的服务而接入的第三方服务(包括任何第三方网站)收集的信息(本隐私权政策不适用于第三方提供的产品和服务,例如在于智驾定位上由第三方提供的产品和服务,以及在我们的服务中链接到的其他网站,这些产品、服务或网站会有独立的隐私政策予以规范,请另行查阅相应的政策规定);

+ +

2、通过在我们服务中进行广告服务的其他公司或机构所收集的信息。

+ +

十、本政策的更新

+

+ 1.我们可能会不定期修改、更新本隐私政策,有关隐私政策的更新,我们会在智驾定位App中以通知公告形式发布,您可以访问智驾定位App查询最新版本的隐私政策。对于重大变更,我们会向您发出郑重通知(包括对于某些服务,我们会通过电子邮件发送通知,说明对隐私政策进行的更改)。

+ +

十一、如何联系我们

+

当您有任何疑问、意见或建议时,可以将您的问题发送至智驾定位account@batiao8.com或邮寄到如下地址【收件人:重庆敌无双网络科技有限公司 + 地址:重庆市高新区虎溪街道大学城南路22号2幢24-11(收)邮编:401120】我们将尽快审核所涉问题,并在验证您的用户身份后的十五天内予以回复。

+ + +




附件一:关于第三方SDK的说明

+

+ 我们所接入的第三方SDK可能会调用您的设备权限、获取您的相关信息,以便您在不同的手机设备或第三方平台上正常使用相应功能,我们将这些具有个人信息手机功能的第三方SDK的名称、提供商、所提供的功能/服务隐私政策链接、收集个人信息类型,按照实现功能/服务的类别划分说明如下:

+ + +

一、登录、分享类SDK

+ +

SDK名称:微信开放平台

+ +

开发者名称:腾讯科技(深圳)有限公司

+ +

隐私政策:https://www.tencent.com/zh-cn/privacy-policy.html

+ +

收集的个人信息类型、字段:(IMEI/Mac地址(网络设备硬件地址)/androidID/IDFA/OPENUDID/GUID、SIM卡IMSI信息)、地理位置信息、网络信息

+ + +

二、统计分析类SDK

+ +

SDK名称:友盟+

+ +

开发者名称:友盟同欣(北京)科技有限公司

+ +

用途目的:用于支持社会化分享、智能认证一键登录、反作弊服务

+ +

隐私政策:https://www.umeng.com/page/policy

+ + +

使用SDK名称: 友盟SDK

+ +

服务类型: 统计分析

+ +

收集个人信息类型:设备信息 (IMEI/Mac/AndroidD/IDFA/OPENUDID/GUID/SIM卡IMSI/ICCID)

+ +

隐私权政策: https://www.umeng.com/page/policy

+ + +

SDK名称:友盟+应用性能监控SDK

+ +

开发者名称:友盟同欣(北京)科技有限公司

+ +

用途目的:为用户提供APP(SDK)、网页(CNZZ)数据统计分析、校准报表数据准确性,提供基础反作弊服务

+ +

收集个人信息类型:WIFI列表、精确位置、WIFI的SSID、WIFI的BSSID、读取基站信息、读取当前位置、读取WIFI-BSSID、读取WIFI列表、获取设备IP、设备标识符(IMEI/Mac/android ID/IDFA/OPENUDID/GUID、 SIM 卡 IMSI 信息)地理位置(粗略定位)、应用使用频率、应用列表、网络状态、浏览记录、AndroidID、 IMEI、IMSI、设备 MAC 地址、SUPI、SUCI、软件安装列表、位置、联系人、通话记录、日历、 短信、本机电话号码、图片、音视频等

+ +

隐私政策:https://www.umeng.com/page/policy

+ + +

SDK名称:友盟+社会化分享SDK

+ +

开发者名称:友盟同欣(北京)科技有限公司

+ +

用途目的:为用户提供广告展现、广告归因、反作弊服务

+ +

收集个人信息类型:收集的个人信息类型、字段:设备标识信息(国际移动设备识别码(IMEI)、网络设备硬件地址(MAC))、粗略地理位置信息、网络信息(网络接入方式及类型)、设备应用列表等

+ +

隐私政策:https://www.umeng.com/page/policy

+ + +

三、支付类SDK

+ +

SDK名称:微信SDK

+ +

开发者名称:腾讯科技(深圳)有限公司

+ +

隐私政策:https://pay.weixin.qq.com/index.php/public/apply_sign/protocol_v2

+ +

使用场景:使用微信授权登录、完成微信支付、分享时

+ +

收集信息类型:设备信息、网络信息

+ +

使用目的:帮助用户在应用内使用微信支付,微信授权登录,帮助用户分享内容至微信

+ + +

SDK名称:支付宝支付SDK

+ +

开发者名称:阿里巴巴

+ +

隐私政策:https://render.alipay.com/p/c/k2cx0tg8

+ +

使用场景:使用使用支付宝支付时

+ +

信息获取:安卓(IMEI、IMSI、Android + ID、MAC地址、网络类型、运营商信息、WIFI状态/参数/列表、系统设置、系统属性、设备品牌、设备型号、操作系统、IP地址、网络权限、WIFI接入状态及WLAN热点信息);iOS(IMEI、IMSI、MAC地址、网络类型、设备型号、操作系统、IP地址、网络权限)

+ +

使用目的:支付、支付安全及风控

+ + +

SDK名称:APP支付客户端SDK

+ +

开发者名称:支付宝(杭州)信息技术有限公司

+ +

隐私政策:https://opendocs.alipay.com/open/54/01g6qm#%E6%94%AF%E4%BB%98%E5%AE%9D%20App%20%E6%94%AF%E4%BB%98%E5%AE%A2%E6%88%B7%E7%AB%AF%20SDK%20%E9%9A%90%E7%A7%81%E6%94%BF%E7%AD%96

+ +

使用场景:使用使用支付宝支付时

+ +

信息获取:安卓(IMEI、IMSI、Android + ID、MAC地址、网络类型、运营商信息、WIFI状态/参数/列表、系统设置、系统属性、设备品牌、设备型号、操作系统、IP地址、网络权限、WIFI接入状态及WLAN热点信息);iOS(IMEI、IMSI、MAC地址、网络类型、设备型号、操作系统、IP地址、网络权限)

+ +

使用目的:支付、支付安全及风控

+ + +

四、推送类SDK

+ +

SDK名称:个推SDK

+ +

开发者名称:每日互动股份有限公司

+ +

隐私政策:https://www.getui.com/privacy

+ +

使用场景:用于实现消息推送(或其他推送)功能

+ +

收集个人信息类型:设备信息:设备识别码(包含IMEI、IDFA、Android ID、AndroidID、MAC、OAID、Advertising ID、Serial + Number、IMSI、UAID、ICCID、IDFV、CAID、OpenUDID、GUID、GAID)将被用于生成唯一的用户标识,即GIUID。设备平台、设备厂商、设备品牌、设备型号及系统版本、设备序列号有助于我们帮助您标识不同的用户,并根据不同设备信息进行对应的适配,从而提供准确的产品服务,如应用于广告分发场景,分析不同用户的广告效果。

+

使用目的:

+

(1)设备信息:设备识别码(包含IMEI、IDFA、Android ID、AndroidID、MAC、OAID、Advertising ID、Serial + Number、IMSI、UAID、ICCID、IDFV、CAID)将被用于生成唯一的统计标识ID,即GCID,供系统内部使用,用做数据去重和不同维度数量统计;设备平台、设备厂商、设备品牌、设备型号及系统版本、设备序列号将用于多维度的统计计算。

+

+ (2)应用相关信息:包括但不限于应用列表、渠道、时间戳、页面唯一标识、用户打点事件。我们使用上述信息来提供多维的统计分析,实现包括可视化埋点、行业分析在内的统计功能。

+

+ (3)网络信息(WIFI列表、精确位置、WIFI的SSID、IP、WIFI的BSSID、DHCP)将用来和个推服务器建立连接。位置信息将用于调控区域推送,控制不同区域的链式启动策略,保障推送消息的有效触达。

+

+ (4)位置信息:推荐更符合您用户需要的推送内容,减少无用推送信息对您用户的打扰 +

+ +

SDK名称:华为推送 SDK

+ +

开发者名称:华为软件技术有限公司

+ +

+ 隐私政策:https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/sdk-data-security-0000001050042177

+ +

使用场景:消息推送

+ +

+ 收集个人信息类型:设备信息【包括:设备型号、设备名称、SIM卡序列号、设备唯一标识符(IMEI、IMSI、AndroidID、IDFA、OAID),以下同】、网络信息。

+ +

使用目的:用于华为手机的离线消息推送。

+ +

SDK名称:荣耀推送 SDK

+ +

开发者名称:荣耀终端有限公司

+ +

隐私政策:https://www.hihonor.com/cn/privacy/privacy-policy/

+ +

使用场景:用于荣耀手机的消息推送

+ +

收集个人信息类型:设备信息、网络信息。

+ +

使用目的:用于荣耀手机的离线消息推送。

+ + +

SDK名称:小米推送 SDK

+ +

开发者名称:北京小米移动软件有限公司

+ +

隐私政策:https://dev.mi.com/console/doc/detail?pId=1822

+ +

使用场景:消息推送

+ +

收集个人信息类型:设备标识符(如 Android ID、AndroidID、OAID、GAID)、设备信息。

+ +

使用目的:用于小米手机的离线消息推送。

+ + +

SDK名称:OPPO 推送 SDK

+ +

开发者名称:广东欢太科技有限公司

+ +

隐私政策:https://open.oppomobile.com/wiki/doc#id=10288

+ +

使用场景:消息推送

+ +

收集个人信息类型:设备标识符(如 IMEI、ICCID、IMSI、Android ID、AndroidID、GAID)、应用信息(如应用包名、版本号和运行状态)、网络信息(如 + IP 或域名连接结果,当前网络类型)。

+ +

使用目的:用于oppo手机的离线消息推送。

+ + +

SDK名称:vivo 推送 SDK

+ +

开发者名称:维沃移动通信有限公司

+ +

隐私政策:https://www.vivo.com.cn/about-vivo/privacy-policy

+ +

使用场景:消息推送

+ +

收集个人信息类型:设备信息

+ +

使用目的:用于vivo手机的消息推送。

+ + +

SDK名称:腾讯bugly SDK

+ +

开发者名称:深圳市腾讯计算机系统有限公司

+ +

包名信息:com.tencent.bugly

+ +

涉及个人信息:手机型号、手机品牌、Android系统版本、Android系统api级、厂商系统版本、cpu架构类型、设备是否root、磁盘空间占用大小、sdcard空间占用大小、内存空间占用大小、网络类型、应用当前正在运行的进程名和PID

+ +

使用目的:Bugly收集的信息是为了排查崩溃问题,帮助APP提升稳定性,为了更真实地为开发者还原Crash场景服务

+ +

bugly 隐私协议文档下载地址 :https://static.bugly.qq.com/bugly-sdk-privacy-statement.pdf

+ +

bugly隐私政策地址:https://privacy.qq.com/document/preview/fc748b3d96224fdb825ea79e132c1a56

+ + +

五、一键认证类SDK

+

SDK名称:联通账号认证SDK

+ +

开发者名称:中国联合网络通信有限公司

+ +

隐私政策:https://opencloud.wostore.cn/authz/resource/html/disclaimer.html?fromsdk=true

+ +

使用场景:一键认证

+ +

收集个人信息类型:网络类型、网络地址、运营商类型、本机手机号、手机设备类型、手机操作系统、硬件厂商

+ +

使用目的:为App提供风控和认证服务。

+ + +

SDK名称:电信(天翼)账号认证SDK

+ +

开发者名称:天翼数字生活科技有限公司

+ +

隐私政策:https://e.189.cn/sdk/agreement/detail.do?hidetop=true

+ +

使用场景:一键认证

+ +

+ 收集个人信息类型:网络IP地址、网络类型、注册手机号码、本机号码、国际移动用户标识码、应用进程信息、网络连接类型、网络状态信息、网络地址、运营商类型、手机设备类型、手机设备厂商、手机操作系统类型及版本

+ +

使用目的:为App提供风控和认证服务。

+ + +

SDK名称:移动账号认证SDK

+ +

开发者名称:中移互联网有限公司

+ +

隐私政策:https://wap.cmpassport.com/resources/html/contract.html

+ +

使用场景:一键认证

+ +

收集个人信息类型:网络类型、网络地址、运营商类型、本机号码信息、手机设备类型、手机操作系统、硬件厂商

+ +

使用目的:为App提供风控和认证服务。

+ +

五、其他SDK

+

SDK名称:高德地图 SDK

+ +

开发者名称:高德软件有限公司

+ +

隐私政策:https://lbs.amap.com/pages/privacy

+ +

收集个人信息类型:设备标识符(Android如IMEI、MEID、OAID、Serial、ICCID、Android + ID、AndroidID、IMSI,iOS如IDFV、IDFA)、MAC地址、IP地址、位置信息(如GPS、蓝牙和基站)、WLAN接入点(如SSID、BSSID)、WiFi列表、设备传感器信息、应用信息、设备信息

+ +

使用目的:帮助用户发布信息时定位位置

+ +

使用场景:用户使用定位相关功能时使用

+ +

收集方式:SDK采集

+ +

合作方官网链接:https://lbs.amap.com/

+ +

合作方隐私政策:https://lbs.amap.com/pages/privacy/

+ + + +

SDK名称:Crash SDK

+ +

开发者名称:广州市动景计算机科技有限公司

+ +

隐私政策:https://yueying-docs.effirst.com/privacy.html

+ +

收集个人信息类型:设备型号、操作系统版本、屏幕分辨率、设备唯一标识符(如 IMEI、UUID 等)

+ +

使用目的:捕获 Android 应用崩溃信息

+ +

使用场景:应用崩溃时生成报告

+ + +

SDK名称:QQ互联sdk(Android版本)

+ +

开发者名称:深圳市腾讯计算机系统有限公司

+ +

隐私政策:https://wiki.connect.qq.com/qq%e4%ba%92%e8%81%94sdk%e9%9a%90%e7%a7%81%e4%bf%9d%e6%8a%a4%e5%a3%b0%e6%98%8e

+ +

收集个人信息类型:设备型号、操作系统版本、屏幕分辨率、设备唯一标识符(如 IMEI、UUID 等)

+ +

使用目的:捕获 Android 应用崩溃信息

+ +

使用场景:应用崩溃时生成报告

+ + +

SDK名称:定位SDK

+ +

开发者名称:北京高德图强科技有限公司

+ +

隐私政策:https://lbs.amap.com/pages/privacy

+ +

使用目的:为最终用户提供定位功能及服务

+ +

使用场景:用户使用定位相关功能时使用

+ +

收集个人信息类型:设备标识符(Android如IMEI、MEID、OAID、Serial、ICCID、Android + ID、AndroidID、IMSI,iOS如IDFV、IDFA)、MAC地址、IP地址、位置信息(如GPS、蓝牙和基站)、WLAN接入点(如SSID、BSSID)、WiFi列表、设备传感器信息、应用信息、设备信息等

+ + +

SDK名称:微信OpenSDK Android

+ +

开发者名称:深圳市腾讯计算机系统有限公司

+ +

隐私政策:https://support.weixin.qq.com/cgi-bin/mmsupportacctnodeweb-bin/pages/RYiYJkLOrQwu0nb8

+ +

使用目的:用于支持微信登录、朋友圈分享

+ +

使用场景:用户使用微信登录、将位置通过朋友圈分享

+ +

收集个人信息类型:收集的个人信息类型、字段:设备标识信息(IMEI/Mac/android ID/IDFA/OPENUDID/GUID、SIM 卡 IMSI 信息)、地理位置信息、网络信息等

+ + + +

重庆做梦科技有限公司

+
+
+
+ + + + + + + diff --git a/html/share/dist/css/style.css b/html/share/dist/css/style.css new file mode 100644 index 0000000..d1af70f --- /dev/null +++ b/html/share/dist/css/style.css @@ -0,0 +1,3 @@ +html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:0.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace, monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace, monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:0.35em 0.75em 0.625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}body{background:#fff;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}hr{border:0;display:block;height:1px;background:#E4E8EE;margin-top:24px;margin-bottom:24px}ul,ol{margin-top:0;margin-bottom:24px;padding-left:24px}ul{list-style:disc}ol{list-style:decimal}li>ul,li>ol{margin-bottom:0}dl{margin-top:0;margin-bottom:24px}dt{font-weight:600}dd{margin-left:24px;margin-bottom:24px}img{height:auto;max-width:100%;vertical-align:middle}figure{margin:24px 0}figcaption{font-size:16px;line-height:24px;padding:8px 0}img,svg{display:block}table{border-collapse:collapse;margin-bottom:24px;width:100%}tr{border-bottom:1px solid #E4E8EE}th{text-align:left}th,td{padding:10px 16px}th:first-child,td:first-child{padding-left:0}th:last-child,td:last-child{padding-right:0}html{font-size:20px;line-height:30px}body{color:#6B7A90;font-size:1rem}body,button,input,select,textarea{font-family:"Heebo", sans-serif}a{color:#4234F8;text-decoration:none}a:hover,a:active{outline:0;text-decoration:underline}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{clear:both;color:#161E2A;font-family:"Oxygen", sans-serif;font-weight:600}h1,.h1{font-size:38px;line-height:48px;letter-spacing:0px}@media (min-width: 641px){h1,.h1{font-size:44px;line-height:54px;letter-spacing:0px}}h2,.h2{font-size:32px;line-height:42px;letter-spacing:0px}@media (min-width: 641px){h2,.h2{font-size:38px;line-height:48px;letter-spacing:0px}}h3,.h3,blockquote{font-size:28px;line-height:34px;letter-spacing:0px}@media (min-width: 641px){h3,.h3,blockquote{font-size:32px;line-height:42px;letter-spacing:0px}}h4,.h4{font-size:28px;line-height:34px;letter-spacing:0px}h5,.h5,h6,.h6{font-size:20px;line-height:30px;letter-spacing:-0.1px}@media (max-width: 640px){.h1-mobile{font-size:38px;line-height:48px;letter-spacing:0px}.h2-mobile{font-size:32px;line-height:42px;letter-spacing:0px}.h3-mobile{font-size:28px;line-height:34px;letter-spacing:0px}.h4-mobile{font-size:28px;line-height:34px;letter-spacing:0px}.h5-mobile,.h6-mobile{font-size:20px;line-height:30px;letter-spacing:-0.1px}}.text-light{color:#606483}.text-light a{color:#606483}.text-light h1,.text-light h2,.text-light h3,.text-light h4,.text-light h5,.text-light h6,.text-light .h1,.text-light .h2,.text-light .h3,.text-light .h4,.text-light .h5,.text-light .h6{color:#fff !important}.text-sm{font-size:18px;line-height:27px;letter-spacing:-0.1px}.text-xs{font-size:16px;line-height:24px;letter-spacing:-0.1px}h1,h2,.h1,.h2{margin-top:48px;margin-bottom:16px}h3,.h3{margin-top:36px;margin-bottom:12px}h4,h5,h6,.h4,.h5,.h6{margin-top:24px;margin-bottom:4px}p{margin-top:0;margin-bottom:24px}dfn,cite,em,i{font-style:italic}blockquote{color:#6B7A90;font-style:italic;margin-top:24px;margin-bottom:24px;margin-left:24px}blockquote::before{content:"\201C"}blockquote::after{content:"\201D"}blockquote p{display:inline}address{color:#6B7A90;border-width:1px 0;border-style:solid;border-color:#E4E8EE;padding:24px 0;margin:0 0 24px}pre,pre h1,pre h2,pre h3,pre h4,pre h5,pre h6,pre .h1,pre .h2,pre .h3,pre .h4,pre .h5,pre .h6{font-family:"Courier 10 Pitch", Courier, monospace}pre,code,kbd,tt,var{background:#F3F4FF}pre{font-size:16px;line-height:24px;margin-bottom:1.6em;max-width:100%;overflow:auto;padding:24px;margin-top:24px;margin-bottom:24px}code,kbd,tt,var{font-family:Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace;font-size:16px;padding:2px 4px}abbr,acronym{cursor:help}mark,ins{text-decoration:none}small{font-size:18px;line-height:27px;letter-spacing:-0.1px}b,strong{font-weight:600}button,input,select,textarea,label{font-size:20px;line-height:30px}.container,.container-sm{width:100%;margin:0 auto;padding-left:16px;padding-right:16px}@media (min-width: 481px){.container,.container-sm{padding-left:24px;padding-right:24px}}.container{max-width:1128px}.container-sm{max-width:848px}.container .container-sm{max-width:800px;padding-left:0;padding-right:0}.screen-reader-text{clip:rect(1px, 1px, 1px, 1px);position:absolute !important;height:1px;width:1px;overflow:hidden;word-wrap:normal !important}.screen-reader-text:focus{border-radius:2px;box-shadow:0 0 2px 2px rgba(0,0,0,0.6);clip:auto !important;display:block;font-size:14px;letter-spacing:0px;font-weight:600;line-height:16px;text-decoration:none;text-transform:uppercase;background-color:#fff;color:#4234F8 !important;border:none;height:auto;left:8px;padding:16px 40px;top:8px;width:auto;z-index:100000}.list-reset{list-style:none;padding:0}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-primary{color:#4234F8}.text-secondary{color:#FF6C50}.has-top-divider{position:relative}.has-top-divider::before{content:'';position:absolute;top:0;left:0;width:100%;display:block;height:1px;background:#E4E8EE}.has-bottom-divider{position:relative}.has-bottom-divider::after{content:'';position:absolute;bottom:0;left:0;width:100%;display:block;height:1px;background:#E4E8EE}.m-0{margin:0}.mt-0{margin-top:0}.mr-0{margin-right:0}.mb-0{margin-bottom:0}.ml-0{margin-left:0}.m-8{margin:8px}.mt-8{margin-top:8px}.mr-8{margin-right:8px}.mb-8{margin-bottom:8px}.ml-8{margin-left:8px}.m-16{margin:16px}.mt-16{margin-top:16px}.mr-16{margin-right:16px}.mb-16{margin-bottom:16px}.ml-16{margin-left:16px}.m-24{margin:24px}.mt-24{margin-top:24px}.mr-24{margin-right:24px}.mb-24{margin-bottom:24px}.ml-24{margin-left:24px}.m-32{margin:32px}.mt-32{margin-top:32px}.mr-32{margin-right:32px}.mb-32{margin-bottom:32px}.ml-32{margin-left:32px}.m-40{margin:40px}.mt-40{margin-top:40px}.mr-40{margin-right:40px}.mb-40{margin-bottom:40px}.ml-40{margin-left:40px}.m-48{margin:48px}.mt-48{margin-top:48px}.mr-48{margin-right:48px}.mb-48{margin-bottom:48px}.ml-48{margin-left:48px}.m-56{margin:56px}.mt-56{margin-top:56px}.mr-56{margin-right:56px}.mb-56{margin-bottom:56px}.ml-56{margin-left:56px}.m-64{margin:64px}.mt-64{margin-top:64px}.mr-64{margin-right:64px}.mb-64{margin-bottom:64px}.ml-64{margin-left:64px}.p-0{padding:0}.pt-0{padding-top:0}.pr-0{padding-right:0}.pb-0{padding-bottom:0}.pl-0{padding-left:0}.p-8{padding:8px}.pt-8{padding-top:8px}.pr-8{padding-right:8px}.pb-8{padding-bottom:8px}.pl-8{padding-left:8px}.p-16{padding:16px}.pt-16{padding-top:16px}.pr-16{padding-right:16px}.pb-16{padding-bottom:16px}.pl-16{padding-left:16px}.p-24{padding:24px}.pt-24{padding-top:24px}.pr-24{padding-right:24px}.pb-24{padding-bottom:24px}.pl-24{padding-left:24px}.p-32{padding:32px}.pt-32{padding-top:32px}.pr-32{padding-right:32px}.pb-32{padding-bottom:32px}.pl-32{padding-left:32px}.p-40{padding:40px}.pt-40{padding-top:40px}.pr-40{padding-right:40px}.pb-40{padding-bottom:40px}.pl-40{padding-left:40px}.p-48{padding:48px}.pt-48{padding-top:48px}.pr-48{padding-right:48px}.pb-48{padding-bottom:48px}.pl-48{padding-left:48px}.p-56{padding:56px}.pt-56{padding-top:56px}.pr-56{padding-right:56px}.pb-56{padding-bottom:56px}.pl-56{padding-left:56px}.p-64{padding:64px}.pt-64{padding-top:64px}.pr-64{padding-right:64px}.pb-64{padding-bottom:64px}.pl-64{padding-left:64px}.sr .has-animations .is-revealing{visibility:hidden}.button{display:inline-flex;font-size:14px;letter-spacing:0px;font-weight:700;line-height:16px;text-decoration:none !important;text-transform:uppercase;background-color:#fff;background:#fff;color:#4234F8 !important;border:none;border-radius:2px;cursor:pointer;justify-content:center;padding:16px 40px;height:48px;text-align:center;white-space:nowrap}.button:active{outline:0}.button::before{border-radius:2px}.button-shadow{position:relative}.button-shadow::before{content:'';position:absolute;top:0;right:0;bottom:0;left:0;box-shadow:0 8px 16px rgba(22,30,42,0.12);mix-blend-mode:multiply;transition:box-shadow .15s ease}.button-shadow:hover::before{box-shadow:0 8px 16px rgba(22,30,42,0.16)}.button-sm{padding:8px 24px;height:32px}.button-sm.button-shadow::before{box-shadow:0 4px 16px rgba(22,30,42,0.12)}.button-sm.button-shadow:hover::before{box-shadow:0 4px 16px rgba(22,30,42,0.16)}.button-primary,.button-secondary{color:#fff !important;transition:background .15s ease}.button-primary{background:#4234F8}.button-primary:hover{background:#4b3ef8}.button-primary.button-shadow::before{box-shadow:0 8px 16px rgba(66,52,248,0.24)}.button-primary.button-shadow:hover::before{box-shadow:0 8px 16px rgba(66,52,248,0.32)}.button-primary .button-sm.button-shadow::before{box-shadow:0 4px 16px rgba(66,52,248,0.24)}.button-primary .button-sm.button-shadow:hover::before{box-shadow:0 4px 16px rgba(66,52,248,0.32)}.button-secondary{background:#FF6C50}.button-secondary:hover{background:#ff795f}.button-secondary.button-shadow::before{box-shadow:0 8px 16px rgba(255,108,80,0.24)}.button-secondary.button-shadow:hover::before{box-shadow:0 8px 16px rgba(255,108,80,0.32)}.button-secondary .button-sm.button-shadow::before{box-shadow:0 4px 16px rgba(255,108,80,0.24)}.button-secondary .button-sm.button-shadow:hover::before{box-shadow:0 4px 16px rgba(255,108,80,0.32)}.button-block{display:flex;width:100%}@media (max-width: 640px){.button-wide-mobile{width:100%;max-width:280px}}.site-header{padding:24px 0;position:absolute;top:0;left:0;width:100%;z-index:1}.site-header-inner{position:relative;display:flex;justify-content:space-between;align-items:center}.header-links{display:inline-flex}.header-links li{display:inline-flex}.header-links a:not(.button){font-size:16px;line-height:24px;letter-spacing:-0.1px;font-weight:600;color:#606483;text-transform:uppercase;text-decoration:none;line-height:16px;padding:8px 24px}.header-links a:not(.button):hover,.header-links a:not(.button):active{color:#fff}.hero{position:relative;padding-top:128px;padding-bottom:88px;z-index:0}.hero .hero-bg{position:absolute;top:0;bottom:42%;left:0;right:0;background:#0B0D19;z-index:-2}.hero .hero-particles-container{position:absolute;top:0;bottom:42%;left:0;right:0}.hero::before,.hero::after{content:'';position:absolute;left:calc(50% - 360px);width:720px;background-repeat:no-repeat}.hero::before{top:0;height:159px;background-image:url("../images/hero-bg-top.svg");background-size:720px 159px}.hero::after{bottom:42%;height:173px;background-image:url("../images/hero-bg-bottom.svg");background-size:720px 173px}.hero-inner{position:relative;z-index:1}.hero-copy{position:relative;margin-bottom:48px}@media (min-width: 641px){.hero{padding-top:160px;padding-bottom:128px}.hero::before,.hero::after{left:calc(50% - 720px);width:1440px}.hero::before{height:318px;background-size:1440px 318px}.hero::after{height:347px;background-size:1440px 347px}.hero-copy{margin-bottom:88px}.hero-paragraph{padding-left:72px;padding-right:72px}}.has-animations .hero .hero-bg,.has-animations .hero::before,.has-animations .hero::after,.has-animations .hero-particles-container,.has-animations .site-header,.has-animations .hero-title,.has-animations .hero-paragraph,.has-animations .hero-cta,.has-animations .hero .mockup-bg,.has-animations .hero .device-mockup{opacity:0}.has-animations.is-loaded .hero .hero-bg{animation:heroBg 0.6s cubic-bezier(0.215, 0.61, 0.355, 1) forwards}.has-animations.is-loaded .hero::before,.has-animations.is-loaded .hero::after{animation:heroFadeIn .6s ease forwards .45s}.has-animations.is-loaded .site-header,.has-animations.is-loaded .hero-particles-container,.has-animations.is-loaded .hero .mockup-bg{animation:heroFadeIn .6s ease forwards .45s}.has-animations.is-loaded .hero-title{animation:heroContent 0.6s cubic-bezier(0.215, 0.61, 0.355, 1) forwards 0.15s}.has-animations.is-loaded .hero-paragraph{animation:heroContent 0.6s cubic-bezier(0.215, 0.61, 0.355, 1) forwards 0.3s}.has-animations.is-loaded .hero-cta{animation:heroContent 0.6s cubic-bezier(0.215, 0.61, 0.355, 1) forwards 0.45s}.has-animations.is-loaded .hero .device-mockup{animation:heroMockup .6s ease forwards .6s}@keyframes heroBg{from{transform:scaleY(0) scaleX(1.2) skewY(30deg);opacity:1}to{transform:scaleY(1) scaleX(1) skewY(0);opacity:1}}@keyframes heroContent{from{transform:translateY(40px) skewY(2deg);opacity:0}to{transform:translateY(0) skewY(0);opacity:1}}@keyframes heroMockup{from{transform:translateY(80px);opacity:0}to{transform:translateY(0);opacity:1}}@keyframes heroFadeIn{from{opacity:0}to{opacity:1}}.mockup-container{position:relative}.mockup-bg{pointer-events:none}.mockup-bg img,.mockup-bg svg{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);width:auto !important;height:auto;max-width:300% !important}.device-mockup{position:relative;width:350px;height:auto;margin:0 auto;z-index:1}.has-animations .features-extended{opacity:0}.has-animations.is-loaded .features-extended{opacity:1}.features-extended-header{margin-bottom:32px}.features-extended-wrap{display:flex;flex-wrap:wrap;margin-top:-24px}.features-extended-wrap:last-of-type{margin-bottom:-24px}.features-extended-wrap:not(:last-of-type){margin-bottom:24px}.feature-extended{padding:24px 0}.feature-extended-image{position:relative;margin-bottom:32px}.feature-extended-image img,.feature-extended-image svg{width:100%;max-width:296px;height:auto;margin-left:auto;margin-right:auto;overflow:visible}.feature-extended-body{text-align:center}@media (min-width: 641px){.features-extended .container{max-width:912px}.features-extended .section-inner{padding-bottom:128px}.features-extended .section-paragraph{padding-left:72px;padding-right:72px;margin-bottom:0}.features-extended-header{margin-bottom:80px}.features-extended-wrap{margin-top:-64px}.features-extended-wrap:last-of-type{margin-bottom:-64px}.features-extended-wrap:not(:last-of-type){margin-bottom:64px}.feature-extended{display:flex;flex-wrap:nowrap;align-items:stretch;justify-content:flex-end;padding:64px 0}.feature-extended .feature-extended-image{width:440px;margin-right:96px;margin-bottom:0}.feature-extended .feature-extended-image img,.feature-extended .feature-extended-image svg{width:auto}.feature-extended .feature-extended-image img.device-mockup,.feature-extended .feature-extended-image svg.device-mockup{max-width:296px}.feature-extended:nth-child(even){justify-content:flex-start}.feature-extended:nth-child(even) .feature-extended-image{order:1;margin-left:96px;margin-right:0}.feature-extended-body{display:flex;flex-direction:column;justify-content:center;flex-shrink:0;width:360px;text-align:left}}@media (min-width: 1025px){.features-extended .container{max-width:944px}.feature-extended .feature-extended-image{margin-right:64px}.feature-extended:nth-child(even) .feature-extended-image{margin-left:64px}.feature-extended-body{width:392px}}.cta .section-paragraph{margin-bottom:32px}@media (min-width: 641px){.cta .section-paragraph{margin-bottom:32px;padding-left:72px;padding-right:72px}}.is-boxed{background:#fff}.body-wrap{background:#fff;overflow:hidden;display:flex;flex-direction:column;min-height:100vh}.boxed-container{max-width:1440px;margin:0 auto;box-shadow:0 20px 48px rgba(22,30,42,0.16)}main{flex:1 0 auto}.section-inner{position:relative;padding-top:48px;padding-bottom:48px}@media (min-width: 641px){.section-inner{padding-top:88px;padding-bottom:88px}}.site-footer{position:relative;background:#0B0D19}.site-footer::before{content:'';position:absolute;top:-76px;left:calc(50% - 360px);width:720px;height:291px;background-image:url("../images/footer-bg.svg");background-size:720px 291px;background-repeat:no-repeat}.site-footer .footer-particles-container{position:absolute;top:0;bottom:0;left:0;right:0}.site-footer-bottom{font-size:14px;line-height:22px;letter-spacing:0px;z-index:1}.site-footer-bottom a{color:#606483;text-decoration:none}.site-footer-bottom a:hover,.site-footer-bottom a:active{text-decoration:underline}.site-footer-inner{position:relative;display:flex;flex-wrap:wrap;padding-top:48px;padding-bottom:48px;position:relative}.site-footer-inner::before{content:'';position:absolute;top:0;left:0;width:100%;display:block;height:1px;background:#1E233D}.footer-brand,.footer-links,.footer-social-links,.footer-copyright{flex:none;width:100%;display:inline-flex;justify-content:center}.footer-brand,.footer-links,.footer-social-links{margin-bottom:24px}.footer-links li+li,.footer-social-links li+li{margin-left:16px}.footer-social-links li{display:inline-flex}.footer-social-links li a{padding:8px}@media (min-width: 641px){.site-footer::before{top:-152px;left:calc(50% - 720px);width:1440px;height:582px;background-size:1440px 582px}.site-footer-inner{justify-content:space-between;padding-top:64px;padding-bottom:64px}.footer-brand,.footer-links,.footer-social-links,.footer-copyright{flex:50%}.footer-brand,.footer-copyright{justify-content:flex-start}.footer-links,.footer-social-links{justify-content:flex-end}.footer-links{order:1;margin-bottom:0}} + +/*# sourceMappingURL=data:application/json;base64,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LGlCQUFpQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsbUVBQW1FLFNBQVMsQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsc0JBQXNCLENBQUMsaURBQWlELGtCQUFrQixDQUFDLCtDQUErQyxnQkFBZ0IsQ0FBQyx3QkFBd0IsbUJBQW1CLENBQUMsMEJBQTBCLFdBQVcsQ0FBQywwQkFBMEIscUJBQXFCLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLDRCQUE0QixDQUFDLG1CQUFtQiw2QkFBNkIsQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxtRUFBbUUsUUFBUSxDQUFDLGdDQUFnQywwQkFBMEIsQ0FBQyxtQ0FBbUMsd0JBQXdCLENBQUMsY0FBYyxPQUFPLENBQUMsZUFBZSxDQUFDIiwiZmlsZSI6InN0eWxlLmNzcyIsInNvdXJjZXNDb250ZW50IjpbImh0bWx7bGluZS1oZWlnaHQ6MS4xNTstbXMtdGV4dC1zaXplLWFkanVzdDoxMDAlOy13ZWJraXQtdGV4dC1zaXplLWFkanVzdDoxMDAlfWJvZHl7bWFyZ2luOjB9YXJ0aWNsZSxhc2lkZSxmb290ZXIsaGVhZGVyLG5hdixzZWN0aW9ue2Rpc3BsYXk6YmxvY2t9aDF7Zm9udC1zaXplOjJlbTttYXJnaW46MC42N2VtIDB9ZmlnY2FwdGlvbixmaWd1cmUsbWFpbntkaXNwbGF5OmJsb2NrfWZpZ3VyZXttYXJnaW46MWVtIDQwcHh9aHJ7Ym94LXNpemluZzpjb250ZW50LWJveDtoZWlnaHQ6MDtvdmVyZmxvdzp2aXNpYmxlfXByZXtmb250LWZhbWlseTptb25vc3BhY2UsIG1vbm9zcGFjZTtmb250LXNpemU6MWVtfWF7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDstd2Via2l0LXRleHQtZGVjb3JhdGlvbi1za2lwOm9iamVjdHN9YWJiclt0aXRsZV17Ym9yZGVyLWJvdHRvbTpub25lO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSBkb3R0ZWR9YixzdHJvbmd7Zm9udC13ZWlnaHQ6aW5oZXJpdH1iLHN0cm9uZ3tmb250LXdlaWdodDpib2xkZXJ9Y29kZSxrYmQsc2FtcHtmb250LWZhbWlseTptb25vc3BhY2UsIG1vbm9zcGFjZTtmb250LXNpemU6MWVtfWRmbntmb250LXN0eWxlOml0YWxpY31tYXJre2JhY2tncm91bmQtY29sb3I6I2ZmMDtjb2xvcjojMDAwfXNtYWxse2ZvbnQtc2l6ZTo4MCV9c3ViLHN1cHtmb250LXNpemU6NzUlO2xpbmUtaGVpZ2h0OjA7cG9zaXRpb246cmVsYXRpdmU7dmVydGljYWwtYWxpZ246YmFzZWxpbmV9c3Vie2JvdHRvbTotMC4yNWVtfXN1cHt0b3A6LTAuNWVtfWF1ZGlvLHZpZGVve2Rpc3BsYXk6aW5saW5lLWJsb2NrfWF1ZGlvOm5vdChbY29udHJvbHNdKXtkaXNwbGF5Om5vbmU7aGVpZ2h0OjB9aW1ne2JvcmRlci1zdHlsZTpub25lfXN2Zzpub3QoOnJvb3Qpe292ZXJmbG93OmhpZGRlbn1idXR0b24saW5wdXQsb3B0Z3JvdXAsc2VsZWN0LHRleHRhcmVhe2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7Zm9udC1zaXplOjEwMCU7bGluZS1oZWlnaHQ6MS4xNTttYXJnaW46MH1idXR0b24saW5wdXR7b3ZlcmZsb3c6dmlzaWJsZX1idXR0b24sc2VsZWN0e3RleHQtdHJhbnNmb3JtOm5vbmV9YnV0dG9uLGh0bWwgW3R5cGU9XCJidXR0b25cIl0sW3R5cGU9XCJyZXNldFwiXSxbdHlwZT1cInN1Ym1pdFwiXXstd2Via2l0LWFwcGVhcmFuY2U6YnV0dG9ufWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcixbdHlwZT1cImJ1dHRvblwiXTo6LW1vei1mb2N1cy1pbm5lcixbdHlwZT1cInJlc2V0XCJdOjotbW96LWZvY3VzLWlubmVyLFt0eXBlPVwic3VibWl0XCJdOjotbW96LWZvY3VzLWlubmVye2JvcmRlci1zdHlsZTpub25lO3BhZGRpbmc6MH1idXR0b246LW1vei1mb2N1c3JpbmcsW3R5cGU9XCJidXR0b25cIl06LW1vei1mb2N1c3JpbmcsW3R5cGU9XCJyZXNldFwiXTotbW96LWZvY3VzcmluZyxbdHlwZT1cInN1Ym1pdFwiXTotbW96LWZvY3VzcmluZ3tvdXRsaW5lOjFweCBkb3R0ZWQgQnV0dG9uVGV4dH1maWVsZHNldHtwYWRkaW5nOjAuMzVlbSAwLjc1ZW0gMC42MjVlbX1sZWdlbmR7Ym94LXNpemluZzpib3JkZXItYm94O2NvbG9yOmluaGVyaXQ7ZGlzcGxheTp0YWJsZTttYXgtd2lkdGg6MTAwJTtwYWRkaW5nOjA7d2hpdGUtc3BhY2U6bm9ybWFsfXByb2dyZXNze2Rpc3BsYXk6aW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lfXRleHRhcmVhe292ZXJmbG93OmF1dG99W3R5cGU9XCJjaGVja2JveFwiXSxbdHlwZT1cInJhZGlvXCJde2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjB9W3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sW3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b257aGVpZ2h0OmF1dG99W3R5cGU9XCJzZWFyY2hcIl17LXdlYmtpdC1hcHBlYXJhbmNlOnRleHRmaWVsZDtvdXRsaW5lLW9mZnNldDotMnB4fVt0eXBlPVwic2VhcmNoXCJdOjotd2Via2l0LXNlYXJjaC1jYW5jZWwtYnV0dG9uLFt0eXBlPVwic2VhcmNoXCJdOjotd2Via2l0LXNlYXJjaC1kZWNvcmF0aW9uey13ZWJraXQtYXBwZWFyYW5jZTpub25lfTo6LXdlYmtpdC1maWxlLXVwbG9hZC1idXR0b257LXdlYmtpdC1hcHBlYXJhbmNlOmJ1dHRvbjtmb250OmluaGVyaXR9ZGV0YWlscyxtZW51e2Rpc3BsYXk6YmxvY2t9c3VtbWFyeXtkaXNwbGF5Omxpc3QtaXRlbX1jYW52YXN7ZGlzcGxheTppbmxpbmUtYmxvY2t9dGVtcGxhdGV7ZGlzcGxheTpub25lfVtoaWRkZW5de2Rpc3BsYXk6bm9uZX1odG1se2JveC1zaXppbmc6Ym9yZGVyLWJveH0qLCo6YmVmb3JlLCo6YWZ0ZXJ7Ym94LXNpemluZzppbmhlcml0fWJvZHl7YmFja2dyb3VuZDojZmZmOy1tb3otb3N4LWZvbnQtc21vb3RoaW5nOmdyYXlzY2FsZTstd2Via2l0LWZvbnQtc21vb3RoaW5nOmFudGlhbGlhc2VkfWhye2JvcmRlcjowO2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjFweDtiYWNrZ3JvdW5kOiNFNEU4RUU7bWFyZ2luLXRvcDoyNHB4O21hcmdpbi1ib3R0b206MjRweH11bCxvbHttYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbToyNHB4O3BhZGRpbmctbGVmdDoyNHB4fXVse2xpc3Qtc3R5bGU6ZGlzY31vbHtsaXN0LXN0eWxlOmRlY2ltYWx9bGk+dWwsbGk+b2x7bWFyZ2luLWJvdHRvbTowfWRse21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjI0cHh9ZHR7Zm9udC13ZWlnaHQ6NjAwfWRke21hcmdpbi1sZWZ0OjI0cHg7bWFyZ2luLWJvdHRvbToyNHB4fWltZ3toZWlnaHQ6YXV0bzttYXgtd2lkdGg6MTAwJTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9ZmlndXJle21hcmdpbjoyNHB4IDB9ZmlnY2FwdGlvbntmb250LXNpemU6MTZweDtsaW5lLWhlaWdodDoyNHB4O3BhZGRpbmc6OHB4IDB9aW1nLHN2Z3tkaXNwbGF5OmJsb2NrfXRhYmxle2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTttYXJnaW4tYm90dG9tOjI0cHg7d2lkdGg6MTAwJX10cntib3JkZXItYm90dG9tOjFweCBzb2xpZCAjRTRFOEVFfXRoe3RleHQtYWxpZ246bGVmdH10aCx0ZHtwYWRkaW5nOjEwcHggMTZweH10aDpmaXJzdC1jaGlsZCx0ZDpmaXJzdC1jaGlsZHtwYWRkaW5nLWxlZnQ6MH10aDpsYXN0LWNoaWxkLHRkOmxhc3QtY2hpbGR7cGFkZGluZy1yaWdodDowfWh0bWx7Zm9udC1zaXplOjIwcHg7bGluZS1oZWlnaHQ6MzBweH1ib2R5e2NvbG9yOiM2QjdBOTA7Zm9udC1zaXplOjFyZW19Ym9keSxidXR0b24saW5wdXQsc2VsZWN0LHRleHRhcmVhe2ZvbnQtZmFtaWx5OlwiSGVlYm9cIiwgc2Fucy1zZXJpZn1he2NvbG9yOiM0MjM0Rjg7dGV4dC1kZWNvcmF0aW9uOm5vbmV9YTpob3ZlcixhOmFjdGl2ZXtvdXRsaW5lOjA7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX1oMSxoMixoMyxoNCxoNSxoNiwuaDEsLmgyLC5oMywuaDQsLmg1LC5oNntjbGVhcjpib3RoO2NvbG9yOiMxNjFFMkE7Zm9udC1mYW1pbHk6XCJPeHlnZW5cIiwgc2Fucy1zZXJpZjtmb250LXdlaWdodDo2MDB9aDEsLmgxe2ZvbnQtc2l6ZTozOHB4O2xpbmUtaGVpZ2h0OjQ4cHg7bGV0dGVyLXNwYWNpbmc6MHB4fUBtZWRpYSAobWluLXdpZHRoOiA2NDFweCl7aDEsLmgxe2ZvbnQtc2l6ZTo0NHB4O2xpbmUtaGVpZ2h0OjU0cHg7bGV0dGVyLXNwYWNpbmc6MHB4fX1oMiwuaDJ7Zm9udC1zaXplOjMycHg7bGluZS1oZWlnaHQ6NDJweDtsZXR0ZXItc3BhY2luZzowcHh9QG1lZGlhIChtaW4td2lkdGg6IDY0MXB4KXtoMiwuaDJ7Zm9udC1zaXplOjM4cHg7bGluZS1oZWlnaHQ6NDhweDtsZXR0ZXItc3BhY2luZzowcHh9fWgzLC5oMyxibG9ja3F1b3Rle2ZvbnQtc2l6ZToyOHB4O2xpbmUtaGVpZ2h0OjM0cHg7bGV0dGVyLXNwYWNpbmc6MHB4fUBtZWRpYSAobWluLXdpZHRoOiA2NDFweCl7aDMsLmgzLGJsb2NrcXVvdGV7Zm9udC1zaXplOjMycHg7bGluZS1oZWlnaHQ6NDJweDtsZXR0ZXItc3BhY2luZzowcHh9fWg0LC5oNHtmb250LXNpemU6MjhweDtsaW5lLWhlaWdodDozNHB4O2xldHRlci1zcGFjaW5nOjBweH1oNSwuaDUsaDYsLmg2e2ZvbnQtc2l6ZToyMHB4O2xpbmUtaGVpZ2h0OjMwcHg7bGV0dGVyLXNwYWNpbmc6LTAuMXB4fUBtZWRpYSAobWF4LXdpZHRoOiA2NDBweCl7LmgxLW1vYmlsZXtmb250LXNpemU6MzhweDtsaW5lLWhlaWdodDo0OHB4O2xldHRlci1zcGFjaW5nOjBweH0uaDItbW9iaWxle2ZvbnQtc2l6ZTozMnB4O2xpbmUtaGVpZ2h0OjQycHg7bGV0dGVyLXNwYWNpbmc6MHB4fS5oMy1tb2JpbGV7Zm9udC1zaXplOjI4cHg7bGluZS1oZWlnaHQ6MzRweDtsZXR0ZXItc3BhY2luZzowcHh9Lmg0LW1vYmlsZXtmb250LXNpemU6MjhweDtsaW5lLWhlaWdodDozNHB4O2xldHRlci1zcGFjaW5nOjBweH0uaDUtbW9iaWxlLC5oNi1tb2JpbGV7Zm9udC1zaXplOjIwcHg7bGluZS1oZWlnaHQ6MzBweDtsZXR0ZXItc3BhY2luZzotMC4xcHh9fS50ZXh0LWxpZ2h0e2NvbG9yOiM2MDY0ODN9LnRleHQtbGlnaHQgYXtjb2xvcjojNjA2NDgzfS50ZXh0LWxpZ2h0IGgxLC50ZXh0LWxpZ2h0IGgyLC50ZXh0LWxpZ2h0IGgzLC50ZXh0LWxpZ2h0IGg0LC50ZXh0LWxpZ2h0IGg1LC50ZXh0LWxpZ2h0IGg2LC50ZXh0LWxpZ2h0IC5oMSwudGV4dC1saWdodCAuaDIsLnRleHQtbGlnaHQgLmgzLC50ZXh0LWxpZ2h0IC5oNCwudGV4dC1saWdodCAuaDUsLnRleHQtbGlnaHQgLmg2e2NvbG9yOiNmZmYgIWltcG9ydGFudH0udGV4dC1zbXtmb250LXNpemU6MThweDtsaW5lLWhlaWdodDoyN3B4O2xldHRlci1zcGFjaW5nOi0wLjFweH0udGV4dC14c3tmb250LXNpemU6MTZweDtsaW5lLWhlaWdodDoyNHB4O2xldHRlci1zcGFjaW5nOi0wLjFweH1oMSxoMiwuaDEsLmgye21hcmdpbi10b3A6NDhweDttYXJnaW4tYm90dG9tOjE2cHh9aDMsLmgze21hcmdpbi10b3A6MzZweDttYXJnaW4tYm90dG9tOjEycHh9aDQsaDUsaDYsLmg0LC5oNSwuaDZ7bWFyZ2luLXRvcDoyNHB4O21hcmdpbi1ib3R0b206NHB4fXB7bWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MjRweH1kZm4sY2l0ZSxlbSxpe2ZvbnQtc3R5bGU6aXRhbGljfWJsb2NrcXVvdGV7Y29sb3I6IzZCN0E5MDtmb250LXN0eWxlOml0YWxpYzttYXJnaW4tdG9wOjI0cHg7bWFyZ2luLWJvdHRvbToyNHB4O21hcmdpbi1sZWZ0OjI0cHh9YmxvY2txdW90ZTo6YmVmb3Jle2NvbnRlbnQ6XCJcXDIwMUNcIn1ibG9ja3F1b3RlOjphZnRlcntjb250ZW50OlwiXFwyMDFEXCJ9YmxvY2txdW90ZSBwe2Rpc3BsYXk6aW5saW5lfWFkZHJlc3N7Y29sb3I6IzZCN0E5MDtib3JkZXItd2lkdGg6MXB4IDA7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci1jb2xvcjojRTRFOEVFO3BhZGRpbmc6MjRweCAwO21hcmdpbjowIDAgMjRweH1wcmUscHJlIGgxLHByZSBoMixwcmUgaDMscHJlIGg0LHByZSBoNSxwcmUgaDYscHJlIC5oMSxwcmUgLmgyLHByZSAuaDMscHJlIC5oNCxwcmUgLmg1LHByZSAuaDZ7Zm9udC1mYW1pbHk6XCJDb3VyaWVyIDEwIFBpdGNoXCIsIENvdXJpZXIsIG1vbm9zcGFjZX1wcmUsY29kZSxrYmQsdHQsdmFye2JhY2tncm91bmQ6I0YzRjRGRn1wcmV7Zm9udC1zaXplOjE2cHg7bGluZS1oZWlnaHQ6MjRweDttYXJnaW4tYm90dG9tOjEuNmVtO21heC13aWR0aDoxMDAlO292ZXJmbG93OmF1dG87cGFkZGluZzoyNHB4O21hcmdpbi10b3A6MjRweDttYXJnaW4tYm90dG9tOjI0cHh9Y29kZSxrYmQsdHQsdmFye2ZvbnQtZmFtaWx5Ok1vbmFjbywgQ29uc29sYXMsIFwiQW5kYWxlIE1vbm9cIiwgXCJEZWphVnUgU2FucyBNb25vXCIsIG1vbm9zcGFjZTtmb250LXNpemU6MTZweDtwYWRkaW5nOjJweCA0cHh9YWJicixhY3Jvbnlte2N1cnNvcjpoZWxwfW1hcmssaW5ze3RleHQtZGVjb3JhdGlvbjpub25lfXNtYWxse2ZvbnQtc2l6ZToxOHB4O2xpbmUtaGVpZ2h0OjI3cHg7bGV0dGVyLXNwYWNpbmc6LTAuMXB4fWIsc3Ryb25ne2ZvbnQtd2VpZ2h0OjYwMH1idXR0b24saW5wdXQsc2VsZWN0LHRleHRhcmVhLGxhYmVse2ZvbnQtc2l6ZToyMHB4O2xpbmUtaGVpZ2h0OjMwcHh9LmNvbnRhaW5lciwuY29udGFpbmVyLXNte3dpZHRoOjEwMCU7bWFyZ2luOjAgYXV0bztwYWRkaW5nLWxlZnQ6MTZweDtwYWRkaW5nLXJpZ2h0OjE2cHh9QG1lZGlhIChtaW4td2lkdGg6IDQ4MXB4KXsuY29udGFpbmVyLC5jb250YWluZXItc217cGFkZGluZy1sZWZ0OjI0cHg7cGFkZGluZy1yaWdodDoyNHB4fX0uY29udGFpbmVye21heC13aWR0aDoxMTI4cHh9LmNvbnRhaW5lci1zbXttYXgtd2lkdGg6ODQ4cHh9LmNvbnRhaW5lciAuY29udGFpbmVyLXNte21heC13aWR0aDo4MDBweDtwYWRkaW5nLWxlZnQ6MDtwYWRkaW5nLXJpZ2h0OjB9LnNjcmVlbi1yZWFkZXItdGV4dHtjbGlwOnJlY3QoMXB4LCAxcHgsIDFweCwgMXB4KTtwb3NpdGlvbjphYnNvbHV0ZSAhaW1wb3J0YW50O2hlaWdodDoxcHg7d2lkdGg6MXB4O292ZXJmbG93OmhpZGRlbjt3b3JkLXdyYXA6bm9ybWFsICFpbXBvcnRhbnR9LnNjcmVlbi1yZWFkZXItdGV4dDpmb2N1c3tib3JkZXItcmFkaXVzOjJweDtib3gtc2hhZG93OjAgMCAycHggMnB4IHJnYmEoMCwwLDAsMC42KTtjbGlwOmF1dG8gIWltcG9ydGFudDtkaXNwbGF5OmJsb2NrO2ZvbnQtc2l6ZToxNHB4O2xldHRlci1zcGFjaW5nOjBweDtmb250LXdlaWdodDo2MDA7bGluZS1oZWlnaHQ6MTZweDt0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7YmFja2dyb3VuZC1jb2xvcjojZmZmO2NvbG9yOiM0MjM0RjggIWltcG9ydGFudDtib3JkZXI6bm9uZTtoZWlnaHQ6YXV0bztsZWZ0OjhweDtwYWRkaW5nOjE2cHggNDBweDt0b3A6OHB4O3dpZHRoOmF1dG87ei1pbmRleDoxMDAwMDB9Lmxpc3QtcmVzZXR7bGlzdC1zdHlsZTpub25lO3BhZGRpbmc6MH0udGV4dC1sZWZ0e3RleHQtYWxpZ246bGVmdH0udGV4dC1jZW50ZXJ7dGV4dC1hbGlnbjpjZW50ZXJ9LnRleHQtcmlnaHR7dGV4dC1hbGlnbjpyaWdodH0udGV4dC1wcmltYXJ5e2NvbG9yOiM0MjM0Rjh9LnRleHQtc2Vjb25kYXJ5e2NvbG9yOiNGRjZDNTB9Lmhhcy10b3AtZGl2aWRlcntwb3NpdGlvbjpyZWxhdGl2ZX0uaGFzLXRvcC1kaXZpZGVyOjpiZWZvcmV7Y29udGVudDonJztwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtkaXNwbGF5OmJsb2NrO2hlaWdodDoxcHg7YmFja2dyb3VuZDojRTRFOEVFfS5oYXMtYm90dG9tLWRpdmlkZXJ7cG9zaXRpb246cmVsYXRpdmV9Lmhhcy1ib3R0b20tZGl2aWRlcjo6YWZ0ZXJ7Y29udGVudDonJztwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206MDtsZWZ0OjA7d2lkdGg6MTAwJTtkaXNwbGF5OmJsb2NrO2hlaWdodDoxcHg7YmFja2dyb3VuZDojRTRFOEVFfS5tLTB7bWFyZ2luOjB9Lm10LTB7bWFyZ2luLXRvcDowfS5tci0we21hcmdpbi1yaWdodDowfS5tYi0we21hcmdpbi1ib3R0b206MH0ubWwtMHttYXJnaW4tbGVmdDowfS5tLTh7bWFyZ2luOjhweH0ubXQtOHttYXJnaW4tdG9wOjhweH0ubXItOHttYXJnaW4tcmlnaHQ6OHB4fS5tYi04e21hcmdpbi1ib3R0b206OHB4fS5tbC04e21hcmdpbi1sZWZ0OjhweH0ubS0xNnttYXJnaW46MTZweH0ubXQtMTZ7bWFyZ2luLXRvcDoxNnB4fS5tci0xNnttYXJnaW4tcmlnaHQ6MTZweH0ubWItMTZ7bWFyZ2luLWJvdHRvbToxNnB4fS5tbC0xNnttYXJnaW4tbGVmdDoxNnB4fS5tLTI0e21hcmdpbjoyNHB4fS5tdC0yNHttYXJnaW4tdG9wOjI0cHh9Lm1yLTI0e21hcmdpbi1yaWdodDoyNHB4fS5tYi0yNHttYXJnaW4tYm90dG9tOjI0cHh9Lm1sLTI0e21hcmdpbi1sZWZ0OjI0cHh9Lm0tMzJ7bWFyZ2luOjMycHh9Lm10LTMye21hcmdpbi10b3A6MzJweH0ubXItMzJ7bWFyZ2luLXJpZ2h0OjMycHh9Lm1iLTMye21hcmdpbi1ib3R0b206MzJweH0ubWwtMzJ7bWFyZ2luLWxlZnQ6MzJweH0ubS00MHttYXJnaW46NDBweH0ubXQtNDB7bWFyZ2luLXRvcDo0MHB4fS5tci00MHttYXJnaW4tcmlnaHQ6NDBweH0ubWItNDB7bWFyZ2luLWJvdHRvbTo0MHB4fS5tbC00MHttYXJnaW4tbGVmdDo0MHB4fS5tLTQ4e21hcmdpbjo0OHB4fS5tdC00OHttYXJnaW4tdG9wOjQ4cHh9Lm1yLTQ4e21hcmdpbi1yaWdodDo0OHB4fS5tYi00OHttYXJnaW4tYm90dG9tOjQ4cHh9Lm1sLTQ4e21hcmdpbi1sZWZ0OjQ4cHh9Lm0tNTZ7bWFyZ2luOjU2cHh9Lm10LTU2e21hcmdpbi10b3A6NTZweH0ubXItNTZ7bWFyZ2luLXJpZ2h0OjU2cHh9Lm1iLTU2e21hcmdpbi1ib3R0b206NTZweH0ubWwtNTZ7bWFyZ2luLWxlZnQ6NTZweH0ubS02NHttYXJnaW46NjRweH0ubXQtNjR7bWFyZ2luLXRvcDo2NHB4fS5tci02NHttYXJnaW4tcmlnaHQ6NjRweH0ubWItNjR7bWFyZ2luLWJvdHRvbTo2NHB4fS5tbC02NHttYXJnaW4tbGVmdDo2NHB4fS5wLTB7cGFkZGluZzowfS5wdC0we3BhZGRpbmctdG9wOjB9LnByLTB7cGFkZGluZy1yaWdodDowfS5wYi0we3BhZGRpbmctYm90dG9tOjB9LnBsLTB7cGFkZGluZy1sZWZ0OjB9LnAtOHtwYWRkaW5nOjhweH0ucHQtOHtwYWRkaW5nLXRvcDo4cHh9LnByLTh7cGFkZGluZy1yaWdodDo4cHh9LnBiLTh7cGFkZGluZy1ib3R0b206OHB4fS5wbC04e3BhZGRpbmctbGVmdDo4cHh9LnAtMTZ7cGFkZGluZzoxNnB4fS5wdC0xNntwYWRkaW5nLXRvcDoxNnB4fS5wci0xNntwYWRkaW5nLXJpZ2h0OjE2cHh9LnBiLTE2e3BhZGRpbmctYm90dG9tOjE2cHh9LnBsLTE2e3BhZGRpbmctbGVmdDoxNnB4fS5wLTI0e3BhZGRpbmc6MjRweH0ucHQtMjR7cGFkZGluZy10b3A6MjRweH0ucHItMjR7cGFkZGluZy1yaWdodDoyNHB4fS5wYi0yNHtwYWRkaW5nLWJvdHRvbToyNHB4fS5wbC0yNHtwYWRkaW5nLWxlZnQ6MjRweH0ucC0zMntwYWRkaW5nOjMycHh9LnB0LTMye3BhZGRpbmctdG9wOjMycHh9LnByLTMye3BhZGRpbmctcmlnaHQ6MzJweH0ucGItMzJ7cGFkZGluZy1ib3R0b206MzJweH0ucGwtMzJ7cGFkZGluZy1sZWZ0OjMycHh9LnAtNDB7cGFkZGluZzo0MHB4fS5wdC00MHtwYWRkaW5nLXRvcDo0MHB4fS5wci00MHtwYWRkaW5nLXJpZ2h0OjQwcHh9LnBiLTQwe3BhZGRpbmctYm90dG9tOjQwcHh9LnBsLTQwe3BhZGRpbmctbGVmdDo0MHB4fS5wLTQ4e3BhZGRpbmc6NDhweH0ucHQtNDh7cGFkZGluZy10b3A6NDhweH0ucHItNDh7cGFkZGluZy1yaWdodDo0OHB4fS5wYi00OHtwYWRkaW5nLWJvdHRvbTo0OHB4fS5wbC00OHtwYWRkaW5nLWxlZnQ6NDhweH0ucC01NntwYWRkaW5nOjU2cHh9LnB0LTU2e3BhZGRpbmctdG9wOjU2cHh9LnByLTU2e3BhZGRpbmctcmlnaHQ6NTZweH0ucGItNTZ7cGFkZGluZy1ib3R0b206NTZweH0ucGwtNTZ7cGFkZGluZy1sZWZ0OjU2cHh9LnAtNjR7cGFkZGluZzo2NHB4fS5wdC02NHtwYWRkaW5nLXRvcDo2NHB4fS5wci02NHtwYWRkaW5nLXJpZ2h0OjY0cHh9LnBiLTY0e3BhZGRpbmctYm90dG9tOjY0cHh9LnBsLTY0e3BhZGRpbmctbGVmdDo2NHB4fS5zciAuaGFzLWFuaW1hdGlvbnMgLmlzLXJldmVhbGluZ3t2aXNpYmlsaXR5OmhpZGRlbn0uYnV0dG9ue2Rpc3BsYXk6aW5saW5lLWZsZXg7Zm9udC1zaXplOjE0cHg7bGV0dGVyLXNwYWNpbmc6MHB4O2ZvbnQtd2VpZ2h0OjcwMDtsaW5lLWhlaWdodDoxNnB4O3RleHQtZGVjb3JhdGlvbjpub25lICFpbXBvcnRhbnQ7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2JhY2tncm91bmQtY29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzQyMzRGOCAhaW1wb3J0YW50O2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6MnB4O2N1cnNvcjpwb2ludGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7cGFkZGluZzoxNnB4IDQwcHg7aGVpZ2h0OjQ4cHg7dGV4dC1hbGlnbjpjZW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwfS5idXR0b246YWN0aXZle291dGxpbmU6MH0uYnV0dG9uOjpiZWZvcmV7Ym9yZGVyLXJhZGl1czoycHh9LmJ1dHRvbi1zaGFkb3d7cG9zaXRpb246cmVsYXRpdmV9LmJ1dHRvbi1zaGFkb3c6OmJlZm9yZXtjb250ZW50OicnO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO3JpZ2h0OjA7Ym90dG9tOjA7bGVmdDowO2JveC1zaGFkb3c6MCA4cHggMTZweCByZ2JhKDIyLDMwLDQyLDAuMTIpO21peC1ibGVuZC1tb2RlOm11bHRpcGx5O3RyYW5zaXRpb246Ym94LXNoYWRvdyAuMTVzIGVhc2V9LmJ1dHRvbi1zaGFkb3c6aG92ZXI6OmJlZm9yZXtib3gtc2hhZG93OjAgOHB4IDE2cHggcmdiYSgyMiwzMCw0MiwwLjE2KX0uYnV0dG9uLXNte3BhZGRpbmc6OHB4IDI0cHg7aGVpZ2h0OjMycHh9LmJ1dHRvbi1zbS5idXR0b24tc2hhZG93OjpiZWZvcmV7Ym94LXNoYWRvdzowIDRweCAxNnB4IHJnYmEoMjIsMzAsNDIsMC4xMil9LmJ1dHRvbi1zbS5idXR0b24tc2hhZG93OmhvdmVyOjpiZWZvcmV7Ym94LXNoYWRvdzowIDRweCAxNnB4IHJnYmEoMjIsMzAsNDIsMC4xNil9LmJ1dHRvbi1wcmltYXJ5LC5idXR0b24tc2Vjb25kYXJ5e2NvbG9yOiNmZmYgIWltcG9ydGFudDt0cmFuc2l0aW9uOmJhY2tncm91bmQgLjE1cyBlYXNlfS5idXR0b24tcHJpbWFyeXtiYWNrZ3JvdW5kOiM0MjM0Rjh9LmJ1dHRvbi1wcmltYXJ5OmhvdmVye2JhY2tncm91bmQ6IzRiM2VmOH0uYnV0dG9uLXByaW1hcnkuYnV0dG9uLXNoYWRvdzo6YmVmb3Jle2JveC1zaGFkb3c6MCA4cHggMTZweCByZ2JhKDY2LDUyLDI0OCwwLjI0KX0uYnV0dG9uLXByaW1hcnkuYnV0dG9uLXNoYWRvdzpob3Zlcjo6YmVmb3Jle2JveC1zaGFkb3c6MCA4cHggMTZweCByZ2JhKDY2LDUyLDI0OCwwLjMyKX0uYnV0dG9uLXByaW1hcnkgLmJ1dHRvbi1zbS5idXR0b24tc2hhZG93OjpiZWZvcmV7Ym94LXNoYWRvdzowIDRweCAxNnB4IHJnYmEoNjYsNTIsMjQ4LDAuMjQpfS5idXR0b24tcHJpbWFyeSAuYnV0dG9uLXNtLmJ1dHRvbi1zaGFkb3c6aG92ZXI6OmJlZm9yZXtib3gtc2hhZG93OjAgNHB4IDE2cHggcmdiYSg2Niw1MiwyNDgsMC4zMil9LmJ1dHRvbi1zZWNvbmRhcnl7YmFja2dyb3VuZDojRkY2QzUwfS5idXR0b24tc2Vjb25kYXJ5OmhvdmVye2JhY2tncm91bmQ6I2ZmNzk1Zn0uYnV0dG9uLXNlY29uZGFyeS5idXR0b24tc2hhZG93OjpiZWZvcmV7Ym94LXNoYWRvdzowIDhweCAxNnB4IHJnYmEoMjU1LDEwOCw4MCwwLjI0KX0uYnV0dG9uLXNlY29uZGFyeS5idXR0b24tc2hhZG93OmhvdmVyOjpiZWZvcmV7Ym94LXNoYWRvdzowIDhweCAxNnB4IHJnYmEoMjU1LDEwOCw4MCwwLjMyKX0uYnV0dG9uLXNlY29uZGFyeSAuYnV0dG9uLXNtLmJ1dHRvbi1zaGFkb3c6OmJlZm9yZXtib3gtc2hhZG93OjAgNHB4IDE2cHggcmdiYSgyNTUsMTA4LDgwLDAuMjQpfS5idXR0b24tc2Vjb25kYXJ5IC5idXR0b24tc20uYnV0dG9uLXNoYWRvdzpob3Zlcjo6YmVmb3Jle2JveC1zaGFkb3c6MCA0cHggMTZweCByZ2JhKDI1NSwxMDgsODAsMC4zMil9LmJ1dHRvbi1ibG9ja3tkaXNwbGF5OmZsZXg7d2lkdGg6MTAwJX1AbWVkaWEgKG1heC13aWR0aDogNjQwcHgpey5idXR0b24td2lkZS1tb2JpbGV7d2lkdGg6MTAwJTttYXgtd2lkdGg6MjgwcHh9fS5zaXRlLWhlYWRlcntwYWRkaW5nOjI0cHggMDtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTt6LWluZGV4OjF9LnNpdGUtaGVhZGVyLWlubmVye3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczpjZW50ZXJ9LmhlYWRlci1saW5rc3tkaXNwbGF5OmlubGluZS1mbGV4fS5oZWFkZXItbGlua3MgbGl7ZGlzcGxheTppbmxpbmUtZmxleH0uaGVhZGVyLWxpbmtzIGE6bm90KC5idXR0b24pe2ZvbnQtc2l6ZToxNnB4O2xpbmUtaGVpZ2h0OjI0cHg7bGV0dGVyLXNwYWNpbmc6LTAuMXB4O2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojNjA2NDgzO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTt0ZXh0LWRlY29yYXRpb246bm9uZTtsaW5lLWhlaWdodDoxNnB4O3BhZGRpbmc6OHB4IDI0cHh9LmhlYWRlci1saW5rcyBhOm5vdCguYnV0dG9uKTpob3ZlciwuaGVhZGVyLWxpbmtzIGE6bm90KC5idXR0b24pOmFjdGl2ZXtjb2xvcjojZmZmfS5oZXJve3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmctdG9wOjEyOHB4O3BhZGRpbmctYm90dG9tOjg4cHg7ei1pbmRleDowfS5oZXJvIC5oZXJvLWJne3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTo0MiU7bGVmdDowO3JpZ2h0OjA7YmFja2dyb3VuZDojMEIwRDE5O3otaW5kZXg6LTJ9Lmhlcm8gLmhlcm8tcGFydGljbGVzLWNvbnRhaW5lcntwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206NDIlO2xlZnQ6MDtyaWdodDowfS5oZXJvOjpiZWZvcmUsLmhlcm86OmFmdGVye2NvbnRlbnQ6Jyc7cG9zaXRpb246YWJzb2x1dGU7bGVmdDpjYWxjKDUwJSAtIDM2MHB4KTt3aWR0aDo3MjBweDtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXR9Lmhlcm86OmJlZm9yZXt0b3A6MDtoZWlnaHQ6MTU5cHg7YmFja2dyb3VuZC1pbWFnZTp1cmwoXCIuLi9pbWFnZXMvaGVyby1iZy10b3Auc3ZnXCIpO2JhY2tncm91bmQtc2l6ZTo3MjBweCAxNTlweH0uaGVybzo6YWZ0ZXJ7Ym90dG9tOjQyJTtoZWlnaHQ6MTczcHg7YmFja2dyb3VuZC1pbWFnZTp1cmwoXCIuLi9pbWFnZXMvaGVyby1iZy1ib3R0b20uc3ZnXCIpO2JhY2tncm91bmQtc2l6ZTo3MjBweCAxNzNweH0uaGVyby1pbm5lcntwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjF9Lmhlcm8tY29weXtwb3NpdGlvbjpyZWxhdGl2ZTttYXJnaW4tYm90dG9tOjQ4cHh9QG1lZGlhIChtaW4td2lkdGg6IDY0MXB4KXsuaGVyb3twYWRkaW5nLXRvcDoxNjBweDtwYWRkaW5nLWJvdHRvbToxMjhweH0uaGVybzo6YmVmb3JlLC5oZXJvOjphZnRlcntsZWZ0OmNhbGMoNTAlIC0gNzIwcHgpO3dpZHRoOjE0NDBweH0uaGVybzo6YmVmb3Jle2hlaWdodDozMThweDtiYWNrZ3JvdW5kLXNpemU6MTQ0MHB4IDMxOHB4fS5oZXJvOjphZnRlcntoZWlnaHQ6MzQ3cHg7YmFja2dyb3VuZC1zaXplOjE0NDBweCAzNDdweH0uaGVyby1jb3B5e21hcmdpbi1ib3R0b206ODhweH0uaGVyby1wYXJhZ3JhcGh7cGFkZGluZy1sZWZ0OjcycHg7cGFkZGluZy1yaWdodDo3MnB4fX0uaGFzLWFuaW1hdGlvbnMgLmhlcm8gLmhlcm8tYmcsLmhhcy1hbmltYXRpb25zIC5oZXJvOjpiZWZvcmUsLmhhcy1hbmltYXRpb25zIC5oZXJvOjphZnRlciwuaGFzLWFuaW1hdGlvbnMgLmhlcm8tcGFydGljbGVzLWNvbnRhaW5lciwuaGFzLWFuaW1hdGlvbnMgLnNpdGUtaGVhZGVyLC5oYXMtYW5pbWF0aW9ucyAuaGVyby10aXRsZSwuaGFzLWFuaW1hdGlvbnMgLmhlcm8tcGFyYWdyYXBoLC5oYXMtYW5pbWF0aW9ucyAuaGVyby1jdGEsLmhhcy1hbmltYXRpb25zIC5oZXJvIC5tb2NrdXAtYmcsLmhhcy1hbmltYXRpb25zIC5oZXJvIC5kZXZpY2UtbW9ja3Vwe29wYWNpdHk6MH0uaGFzLWFuaW1hdGlvbnMuaXMtbG9hZGVkIC5oZXJvIC5oZXJvLWJne2FuaW1hdGlvbjpoZXJvQmcgMC42cyBjdWJpYy1iZXppZXIoMC4yMTUsIDAuNjEsIDAuMzU1LCAxKSBmb3J3YXJkc30uaGFzLWFuaW1hdGlvbnMuaXMtbG9hZGVkIC5oZXJvOjpiZWZvcmUsLmhhcy1hbmltYXRpb25zLmlzLWxvYWRlZCAuaGVybzo6YWZ0ZXJ7YW5pbWF0aW9uOmhlcm9GYWRlSW4gLjZzIGVhc2UgZm9yd2FyZHMgLjQ1c30uaGFzLWFuaW1hdGlvbnMuaXMtbG9hZGVkIC5zaXRlLWhlYWRlciwuaGFzLWFuaW1hdGlvbnMuaXMtbG9hZGVkIC5oZXJvLXBhcnRpY2xlcy1jb250YWluZXIsLmhhcy1hbmltYXRpb25zLmlzLWxvYWRlZCAuaGVybyAubW9ja3VwLWJne2FuaW1hdGlvbjpoZXJvRmFkZUluIC42cyBlYXNlIGZvcndhcmRzIC40NXN9Lmhhcy1hbmltYXRpb25zLmlzLWxvYWRlZCAuaGVyby10aXRsZXthbmltYXRpb246aGVyb0NvbnRlbnQgMC42cyBjdWJpYy1iZXppZXIoMC4yMTUsIDAuNjEsIDAuMzU1LCAxKSBmb3J3YXJkcyAwLjE1c30uaGFzLWFuaW1hdGlvbnMuaXMtbG9hZGVkIC5oZXJvLXBhcmFncmFwaHthbmltYXRpb246aGVyb0NvbnRlbnQgMC42cyBjdWJpYy1iZXppZXIoMC4yMTUsIDAuNjEsIDAuMzU1LCAxKSBmb3J3YXJkcyAwLjNzfS5oYXMtYW5pbWF0aW9ucy5pcy1sb2FkZWQgLmhlcm8tY3Rhe2FuaW1hdGlvbjpoZXJvQ29udGVudCAwLjZzIGN1YmljLWJlemllcigwLjIxNSwgMC42MSwgMC4zNTUsIDEpIGZvcndhcmRzIDAuNDVzfS5oYXMtYW5pbWF0aW9ucy5pcy1sb2FkZWQgLmhlcm8gLmRldmljZS1tb2NrdXB7YW5pbWF0aW9uOmhlcm9Nb2NrdXAgLjZzIGVhc2UgZm9yd2FyZHMgLjZzfUBrZXlmcmFtZXMgaGVyb0Jne2Zyb217dHJhbnNmb3JtOnNjYWxlWSgwKSBzY2FsZVgoMS4yKSBza2V3WSgzMGRlZyk7b3BhY2l0eToxfXRve3RyYW5zZm9ybTpzY2FsZVkoMSkgc2NhbGVYKDEpIHNrZXdZKDApO29wYWNpdHk6MX19QGtleWZyYW1lcyBoZXJvQ29udGVudHtmcm9te3RyYW5zZm9ybTp0cmFuc2xhdGVZKDQwcHgpIHNrZXdZKDJkZWcpO29wYWNpdHk6MH10b3t0cmFuc2Zvcm06dHJhbnNsYXRlWSgwKSBza2V3WSgwKTtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgaGVyb01vY2t1cHtmcm9te3RyYW5zZm9ybTp0cmFuc2xhdGVZKDgwcHgpO29wYWNpdHk6MH10b3t0cmFuc2Zvcm06dHJhbnNsYXRlWSgwKTtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgaGVyb0ZhZGVJbntmcm9te29wYWNpdHk6MH10b3tvcGFjaXR5OjF9fS5tb2NrdXAtY29udGFpbmVye3Bvc2l0aW9uOnJlbGF0aXZlfS5tb2NrdXAtYmd7cG9pbnRlci1ldmVudHM6bm9uZX0ubW9ja3VwLWJnIGltZywubW9ja3VwLWJnIHN2Z3twb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTAlO2xlZnQ6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwgLTUwJSk7d2lkdGg6YXV0byAhaW1wb3J0YW50O2hlaWdodDphdXRvO21heC13aWR0aDozMDAlICFpbXBvcnRhbnR9LmRldmljZS1tb2NrdXB7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MzUwcHg7aGVpZ2h0OmF1dG87bWFyZ2luOjAgYXV0bzt6LWluZGV4OjF9Lmhhcy1hbmltYXRpb25zIC5mZWF0dXJlcy1leHRlbmRlZHtvcGFjaXR5OjB9Lmhhcy1hbmltYXRpb25zLmlzLWxvYWRlZCAuZmVhdHVyZXMtZXh0ZW5kZWR7b3BhY2l0eToxfS5mZWF0dXJlcy1leHRlbmRlZC1oZWFkZXJ7bWFyZ2luLWJvdHRvbTozMnB4fS5mZWF0dXJlcy1leHRlbmRlZC13cmFwe2Rpc3BsYXk6ZmxleDtmbGV4LXdyYXA6d3JhcDttYXJnaW4tdG9wOi0yNHB4fS5mZWF0dXJlcy1leHRlbmRlZC13cmFwOmxhc3Qtb2YtdHlwZXttYXJnaW4tYm90dG9tOi0yNHB4fS5mZWF0dXJlcy1leHRlbmRlZC13cmFwOm5vdCg6bGFzdC1vZi10eXBlKXttYXJnaW4tYm90dG9tOjI0cHh9LmZlYXR1cmUtZXh0ZW5kZWR7cGFkZGluZzoyNHB4IDB9LmZlYXR1cmUtZXh0ZW5kZWQtaW1hZ2V7cG9zaXRpb246cmVsYXRpdmU7bWFyZ2luLWJvdHRvbTozMnB4fS5mZWF0dXJlLWV4dGVuZGVkLWltYWdlIGltZywuZmVhdHVyZS1leHRlbmRlZC1pbWFnZSBzdmd7d2lkdGg6MTAwJTttYXgtd2lkdGg6Mjk2cHg7aGVpZ2h0OmF1dG87bWFyZ2luLWxlZnQ6YXV0bzttYXJnaW4tcmlnaHQ6YXV0bztvdmVyZmxvdzp2aXNpYmxlfS5mZWF0dXJlLWV4dGVuZGVkLWJvZHl7dGV4dC1hbGlnbjpjZW50ZXJ9QG1lZGlhIChtaW4td2lkdGg6IDY0MXB4KXsuZmVhdHVyZXMtZXh0ZW5kZWQgLmNvbnRhaW5lcnttYXgtd2lkdGg6OTEycHh9LmZlYXR1cmVzLWV4dGVuZGVkIC5zZWN0aW9uLWlubmVye3BhZGRpbmctYm90dG9tOjEyOHB4fS5mZWF0dXJlcy1leHRlbmRlZCAuc2VjdGlvbi1wYXJhZ3JhcGh7cGFkZGluZy1sZWZ0OjcycHg7cGFkZGluZy1yaWdodDo3MnB4O21hcmdpbi1ib3R0b206MH0uZmVhdHVyZXMtZXh0ZW5kZWQtaGVhZGVye21hcmdpbi1ib3R0b206ODBweH0uZmVhdHVyZXMtZXh0ZW5kZWQtd3JhcHttYXJnaW4tdG9wOi02NHB4fS5mZWF0dXJlcy1leHRlbmRlZC13cmFwOmxhc3Qtb2YtdHlwZXttYXJnaW4tYm90dG9tOi02NHB4fS5mZWF0dXJlcy1leHRlbmRlZC13cmFwOm5vdCg6bGFzdC1vZi10eXBlKXttYXJnaW4tYm90dG9tOjY0cHh9LmZlYXR1cmUtZXh0ZW5kZWR7ZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDpub3dyYXA7YWxpZ24taXRlbXM6c3RyZXRjaDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7cGFkZGluZzo2NHB4IDB9LmZlYXR1cmUtZXh0ZW5kZWQgLmZlYXR1cmUtZXh0ZW5kZWQtaW1hZ2V7d2lkdGg6NDQwcHg7bWFyZ2luLXJpZ2h0Ojk2cHg7bWFyZ2luLWJvdHRvbTowfS5mZWF0dXJlLWV4dGVuZGVkIC5mZWF0dXJlLWV4dGVuZGVkLWltYWdlIGltZywuZmVhdHVyZS1leHRlbmRlZCAuZmVhdHVyZS1leHRlbmRlZC1pbWFnZSBzdmd7d2lkdGg6YXV0b30uZmVhdHVyZS1leHRlbmRlZCAuZmVhdHVyZS1leHRlbmRlZC1pbWFnZSBpbWcuZGV2aWNlLW1vY2t1cCwuZmVhdHVyZS1leHRlbmRlZCAuZmVhdHVyZS1leHRlbmRlZC1pbWFnZSBzdmcuZGV2aWNlLW1vY2t1cHttYXgtd2lkdGg6Mjk2cHh9LmZlYXR1cmUtZXh0ZW5kZWQ6bnRoLWNoaWxkKGV2ZW4pe2p1c3RpZnktY29udGVudDpmbGV4LXN0YXJ0fS5mZWF0dXJlLWV4dGVuZGVkOm50aC1jaGlsZChldmVuKSAuZmVhdHVyZS1leHRlbmRlZC1pbWFnZXtvcmRlcjoxO21hcmdpbi1sZWZ0Ojk2cHg7bWFyZ2luLXJpZ2h0OjB9LmZlYXR1cmUtZXh0ZW5kZWQtYm9keXtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2p1c3RpZnktY29udGVudDpjZW50ZXI7ZmxleC1zaHJpbms6MDt3aWR0aDozNjBweDt0ZXh0LWFsaWduOmxlZnR9fUBtZWRpYSAobWluLXdpZHRoOiAxMDI1cHgpey5mZWF0dXJlcy1leHRlbmRlZCAuY29udGFpbmVye21heC13aWR0aDo5NDRweH0uZmVhdHVyZS1leHRlbmRlZCAuZmVhdHVyZS1leHRlbmRlZC1pbWFnZXttYXJnaW4tcmlnaHQ6NjRweH0uZmVhdHVyZS1leHRlbmRlZDpudGgtY2hpbGQoZXZlbikgLmZlYXR1cmUtZXh0ZW5kZWQtaW1hZ2V7bWFyZ2luLWxlZnQ6NjRweH0uZmVhdHVyZS1leHRlbmRlZC1ib2R5e3dpZHRoOjM5MnB4fX0uY3RhIC5zZWN0aW9uLXBhcmFncmFwaHttYXJnaW4tYm90dG9tOjMycHh9QG1lZGlhIChtaW4td2lkdGg6IDY0MXB4KXsuY3RhIC5zZWN0aW9uLXBhcmFncmFwaHttYXJnaW4tYm90dG9tOjMycHg7cGFkZGluZy1sZWZ0OjcycHg7cGFkZGluZy1yaWdodDo3MnB4fX0uaXMtYm94ZWR7YmFja2dyb3VuZDojZmZmfS5ib2R5LXdyYXB7YmFja2dyb3VuZDojZmZmO292ZXJmbG93OmhpZGRlbjtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi1oZWlnaHQ6MTAwdmh9LmJveGVkLWNvbnRhaW5lcnttYXgtd2lkdGg6MTQ0MHB4O21hcmdpbjowIGF1dG87Ym94LXNoYWRvdzowIDIwcHggNDhweCByZ2JhKDIyLDMwLDQyLDAuMTYpfW1haW57ZmxleDoxIDAgYXV0b30uc2VjdGlvbi1pbm5lcntwb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nLXRvcDo0OHB4O3BhZGRpbmctYm90dG9tOjQ4cHh9QG1lZGlhIChtaW4td2lkdGg6IDY0MXB4KXsuc2VjdGlvbi1pbm5lcntwYWRkaW5nLXRvcDo4OHB4O3BhZGRpbmctYm90dG9tOjg4cHh9fS5zaXRlLWZvb3Rlcntwb3NpdGlvbjpyZWxhdGl2ZTtiYWNrZ3JvdW5kOiMwQjBEMTl9LnNpdGUtZm9vdGVyOjpiZWZvcmV7Y29udGVudDonJztwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTc2cHg7bGVmdDpjYWxjKDUwJSAtIDM2MHB4KTt3aWR0aDo3MjBweDtoZWlnaHQ6MjkxcHg7YmFja2dyb3VuZC1pbWFnZTp1cmwoXCIuLi9pbWFnZXMvZm9vdGVyLWJnLnN2Z1wiKTtiYWNrZ3JvdW5kLXNpemU6NzIwcHggMjkxcHg7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0fS5zaXRlLWZvb3RlciAuZm9vdGVyLXBhcnRpY2xlcy1jb250YWluZXJ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjB9LnNpdGUtZm9vdGVyLWJvdHRvbXtmb250LXNpemU6MTRweDtsaW5lLWhlaWdodDoyMnB4O2xldHRlci1zcGFjaW5nOjBweDt6LWluZGV4OjF9LnNpdGUtZm9vdGVyLWJvdHRvbSBhe2NvbG9yOiM2MDY0ODM7dGV4dC1kZWNvcmF0aW9uOm5vbmV9LnNpdGUtZm9vdGVyLWJvdHRvbSBhOmhvdmVyLC5zaXRlLWZvb3Rlci1ib3R0b20gYTphY3RpdmV7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX0uc2l0ZS1mb290ZXItaW5uZXJ7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwO3BhZGRpbmctdG9wOjQ4cHg7cGFkZGluZy1ib3R0b206NDhweDtwb3NpdGlvbjpyZWxhdGl2ZX0uc2l0ZS1mb290ZXItaW5uZXI6OmJlZm9yZXtjb250ZW50OicnO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjFweDtiYWNrZ3JvdW5kOiMxRTIzM0R9LmZvb3Rlci1icmFuZCwuZm9vdGVyLWxpbmtzLC5mb290ZXItc29jaWFsLWxpbmtzLC5mb290ZXItY29weXJpZ2h0e2ZsZXg6bm9uZTt3aWR0aDoxMDAlO2Rpc3BsYXk6aW5saW5lLWZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcn0uZm9vdGVyLWJyYW5kLC5mb290ZXItbGlua3MsLmZvb3Rlci1zb2NpYWwtbGlua3N7bWFyZ2luLWJvdHRvbToyNHB4fS5mb290ZXItbGlua3MgbGkrbGksLmZvb3Rlci1zb2NpYWwtbGlua3MgbGkrbGl7bWFyZ2luLWxlZnQ6MTZweH0uZm9vdGVyLXNvY2lhbC1saW5rcyBsaXtkaXNwbGF5OmlubGluZS1mbGV4fS5mb290ZXItc29jaWFsLWxpbmtzIGxpIGF7cGFkZGluZzo4cHh9QG1lZGlhIChtaW4td2lkdGg6IDY0MXB4KXsuc2l0ZS1mb290ZXI6OmJlZm9yZXt0b3A6LTE1MnB4O2xlZnQ6Y2FsYyg1MCUgLSA3MjBweCk7d2lkdGg6MTQ0MHB4O2hlaWdodDo1ODJweDtiYWNrZ3JvdW5kLXNpemU6MTQ0MHB4IDU4MnB4fS5zaXRlLWZvb3Rlci1pbm5lcntqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjtwYWRkaW5nLXRvcDo2NHB4O3BhZGRpbmctYm90dG9tOjY0cHh9LmZvb3Rlci1icmFuZCwuZm9vdGVyLWxpbmtzLC5mb290ZXItc29jaWFsLWxpbmtzLC5mb290ZXItY29weXJpZ2h0e2ZsZXg6NTAlfS5mb290ZXItYnJhbmQsLmZvb3Rlci1jb3B5cmlnaHR7anVzdGlmeS1jb250ZW50OmZsZXgtc3RhcnR9LmZvb3Rlci1saW5rcywuZm9vdGVyLXNvY2lhbC1saW5rc3tqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmR9LmZvb3Rlci1saW5rc3tvcmRlcjoxO21hcmdpbi1ib3R0b206MH19XG4iXX0= */ \ No newline at end of file diff --git a/html/share/dist/images/footer-bg.svg b/html/share/dist/images/footer-bg.svg new file mode 100644 index 0000000..a875221 --- /dev/null +++ b/html/share/dist/images/footer-bg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/html/share/dist/images/hero-bg-bottom.svg b/html/share/dist/images/hero-bg-bottom.svg new file mode 100644 index 0000000..7b905e2 --- /dev/null +++ b/html/share/dist/images/hero-bg-bottom.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/html/share/dist/images/hero-bg-top.svg b/html/share/dist/images/hero-bg-top.svg new file mode 100644 index 0000000..0065311 --- /dev/null +++ b/html/share/dist/images/hero-bg-top.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/html/share/dist/images/iphone-feature-01.png b/html/share/dist/images/iphone-feature-01.png new file mode 100644 index 0000000..9134209 Binary files /dev/null and b/html/share/dist/images/iphone-feature-01.png differ diff --git a/html/share/dist/images/iphone-feature-02.png b/html/share/dist/images/iphone-feature-02.png new file mode 100644 index 0000000..3869f99 Binary files /dev/null and b/html/share/dist/images/iphone-feature-02.png differ diff --git a/html/share/dist/images/iphone-feature-03.png b/html/share/dist/images/iphone-feature-03.png new file mode 100644 index 0000000..c64d7b2 Binary files /dev/null and b/html/share/dist/images/iphone-feature-03.png differ diff --git a/html/share/dist/images/iphone-feature-04.png b/html/share/dist/images/iphone-feature-04.png new file mode 100644 index 0000000..bb2ad51 Binary files /dev/null and b/html/share/dist/images/iphone-feature-04.png differ diff --git a/html/share/dist/images/iphone-feature-bg-01.svg b/html/share/dist/images/iphone-feature-bg-01.svg new file mode 100644 index 0000000..f074eea --- /dev/null +++ b/html/share/dist/images/iphone-feature-bg-01.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/html/share/dist/images/iphone-feature-bg-02.svg b/html/share/dist/images/iphone-feature-bg-02.svg new file mode 100644 index 0000000..dfa9441 --- /dev/null +++ b/html/share/dist/images/iphone-feature-bg-02.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/html/share/dist/images/iphone-feature-bg-03.svg b/html/share/dist/images/iphone-feature-bg-03.svg new file mode 100644 index 0000000..6880c57 --- /dev/null +++ b/html/share/dist/images/iphone-feature-bg-03.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/html/share/dist/images/iphone-feature-bg-04.svg b/html/share/dist/images/iphone-feature-bg-04.svg new file mode 100644 index 0000000..ebc0000 --- /dev/null +++ b/html/share/dist/images/iphone-feature-bg-04.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/html/share/dist/images/iphone-hero-bg.svg b/html/share/dist/images/iphone-hero-bg.svg new file mode 100644 index 0000000..a913ebf --- /dev/null +++ b/html/share/dist/images/iphone-hero-bg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/html/share/dist/images/iphone-hero.png b/html/share/dist/images/iphone-hero.png new file mode 100644 index 0000000..3ee64ca Binary files /dev/null and b/html/share/dist/images/iphone-hero.png differ diff --git a/html/share/dist/images/logo.png b/html/share/dist/images/logo.png new file mode 100644 index 0000000..017e66b Binary files /dev/null and b/html/share/dist/images/logo.png differ diff --git a/html/share/dist/images/logo.svg b/html/share/dist/images/logo.svg new file mode 100644 index 0000000..fe9cd59 --- /dev/null +++ b/html/share/dist/images/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/html/share/dist/images/logo2.png b/html/share/dist/images/logo2.png new file mode 100644 index 0000000..2eaa360 Binary files /dev/null and b/html/share/dist/images/logo2.png differ diff --git a/html/share/dist/js/main.min.js b/html/share/dist/js/main.min.js new file mode 100644 index 0000000..3cf3176 --- /dev/null +++ b/html/share/dist/js/main.min.js @@ -0,0 +1 @@ +!function(){const t=document,e=t.documentElement,i=t.body,n=window.sr=ScrollReveal({mobile:!1});e.classList.remove("no-js"),e.classList.add("js"),window.addEventListener("load",function(){i.classList.add("is-loaded")}),i.classList.contains("has-animations")&&window.addEventListener("load",function(){n.reveal(".feature-extended .device-mockup",{duration:600,distance:"100px",easing:"cubic-bezier(0.215, 0.61, 0.355, 1)",origin:"bottom",viewFactor:.6}),n.reveal(".feature-extended .feature-extended-body",{duration:600,distance:"40px",easing:"cubic-bezier(0.215, 0.61, 0.355, 1)",origin:"top",viewFactor:.6})});let s=function(t){let e=this;e.parentNode=t,e.getCanvasSize(),window.addEventListener("resize",function(){e.getCanvasSize()}),e.mouseX=0,e.mouseY=0,window.addEventListener("mousemove",function(t){e.mouseX=t.clientX,e.mouseY=t.clientY}),e.randomise()};s.prototype.getCanvasSize=function(){this.canvasWidth=this.parentNode.clientWidth,this.canvasHeight=this.parentNode.clientHeight},s.prototype.generateDecimalBetween=function(t,e){return(Math.random()*(t-e)+e).toFixed(2)},s.prototype.update=function(){let t=this;t.translateX=t.translateX-t.movementX,t.translateY=t.translateY-t.movementY,t.posX+=(t.mouseX/(t.staticity/t.magnetism)-t.posX)/t.smoothFactor,t.posY+=(t.mouseY/(t.staticity/t.magnetism)-t.posY)/t.smoothFactor,(t.translateY+t.posY<0||t.translateX+t.posX<0||t.translateX+t.posX>t.canvasWidth)&&(t.randomise(),t.translateY=t.canvasHeight)},s.prototype.randomise=function(){this.colors=["85,107,139","38,141,247","66,52,248","255,108,80","243, 244, 255","96, 100, 131"],this.velocity=30,this.smoothFactor=50,this.staticity=30,this.magnetism=.1+4*Math.random(),this.color=this.colors[Math.floor(Math.random()*this.colors.length)],this.alpha=this.generateDecimalBetween(5,10)/10,this.size=this.generateDecimalBetween(1,4),this.posX=0,this.posY=0,this.movementX=this.generateDecimalBetween(-2,2)/this.velocity,this.movementY=this.generateDecimalBetween(1,20)/this.velocity,this.translateX=this.generateDecimalBetween(0,this.canvasWidth),this.translateY=this.generateDecimalBetween(0,this.canvasHeight)};let a=function(t){this.canvas=document.getElementById(t),this.ctx=this.canvas.getContext("2d"),this.dpr=window.devicePixelRatio};a.prototype.start=function(){let t=this;t.canvasSize(),window.addEventListener("resize",function(){t.canvasSize()}),t.bubblesList=[],t.generateBubbles(),t.animate()},a.prototype.canvasSize=function(){this.container=this.canvas.parentNode,this.w=this.container.offsetWidth,this.h=this.container.offsetHeight,this.wdpi=this.w*this.dpr,this.hdpi=this.h*this.dpr,this.canvas.width=this.wdpi,this.canvas.height=this.hdpi,this.canvas.style.width=this.w+"px",this.canvas.style.height=this.h+"px",this.ctx.scale(this.dpr,this.dpr)},a.prototype.animate=function(){let t=this;t.ctx.clearRect(0,0,t.canvas.clientWidth,t.canvas.clientHeight),t.bubblesList.forEach(function(e){e.update(),t.ctx.translate(e.translateX,e.translateY),t.ctx.beginPath(),t.ctx.arc(e.posX,e.posY,e.size,0,2*Math.PI),t.ctx.fillStyle="rgba("+e.color+","+e.alpha+")",t.ctx.fill(),t.ctx.setTransform(t.dpr,0,0,t.dpr,0,0)}),requestAnimationFrame(this.animate.bind(this))},a.prototype.addBubble=function(t){return this.bubblesList.push(t)},a.prototype.generateBubbles=function(){let t=this;for(let e=0;e + + + + + + 智驾定位 + + + + + +
+ + +
+
+ +
+ +
+
+
+
+

面向家庭用户、车队管理者、骑行社群等多种出行场景的精准定位与智能驾驶分析APP。

+

我们致力于通过精准的位置共享、行车轨迹分析和智能出行守护,为每一位用户打造更高效、更安心的出行体验。智能记录、安全前行、分享行程,让关心的人更安心!

+ +
+
+
+ iPhone illustration +
+ iPhone Hero +
+
+
+
+ +
+
+
+
+
+
+
+ iPhone Feature 01 illustration +
+ iPhone Feature 01 +
+
+

帮助你查找朋友和车辆的定位

+

数据自动生成,行程随时回顾.

+
+
+
+
+
+ iPhone Feature 02 illustration +
+ iPhone Feature 02 +
+
+

驾驶评分、智驾分析

+

自动计算驾驶行为评分,实时反馈驾驶习惯,包括急刹车、加速、超速等

+

详细分析驾驶行为,展示每次行车的评分细节、改善建议、优化目标

+
+
+
+
+
+ iPhone Feature 03 illustration +
+ iPhone Feature 03 +
+
+

行程回顾、行程分享

+

精准记录每一次行程,回顾路线、时间、里程,支持轨迹回放

+

将实时行程分享给关心你的人

+
+
+
+
+
+ iPhone Feature 04 illustration +
+ iPhone Feature 04 +
+
+

安全省心、隐私保护

+

上车不掉队,圈子一路随行

+

圈子虽小,连接无限,安心共享每一步,从亲近的人开始

+
+
+
+
+
+
+
+ + +
+ + + diff --git a/html/share/src/images/footer-bg.svg b/html/share/src/images/footer-bg.svg new file mode 100644 index 0000000..4d06670 --- /dev/null +++ b/html/share/src/images/footer-bg.svg @@ -0,0 +1 @@ + diff --git a/html/share/src/images/hero-bg-bottom.svg b/html/share/src/images/hero-bg-bottom.svg new file mode 100644 index 0000000..53c0dee --- /dev/null +++ b/html/share/src/images/hero-bg-bottom.svg @@ -0,0 +1 @@ + diff --git a/html/share/src/images/hero-bg-top.svg b/html/share/src/images/hero-bg-top.svg new file mode 100644 index 0000000..0065311 --- /dev/null +++ b/html/share/src/images/hero-bg-top.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/html/share/src/images/iphone-feature-01.png b/html/share/src/images/iphone-feature-01.png new file mode 100644 index 0000000..bf84d9e Binary files /dev/null and b/html/share/src/images/iphone-feature-01.png differ diff --git a/html/share/src/images/iphone-feature-02.png b/html/share/src/images/iphone-feature-02.png new file mode 100644 index 0000000..086ed12 Binary files /dev/null and b/html/share/src/images/iphone-feature-02.png differ diff --git a/html/share/src/images/iphone-feature-03.png b/html/share/src/images/iphone-feature-03.png new file mode 100644 index 0000000..bf84d9e Binary files /dev/null and b/html/share/src/images/iphone-feature-03.png differ diff --git a/html/share/src/images/iphone-feature-04.png b/html/share/src/images/iphone-feature-04.png new file mode 100644 index 0000000..086ed12 Binary files /dev/null and b/html/share/src/images/iphone-feature-04.png differ diff --git a/html/share/src/images/iphone-feature-bg-01.svg b/html/share/src/images/iphone-feature-bg-01.svg new file mode 100644 index 0000000..f074eea --- /dev/null +++ b/html/share/src/images/iphone-feature-bg-01.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/html/share/src/images/iphone-feature-bg-02.svg b/html/share/src/images/iphone-feature-bg-02.svg new file mode 100644 index 0000000..dfa9441 --- /dev/null +++ b/html/share/src/images/iphone-feature-bg-02.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/html/share/src/images/iphone-feature-bg-03.svg b/html/share/src/images/iphone-feature-bg-03.svg new file mode 100644 index 0000000..6880c57 --- /dev/null +++ b/html/share/src/images/iphone-feature-bg-03.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/html/share/src/images/iphone-feature-bg-04.svg b/html/share/src/images/iphone-feature-bg-04.svg new file mode 100644 index 0000000..ebc0000 --- /dev/null +++ b/html/share/src/images/iphone-feature-bg-04.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/html/share/src/images/iphone-hero-bg.svg b/html/share/src/images/iphone-hero-bg.svg new file mode 100644 index 0000000..577ec54 --- /dev/null +++ b/html/share/src/images/iphone-hero-bg.svg @@ -0,0 +1 @@ + diff --git a/html/share/src/images/iphone-hero.png b/html/share/src/images/iphone-hero.png new file mode 100644 index 0000000..b58f00f Binary files /dev/null and b/html/share/src/images/iphone-hero.png differ diff --git a/html/share/src/images/logo.svg b/html/share/src/images/logo.svg new file mode 100644 index 0000000..fe9cd59 --- /dev/null +++ b/html/share/src/images/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/html/share/src/js/main.js b/html/share/src/js/main.js new file mode 100644 index 0000000..e55ee78 --- /dev/null +++ b/html/share/src/js/main.js @@ -0,0 +1,181 @@ +(function () { + const doc = document + const rootEl = doc.documentElement + const body = doc.body + /* global ScrollReveal */ + const sr = window.sr = ScrollReveal({ mobile: false }) + + rootEl.classList.remove('no-js') + rootEl.classList.add('js') + + window.addEventListener('load', function () { + body.classList.add('is-loaded') + }) + + // Reveal animations + function revealAnimations () { + sr.reveal('.feature-extended .device-mockup', { + duration: 600, + distance: '100px', + easing: 'cubic-bezier(0.215, 0.61, 0.355, 1)', + origin: 'bottom', + viewFactor: 0.6 + }) + sr.reveal('.feature-extended .feature-extended-body', { + duration: 600, + distance: '40px', + easing: 'cubic-bezier(0.215, 0.61, 0.355, 1)', + origin: 'top', + viewFactor: 0.6 + }) + } + + if (body.classList.contains('has-animations')) { + window.addEventListener('load', revealAnimations) + } + + // Particle animation + let Bubble = function (parentNode) { + let self = this + self.parentNode = parentNode + self.getCanvasSize() + window.addEventListener('resize', function () { + self.getCanvasSize() + }) + self.mouseX = 0 + self.mouseY = 0 + window.addEventListener('mousemove', function (e) { + self.mouseX = e.clientX + self.mouseY = e.clientY + }) + self.randomise() + } + + Bubble.prototype.getCanvasSize = function () { + let self = this + self.canvasWidth = self.parentNode.clientWidth + self.canvasHeight = self.parentNode.clientHeight + } + + Bubble.prototype.generateDecimalBetween = function (min, max) { + return (Math.random() * (min - max) + max).toFixed(2) + } + + Bubble.prototype.update = function () { + let self = this + self.translateX = self.translateX - self.movementX + self.translateY = self.translateY - self.movementY + self.posX += ((self.mouseX / (self.staticity / self.magnetism)) - self.posX) / self.smoothFactor + self.posY += ((self.mouseY / (self.staticity / self.magnetism)) - self.posY) / self.smoothFactor + + if (self.translateY + self.posY < 0 || self.translateX + self.posX < 0 || self.translateX + self.posX > self.canvasWidth) { + self.randomise() + self.translateY = self.canvasHeight + } + } + + Bubble.prototype.randomise = function () { + let self = this + self.colors = ['85,107,139', '38,141,247', '66,52,248', '255,108,80', '243, 244, 255', '96, 100, 131'] + self.velocity = 30 // Bubble levitation velocity (the higher the slower) + self.smoothFactor = 50 // The higher, the smoother + self.staticity = 30 // Increase value to make bubbles move slower on mousemove + self.magnetism = 0.1 + Math.random() * 4 + self.color = self.colors[Math.floor(Math.random() * self.colors.length)] + self.alpha = self.generateDecimalBetween(5, 10) / 10 + self.size = self.generateDecimalBetween(1, 4) + self.posX = 0 + self.posY = 0 + self.movementX = self.generateDecimalBetween(-2, 2) / self.velocity + self.movementY = self.generateDecimalBetween(1, 20) / self.velocity + self.translateX = self.generateDecimalBetween(0, self.canvasWidth) + self.translateY = self.generateDecimalBetween(0, self.canvasHeight) + } + + let Background = function (selector) { + let self = this + self.canvas = document.getElementById(selector) + self.ctx = this.canvas.getContext('2d') + self.dpr = window.devicePixelRatio + } + + Background.prototype.start = function () { + let self = this + self.canvasSize() + window.addEventListener('resize', function () { + self.canvasSize() + }) + self.bubblesList = [] + self.generateBubbles() + self.animate() + } + + Background.prototype.canvasSize = function () { + let self = this + self.container = self.canvas.parentNode + // Determine window width and height + self.w = self.container.offsetWidth + self.h = self.container.offsetHeight + self.wdpi = self.w * self.dpr + self.hdpi = self.h * self.dpr + // Set canvas width and height + self.canvas.width = self.wdpi + self.canvas.height = self.hdpi + // Set width and height attributes + self.canvas.style.width = self.w + 'px' + self.canvas.style.height = self.h + 'px' + // Scale down canvas + self.ctx.scale(self.dpr, self.dpr) + } + + Background.prototype.animate = function () { + let self = this + self.ctx.clearRect(0, 0, self.canvas.clientWidth, self.canvas.clientHeight) + self.bubblesList.forEach(function (bubble) { + bubble.update() + self.ctx.translate(bubble.translateX, bubble.translateY) + self.ctx.beginPath() + self.ctx.arc(bubble.posX, bubble.posY, bubble.size, 0, 2 * Math.PI) + self.ctx.fillStyle = 'rgba(' + bubble.color + ',' + bubble.alpha + ')' + self.ctx.fill() + self.ctx.setTransform(self.dpr, 0, 0, self.dpr, 0, 0) + }) + /* global requestAnimationFrame */ + requestAnimationFrame(this.animate.bind(this)) + } + + Background.prototype.addBubble = function (bubble) { + return this.bubblesList.push(bubble) + } + + Background.prototype.generateBubbles = function () { + let self = this + for (let i = 0; i < self.bubbleDensity(); i++) { + self.addBubble(new Bubble(self.canvas.parentNode)) + } + } + + Background.prototype.bubbleDensity = function () { + return 15 + } + + window.addEventListener('load', function () { + const heroParticles = new Background('hero-particles') + const footerParticles = new Background('footer-particles') + heroParticles.start() + footerParticles.start() + }) + + window.requestAnimFrame = (function () { + return ( + window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function (callback) { + window.setTimeout(callback, 1000 / 60) + } + ) + })() +}()) diff --git a/html/share/src/scss/_normalize.scss b/html/share/src/scss/_normalize.scss new file mode 100644 index 0000000..8025dce --- /dev/null +++ b/html/share/src/scss/_normalize.scss @@ -0,0 +1,231 @@ +html { + line-height: 1.15; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; +} + +article, +aside, +footer, +header, +nav, +section { + display: block; +} + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +figcaption, +figure, +main { + display: block; +} + +figure { + margin: 1em 40px; +} + +hr { + box-sizing: content-box; + height: 0; + overflow: visible; +} + +pre { + font-family: monospace, monospace; + font-size: 1em; +} + +a { + background-color: transparent; + -webkit-text-decoration-skip: objects; +} + +abbr[title] { + border-bottom: none; + text-decoration: underline; + text-decoration: underline dotted; +} + +b, +strong { + font-weight: inherit; +} + +b, +strong { + font-weight: bolder; +} + +code, +kbd, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +dfn { + font-style: italic; +} + +mark { + background-color: #ff0; + color: #000; +} + +small { + font-size: 80%; +} + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +audio, +video { + display: inline-block; +} + +audio:not([controls]) { + display: none; + height: 0; +} + +img { + border-style: none; +} + +svg:not(:root) { + overflow: hidden; +} + +button, +input, +optgroup, +select, +textarea { + font-family: sans-serif; + font-size: 100%; + line-height: 1.15; + margin: 0; +} + +button, +input { + overflow: visible; +} + +button, +select { + text-transform: none; +} + +button, +html [type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +legend { + box-sizing: border-box; + color: inherit; + display: table; + max-width: 100%; + padding: 0; + white-space: normal; +} + +progress { + display: inline-block; + vertical-align: baseline; +} + +textarea { + overflow: auto; +} + +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; + padding: 0; +} + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +[type="search"] { + -webkit-appearance: textfield; + outline-offset: -2px; +} + +[type="search"]::-webkit-search-cancel-button, +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit; +} + +details, +menu { + display: block; +} + +summary { + display: list-item; +} + +canvas { + display: inline-block; +} + +template { + display: none; +} + +[hidden] { + display: none; +} \ No newline at end of file diff --git a/html/share/src/scss/abstracts/_functions.scss b/html/share/src/scss/abstracts/_functions.scss new file mode 100644 index 0000000..6aa6a1c --- /dev/null +++ b/html/share/src/scss/abstracts/_functions.scss @@ -0,0 +1,55 @@ +// -------------------------------------------------------------------- +// Retrieve Font Size ------------------------------------------------- +// Used in _mixins.scss [@mixin font-size] ---------------------------- +// -------------------------------------------------------------------- +@function get-font-size($size, $elem) { + @return nth(map-get(map-get($font__scale, $elem), $size), 1); +} + +// -------------------------------------------------------------------- +// Retrieve Line Height ----------------------------------------------- +// Used in _mixins.scss [@mixin font-size] ---------------------------- +// -------------------------------------------------------------------- +@function get-line-height($size, $elem) { + @return nth(map-get(map-get($font__scale, $elem), $size), 2); +} + +// -------------------------------------------------------------------- +// Retrieve Kerning --------------------------------------------------- +// Used in _mixins.scss [@mixin font-size] ---------------------------- +// -------------------------------------------------------------------- +@function get-kerning($size, $elem) { + @return nth(map-get(map-get($font__scale, $elem), $size), 3); +} + +// -------------------------------------------------------------------- +// Retrieve Font Family ----------------------------------------------- +// Used in _mixins.scss [@mixin font-family] -------------------------- +// -------------------------------------------------------------------- +@function get-font-family($elem) { + @return map-get($font__family, $elem); +} + +// -------------------------------------------------------------------- +// Retrieve Font Weight ----------------------------------------------- +// Used in _mixins.scss [@mixin font-weight] -------------------------- +// -------------------------------------------------------------------- +@function get-font-weight($elem) { + @return map-get($font__weight, $elem); +} + +// -------------------------------------------------------------------- +// Retrieve Padding of Content Area Elements -------------------------- +// Used in _mixins.scss [@mixin font-size] ---------------------------- +// -------------------------------------------------------------------- +@function get-content-padding($elem) { + @return map-get($content__padding, $elem); +} + +// -------------------------------------------------------------------- +// Retrieve Colors ---------------------------------------------------- +// Usage: color(typography, 1) ---------------------------------------------- +// -------------------------------------------------------------------- +@function color($elem, $variant) { + @return map-get(map-get($color, $elem), $variant); +} diff --git a/html/share/src/scss/abstracts/_include-media.scss b/html/share/src/scss/abstracts/_include-media.scss new file mode 100644 index 0000000..bb5ccd5 --- /dev/null +++ b/html/share/src/scss/abstracts/_include-media.scss @@ -0,0 +1,567 @@ +@charset "UTF-8"; + +// _ _ _ _ _ +// (_) | | | | | (_) +// _ _ __ ___| |_ _ __| | ___ _ __ ___ ___ __| |_ __ _ +// | | '_ \ / __| | | | |/ _` |/ _ \ | '_ ` _ \ / _ \/ _` | |/ _` | +// | | | | | (__| | |_| | (_| | __/ | | | | | | __/ (_| | | (_| | +// |_|_| |_|\___|_|\__,_|\__,_|\___| |_| |_| |_|\___|\__,_|_|\__,_| +// +// Simple, elegant and maintainable media queries in Sass +// v1.4.9 +// +// http://include-media.com +// +// Authors: Eduardo Boucas (@eduardoboucas) +// Hugo Giraudel (@hugogiraudel) +// +// This project is licensed under the terms of the MIT license + + +//// +/// include-media library public configuration +/// @author Eduardo Boucas +/// @access public +//// + + +/// +/// Creates a list of global breakpoints +/// +/// @example scss - Creates a single breakpoint with the label `phone` +/// $breakpoints: ('phone': 320px); +/// +$breakpoints: ( + 'small': 480px, + 'medium': 640px, + 'large': 1024px, +) !default; + + +/// +/// Creates a list of static expressions or media types +/// +/// @example scss - Creates a single media type (screen) +/// $media-expressions: ('screen': 'screen'); +/// +/// @example scss - Creates a static expression with logical disjunction (OR operator) +/// $media-expressions: ( +/// 'retina2x': '(-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi)' +/// ); +/// +$media-expressions: ( + 'screen': 'screen', + 'print': 'print', + 'handheld': 'handheld', + 'landscape': '(orientation: landscape)', + 'portrait': '(orientation: portrait)', + 'retina2x': '(-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi), (min-resolution: 2dppx)', + 'retina3x': '(-webkit-min-device-pixel-ratio: 3), (min-resolution: 350dpi), (min-resolution: 3dppx)' +) !default; + + +/// +/// Defines a number to be added or subtracted from each unit when declaring breakpoints with exclusive intervals +/// +/// @example scss - Interval for pixels is defined as `1` by default +/// @include media('>128px') {} +/// +/// /* Generates: */ +/// @media (min-width: 129px) {} +/// +/// @example scss - Interval for ems is defined as `0.01` by default +/// @include media('>20em') {} +/// +/// /* Generates: */ +/// @media (min-width: 20.01em) {} +/// +/// @example scss - Interval for rems is defined as `0.1` by default, to be used with `font-size: 62.5%;` +/// @include media('>2.0rem') {} +/// +/// /* Generates: */ +/// @media (min-width: 2.1rem) {} +/// +$unit-intervals: ( + 'px': 1, + 'em': 0.01, + 'rem': 0.1, + '': 0 +) !default; + +/// +/// Defines whether support for media queries is available, useful for creating separate stylesheets +/// for browsers that don't support media queries. +/// +/// @example scss - Disables support for media queries +/// $im-media-support: false; +/// @include media('>=tablet') { +/// .foo { +/// color: tomato; +/// } +/// } +/// +/// /* Generates: */ +/// .foo { +/// color: tomato; +/// } +/// +$im-media-support: true !default; + +/// +/// Selects which breakpoint to emulate when support for media queries is disabled. Media queries that start at or +/// intercept the breakpoint will be displayed, any others will be ignored. +/// +/// @example scss - This media query will show because it intercepts the static breakpoint +/// $im-media-support: false; +/// $im-no-media-breakpoint: 'desktop'; +/// @include media('>=tablet') { +/// .foo { +/// color: tomato; +/// } +/// } +/// +/// /* Generates: */ +/// .foo { +/// color: tomato; +/// } +/// +/// @example scss - This media query will NOT show because it does not intercept the desktop breakpoint +/// $im-media-support: false; +/// $im-no-media-breakpoint: 'tablet'; +/// @include media('>=desktop') { +/// .foo { +/// color: tomato; +/// } +/// } +/// +/// /* No output */ +/// +$im-no-media-breakpoint: 'desktop' !default; + +/// +/// Selects which media expressions are allowed in an expression for it to be used when media queries +/// are not supported. +/// +/// @example scss - This media query will show because it intercepts the static breakpoint and contains only accepted media expressions +/// $im-media-support: false; +/// $im-no-media-breakpoint: 'desktop'; +/// $im-no-media-expressions: ('screen'); +/// @include media('>=tablet', 'screen') { +/// .foo { +/// color: tomato; +/// } +/// } +/// +/// /* Generates: */ +/// .foo { +/// color: tomato; +/// } +/// +/// @example scss - This media query will NOT show because it intercepts the static breakpoint but contains a media expression that is not accepted +/// $im-media-support: false; +/// $im-no-media-breakpoint: 'desktop'; +/// $im-no-media-expressions: ('screen'); +/// @include media('>=tablet', 'retina2x') { +/// .foo { +/// color: tomato; +/// } +/// } +/// +/// /* No output */ +/// +$im-no-media-expressions: ('screen', 'portrait', 'landscape') !default; + +//// +/// Cross-engine logging engine +/// @author Hugo Giraudel +/// @access private +//// + + +/// +/// Log a message either with `@error` if supported +/// else with `@warn`, using `feature-exists('at-error')` +/// to detect support. +/// +/// @param {String} $message - Message to log +/// +@function im-log($message) { + @if feature-exists('at-error') { + @error $message; + } @else { + @warn $message; + $_: noop(); + } + + @return $message; +} + + +/// +/// Wrapper mixin for the log function so it can be used with a more friendly +/// API than `@if im-log('..') {}` or `$_: im-log('..')`. Basically, use the function +/// within functions because it is not possible to include a mixin in a function +/// and use the mixin everywhere else because it's much more elegant. +/// +/// @param {String} $message - Message to log +/// +@mixin log($message) { + @if im-log($message) {} +} + + +/// +/// Function with no `@return` called next to `@warn` in Sass 3.3 +/// to trigger a compiling error and stop the process. +/// +@function noop() {} + +/// +/// Determines whether a list of conditions is intercepted by the static breakpoint. +/// +/// @param {Arglist} $conditions - Media query conditions +/// +/// @return {Boolean} - Returns true if the conditions are intercepted by the static breakpoint +/// +@function im-intercepts-static-breakpoint($conditions...) { + $no-media-breakpoint-value: map-get($breakpoints, $im-no-media-breakpoint); + + @if not $no-media-breakpoint-value { + @if im-log('`#{$im-no-media-breakpoint}` is not a valid breakpoint.') {} + } + + @each $condition in $conditions { + @if not map-has-key($media-expressions, $condition) { + $operator: get-expression-operator($condition); + $prefix: get-expression-prefix($operator); + $value: get-expression-value($condition, $operator); + + @if ($prefix == 'max' and $value <= $no-media-breakpoint-value) or + ($prefix == 'min' and $value > $no-media-breakpoint-value) { + @return false; + } + } @else if not index($im-no-media-expressions, $condition) { + @return false; + } + } + + @return true; +} + +//// +/// Parsing engine +/// @author Hugo Giraudel +/// @access private +//// + + +/// +/// Get operator of an expression +/// +/// @param {String} $expression - Expression to extract operator from +/// +/// @return {String} - Any of `>=`, `>`, `<=`, `<`, `≥`, `≤` +/// +@function get-expression-operator($expression) { + @each $operator in ('>=', '>', '<=', '<', '≥', '≤') { + @if str-index($expression, $operator) { + @return $operator; + } + } + + // It is not possible to include a mixin inside a function, so we have to + // rely on the `im-log(..)` function rather than the `log(..)` mixin. Because + // functions cannot be called anywhere in Sass, we need to hack the call in + // a dummy variable, such as `$_`. If anybody ever raise a scoping issue with + // Sass 3.3, change this line in `@if im-log(..) {}` instead. + $_: im-log('No operator found in `#{$expression}`.'); +} + + +/// +/// Get dimension of an expression, based on a found operator +/// +/// @param {String} $expression - Expression to extract dimension from +/// @param {String} $operator - Operator from `$expression` +/// +/// @return {String} - `width` or `height` (or potentially anything else) +/// +@function get-expression-dimension($expression, $operator) { + $operator-index: str-index($expression, $operator); + $parsed-dimension: str-slice($expression, 0, $operator-index - 1); + $dimension: 'width'; + + @if str-length($parsed-dimension) > 0 { + $dimension: $parsed-dimension; + } + + @return $dimension; +} + + +/// +/// Get dimension prefix based on an operator +/// +/// @param {String} $operator - Operator +/// +/// @return {String} - `min` or `max` +/// +@function get-expression-prefix($operator) { + @return if(index(('<', '<=', '≤'), $operator), 'max', 'min'); +} + + +/// +/// Get value of an expression, based on a found operator +/// +/// @param {String} $expression - Expression to extract value from +/// @param {String} $operator - Operator from `$expression` +/// +/// @return {Number} - A numeric value +/// +@function get-expression-value($expression, $operator) { + $operator-index: str-index($expression, $operator); + $value: str-slice($expression, $operator-index + str-length($operator)); + + @if map-has-key($breakpoints, $value) { + $value: map-get($breakpoints, $value); + } @else { + $value: to-number($value); + } + + $interval: map-get($unit-intervals, unit($value)); + + @if not $interval { + // It is not possible to include a mixin inside a function, so we have to + // rely on the `im-log(..)` function rather than the `log(..)` mixin. Because + // functions cannot be called anywhere in Sass, we need to hack the call in + // a dummy variable, such as `$_`. If anybody ever raise a scoping issue with + // Sass 3.3, change this line in `@if im-log(..) {}` instead. + $_: im-log('Unknown unit `#{unit($value)}`.'); + } + + @if $operator == '>' { + $value: $value + $interval; + } @else if $operator == '<' { + $value: $value - $interval; + } + + @return $value; +} + + +/// +/// Parse an expression to return a valid media-query expression +/// +/// @param {String} $expression - Expression to parse +/// +/// @return {String} - Valid media query +/// +@function parse-expression($expression) { + // If it is part of $media-expressions, it has no operator + // then there is no need to go any further, just return the value + @if map-has-key($media-expressions, $expression) { + @return map-get($media-expressions, $expression); + } + + $operator: get-expression-operator($expression); + $dimension: get-expression-dimension($expression, $operator); + $prefix: get-expression-prefix($operator); + $value: get-expression-value($expression, $operator); + + @return '(#{$prefix}-#{$dimension}: #{$value})'; +} + +/// +/// Slice `$list` between `$start` and `$end` indexes +/// +/// @access private +/// +/// @param {List} $list - List to slice +/// @param {Number} $start [1] - Start index +/// @param {Number} $end [length($list)] - End index +/// +/// @return {List} Sliced list +/// +@function slice($list, $start: 1, $end: length($list)) { + @if length($list) < 1 or $start > $end { + @return (); + } + + $result: (); + + @for $i from $start through $end { + $result: append($result, nth($list, $i)); + } + + @return $result; +} + +//// +/// String to number converter +/// @author Hugo Giraudel +/// @access private +//// + + +/// +/// Casts a string into a number +/// +/// @param {String | Number} $value - Value to be parsed +/// +/// @return {Number} +/// +@function to-number($value) { + @if type-of($value) == 'number' { + @return $value; + } @else if type-of($value) != 'string' { + $_: im-log('Value for `to-number` should be a number or a string.'); + } + + $first-character: str-slice($value, 1, 1); + $result: 0; + $digits: 0; + $minus: ($first-character == '-'); + $numbers: ('0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9); + + // Remove +/- sign if present at first character + @if ($first-character == '+' or $first-character == '-') { + $value: str-slice($value, 2); + } + + @for $i from 1 through str-length($value) { + $character: str-slice($value, $i, $i); + + @if not (index(map-keys($numbers), $character) or $character == '.') { + @return to-length(if($minus, -$result, $result), str-slice($value, $i)) + } + + @if $character == '.' { + $digits: 1; + } @else if $digits == 0 { + $result: $result * 10 + map-get($numbers, $character); + } @else { + $digits: $digits * 10; + $result: $result + map-get($numbers, $character) / $digits; + } + } + + @return if($minus, -$result, $result); +} + + +/// +/// Add `$unit` to `$value` +/// +/// @param {Number} $value - Value to add unit to +/// @param {String} $unit - String representation of the unit +/// +/// @return {Number} - `$value` expressed in `$unit` +/// +@function to-length($value, $unit) { + $units: ('px': 1px, 'cm': 1cm, 'mm': 1mm, '%': 1%, 'ch': 1ch, 'pc': 1pc, 'in': 1in, 'em': 1em, 'rem': 1rem, 'pt': 1pt, 'ex': 1ex, 'vw': 1vw, 'vh': 1vh, 'vmin': 1vmin, 'vmax': 1vmax); + + @if not index(map-keys($units), $unit) { + $_: im-log('Invalid unit `#{$unit}`.'); + } + + @return $value * map-get($units, $unit); +} + +/// +/// This mixin aims at redefining the configuration just for the scope of +/// the call. It is helpful when having a component needing an extended +/// configuration such as custom breakpoints (referred to as tweakpoints) +/// for instance. +/// +/// @author Hugo Giraudel +/// +/// @param {Map} $tweakpoints [()] - Map of tweakpoints to be merged with `$breakpoints` +/// @param {Map} $tweak-media-expressions [()] - Map of tweaked media expressions to be merged with `$media-expression` +/// +/// @example scss - Extend the global breakpoints with a tweakpoint +/// @include media-context(('custom': 678px)) { +/// .foo { +/// @include media('>phone', '<=custom') { +/// // ... +/// } +/// } +/// } +/// +/// @example scss - Extend the global media expressions with a custom one +/// @include media-context($tweak-media-expressions: ('all': 'all')) { +/// .foo { +/// @include media('all', '>phone') { +/// // ... +/// } +/// } +/// } +/// +/// @example scss - Extend both configuration maps +/// @include media-context(('custom': 678px), ('all': 'all')) { +/// .foo { +/// @include media('all', '>phone', '<=custom') { +/// // ... +/// } +/// } +/// } +/// +@mixin media-context($tweakpoints: (), $tweak-media-expressions: ()) { + // Save global configuration + $global-breakpoints: $breakpoints; + $global-media-expressions: $media-expressions; + + // Update global configuration + $breakpoints: map-merge($breakpoints, $tweakpoints) !global; + $media-expressions: map-merge($media-expressions, $tweak-media-expressions) !global; + + @content; + + // Restore global configuration + $breakpoints: $global-breakpoints !global; + $media-expressions: $global-media-expressions !global; +} + +//// +/// include-media public exposed API +/// @author Eduardo Boucas +/// @access public +//// + + +/// +/// Generates a media query based on a list of conditions +/// +/// @param {Arglist} $conditions - Media query conditions +/// +/// @example scss - With a single set breakpoint +/// @include media('>phone') { } +/// +/// @example scss - With two set breakpoints +/// @include media('>phone', '<=tablet') { } +/// +/// @example scss - With custom values +/// @include media('>=358px', '<850px') { } +/// +/// @example scss - With set breakpoints with custom values +/// @include media('>desktop', '<=1350px') { } +/// +/// @example scss - With a static expression +/// @include media('retina2x') { } +/// +/// @example scss - Mixing everything +/// @include media('>=350px', ' 0) { + @media #{unquote(parse-expression(nth($conditions, 1)))} { + // Recursive call + @include media(slice($conditions, 2)...) { + @content; + } + } + } +} diff --git a/html/share/src/scss/abstracts/_mixins.scss b/html/share/src/scss/abstracts/_mixins.scss new file mode 100644 index 0000000..89f5b10 --- /dev/null +++ b/html/share/src/scss/abstracts/_mixins.scss @@ -0,0 +1,112 @@ +// Font-size + Line-height + Kerning +// Usage: @include font-size(1, mobile) +// Add more true/false args to control what to output: font-size, line-height, kerning +@mixin font-size($size, $elem, $font-size: true, $line-height: false, $kerning: false, $adjust-font-size: 0) { + @if not map-has-key(map-get($font__scale, $elem), $size) { + @warn "'#{$size}' key does not exist in array!"; + } + @if ( $font-size != false ) { + font-size: get-font-size($size, $elem) + $adjust-font-size; + } + @if ( $line-height == true ) { + line-height: get-line-height($size, $elem); + } + @if ( $kerning == true ) { + letter-spacing: get-kerning($size, $elem); + } +} + +// Font Family +@mixin font-family($elem) { + font-family: unquote(get-font-family($elem)); +} + +// Font Weight +@mixin font-weight($elem) { + font-weight: get-font-weight($elem); +} + +// Anchor aspect +@mixin anchor-aspect($type: 'main') { + @if ($type == 'main') { // Base + color: color(primary, 1); + text-decoration: none; + + &:hover, + &:active { + outline: 0; + text-decoration: underline; + } + } @else if ($type == 'header') { + color: color(typography, 2i); + text-transform: uppercase; + text-decoration: none; + + &:hover, + &:active { + color: color(typography, 1i); + } + } @else if ($type == 'footer') { + color: color(typography, 2i); + text-decoration: none; + + &:hover, + &:active { + text-decoration: underline; + } + } +} + +@mixin shadow($layout: false) { + @if ( $layout == 'dark' ) { + box-shadow: 0 20px 48px rgba(darken(color(bg, 1), 35%), .2); + } @else { + box-shadow: 0 20px 48px rgba(color(typography, 1), .16); + } +} + +@mixin shadow-sm($layout: false) { + @if ( $layout == 'dark' ) { + box-shadow: 0 16px 24px rgba(darken(color(bg, 1), 35%), .2); + } @else { + box-shadow: 0 16px 24px rgba(color(typography, 1), .16); + } +} + +@mixin divider-mix($layout: false) { + display: block; + height: 1px; + @if ( $layout == 'dark' ) { + background: color(bg, 2i); + } @else { + background: color(bg, 3); + } +} + +@mixin divider($type: false, $layout: false) { + @if ( $type == 'before' ) { + position: relative; + + &::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + @include divider-mix($layout); + } + } @else if ($type == 'after') { + position: relative; + + &::after { + content: ''; + position: absolute; + bottom: 0; + left: 0; + width: 100%; + @include divider-mix($layout); + } + } @else { + @include divider-mix($layout); + } +} diff --git a/html/share/src/scss/abstracts/_variables.scss b/html/share/src/scss/abstracts/_variables.scss new file mode 100644 index 0000000..8c48715 --- /dev/null +++ b/html/share/src/scss/abstracts/_variables.scss @@ -0,0 +1,92 @@ +// -------------------------------------------- +// Colors ------------------------------------- +// Usage example: color(primary, main) +// -------------------------------------------- +$color: ( + typography: ( + 1: #161E2A, + 2: #6B7A90, + 1i: #FFF, + 2i: #606483 + ), + bg: ( + 1: #FFFFFF, + 2: #F3F4FF, + 3: #E4E8EE, + 1i: #0B0D19, + 2i: #1E233D + ), + primary: ( + 1: #4234F8, + 2: #7065FA, + 3: #1908F1, + 4: #E2E0FE + ), + secondary: ( + 1: #FF6C50, + 2: #FF816A, + 3: #FF411D, + 4: #FFD8D1 + ) +); + +// -------------------------------------------- +// Typography --------------------------------- +// -------------------------------------------- +$font__family: ( + base: '"Heebo", sans-serif', // font-family(base) + heading: '"Oxygen", sans-serif', // font-family(heading) + code: 'Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace', // font-family(code) + pre: '"Courier 10 Pitch", Courier, monospace' // font-family(pre) +); + +$font__sizes: ( + alpha: ( 44px, 54px, 0px ), // font-size, line-height, kerning (use '0' if don't want to output any kerning) + beta: ( 38px, 48px, 0px ), + gamma: ( 32px, 42px, 0px ), + delta: ( 28px, 34px, 0px ), + epsilon: ( 20px, 30px, -0.1px ), + zeta: ( 18px, 27px, -0.1px ), + eta: ( 16px, 24px, -0.1px ), + theta: ( 14px, 22px, 0px ) +); + +$font__scale: ( + desktop: ( // i.e. $breakpoint__m + $breakpoint__l (600 - 1024) + 1: map-get($font__sizes, alpha), // H1 + 2: map-get($font__sizes, beta), // H2 + 3: map-get($font__sizes, gamma), // H3 + 4: map-get($font__sizes, delta), // H4 + 5: map-get($font__sizes, epsilon), // Body, H5, H6 + 6: map-get($font__sizes, zeta), // Text small + 7: map-get($font__sizes, eta), // Text smaller + 8: map-get($font__sizes, theta) // Footer area + ), + mobile: ( // i.e. $breakpoint__xs + $breakpoint__s (up to 600) + 1: map-get($font__sizes, beta), // H1 + 2: map-get($font__sizes, gamma), // H2 + 3: map-get($font__sizes, delta), // H3 + 4: map-get($font__sizes, delta), // H4 + 5: map-get($font__sizes, epsilon), // Body, H5, H6 + 6: map-get($font__sizes, zeta), // Text small + 7: map-get($font__sizes, eta), // Text smaller + 8: map-get($font__sizes, theta) // Footer area + ) +); + +$font__weight: ( + regular: 400, // font__weight(regular) + medium: 500, // font__weight(medium) + semibold: 600, // font__weight(semibold) + bold: 700 // font__weight(bold) +); + +// -------------------------------------------- +// Structure ---------------------------------- +// -------------------------------------------- +$content__padding: ( + mobile: 16px, + desktop: 24px +); +$container__width: 1080px; +$container__width-sm: 800px; diff --git a/html/share/src/scss/base/_base.scss b/html/share/src/scss/base/_base.scss new file mode 100644 index 0000000..9a4da5c --- /dev/null +++ b/html/share/src/scss/base/_base.scss @@ -0,0 +1,103 @@ +html { + box-sizing: border-box; +} + +*, +*:before, +*:after { /* Inherit box-sizing to make it easier to change the property for components that leverage other behavior; see http://css-tricks.com/inheriting-box-sizing-probably-slightly-better-best-practice/ */ + box-sizing: inherit; +} + +body { + background: color(bg, 1); /* Fallback for when there is no custom background color defined. */ + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; +} + +hr { + border: 0; + @include divider(); + margin-top: 24px; + margin-bottom: 24px; +} + +ul, ol { + margin-top: 0; + margin-bottom: 24px; + padding-left: 24px; +} + +ul { + list-style: disc; +} + +ol { + list-style: decimal; +} + +li > ul, +li > ol { + margin-bottom: 0; +} + +dl { + margin-top: 0; + margin-bottom: 24px; +} + +dt { + @include font-weight(semibold); +} + +dd { + margin-left: 24px; + margin-bottom: 24px; +} + +img { + height: auto; /* Make sure images are scaled correctly. */ + max-width: 100%; /* Adhere to container width. */ + vertical-align: middle; +} + +figure { + margin: 24px 0; /* Extra wide images within figure tags don't overflow the content area. */ +} + +figcaption { + @include font-size(7, mobile, true, true); + padding: 8px 0; +} + +img, +svg { + display: block; +} + +// tables +table { + border-collapse: collapse; + margin-bottom: 24px; + width: 100%; +} + +tr { + border-bottom: 1px solid color(bg, 3); +} + +th { + text-align: left; +} + +th, +td { + padding: 10px 16px; + + &:first-child { + padding-left: 0; + } + + &:last-child { + padding-right: 0; + } +} diff --git a/html/share/src/scss/base/_helpers.scss b/html/share/src/scss/base/_helpers.scss new file mode 100644 index 0000000..bfb7ab8 --- /dev/null +++ b/html/share/src/scss/base/_helpers.scss @@ -0,0 +1,469 @@ +.container, +.container-sm { + width: 100%; + margin: 0 auto; + padding-left: get-content-padding(mobile); + padding-right: get-content-padding(mobile); + + @include media( '>small' ) { + padding-left: get-content-padding(desktop); + padding-right: get-content-padding(desktop); + } +} + +.container { + max-width: $container__width + ( get-content-padding(desktop) * 2 ); +} + +.container-sm { + max-width: $container__width-sm + ( get-content-padding(desktop) * 2 ); +} + +.container { + + .container-sm { + max-width: $container__width-sm; + padding-left: 0; + padding-right: 0; + } +} + +/* Text meant only for screen readers. */ +.screen-reader-text { + clip: rect(1px, 1px, 1px, 1px); + position: absolute !important; + height: 1px; + width: 1px; + overflow: hidden; + word-wrap: normal !important; /* Many screen reader and browser combinations announce broken words as they would appear visually. */ + + &:focus { + border-radius: 2px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6); + clip: auto !important; + display: block; + @include font-size(8, mobile, true, false, true); + @if ( get-font-size(8, desktop) != get-font-size(8, mobile) ) { + @include media( '>medium' ) { + @include font-size(8, desktop, true, false, true); + } + } + @include font-weight(semibold); + line-height: 16px; + text-decoration: none; + text-transform: uppercase; + background-color: color(bg, 1); + color: color(primary, 1) !important; + border: none; + height: auto; + left: 8px; + padding: 16px 40px; + top: 8px; + width: auto; + z-index: 100000; + } +} + +.list-reset { + list-style: none; + padding: 0; +} + +.text-left { + text-align: left; +} + +.text-center { + text-align: center; +} + +.text-right { + text-align: right; +} + +.text-primary { + color: color(primary, 1); +} + +.text-secondary { + color: color(secondary, 1); +} + +.has-top-divider { + @include divider(before); +} + +.has-bottom-divider { + @include divider(after); +} + +.m-0 { + margin: 0; +} + +.mt-0 { + margin-top: 0; +} + +.mr-0 { + margin-right: 0; +} + +.mb-0 { + margin-bottom: 0; +} + +.ml-0 { + margin-left: 0; +} + +.m-8 { + margin: 8px; +} + +.mt-8 { + margin-top: 8px; +} + +.mr-8 { + margin-right: 8px; +} + +.mb-8 { + margin-bottom: 8px; +} + +.ml-8 { + margin-left: 8px; +} + +.m-16 { + margin: 16px; +} + +.mt-16 { + margin-top: 16px; +} + +.mr-16 { + margin-right: 16px; +} + +.mb-16 { + margin-bottom: 16px; +} + +.ml-16 { + margin-left: 16px; +} + +.m-24 { + margin: 24px; +} + +.mt-24 { + margin-top: 24px; +} + +.mr-24 { + margin-right: 24px; +} + +.mb-24 { + margin-bottom: 24px; +} + +.ml-24 { + margin-left: 24px; +} + +.m-32 { + margin: 32px; +} + +.mt-32 { + margin-top: 32px; +} + +.mr-32 { + margin-right: 32px; +} + +.mb-32 { + margin-bottom: 32px; +} + +.ml-32 { + margin-left: 32px; +} + +.m-40 { + margin: 40px; +} + +.mt-40 { + margin-top: 40px; +} + +.mr-40 { + margin-right: 40px; +} + +.mb-40 { + margin-bottom: 40px; +} + +.ml-40 { + margin-left: 40px; +} + +.m-48 { + margin: 48px; +} + +.mt-48 { + margin-top: 48px; +} + +.mr-48 { + margin-right: 48px; +} + +.mb-48 { + margin-bottom: 48px; +} + +.ml-48 { + margin-left: 48px; +} + +.m-56 { + margin: 56px; +} + +.mt-56 { + margin-top: 56px; +} + +.mr-56 { + margin-right: 56px; +} + +.mb-56 { + margin-bottom: 56px; +} + +.ml-56 { + margin-left: 56px; +} + +.m-64 { + margin: 64px; +} + +.mt-64 { + margin-top: 64px; +} + +.mr-64 { + margin-right: 64px; +} + +.mb-64 { + margin-bottom: 64px; +} + +.ml-64 { + margin-left: 64px; +} + +.p-0 { + padding: 0; +} + +.pt-0 { + padding-top: 0; +} + +.pr-0 { + padding-right: 0; +} + +.pb-0 { + padding-bottom: 0; +} + +.pl-0 { + padding-left: 0; +} + +.p-8 { + padding: 8px; +} + +.pt-8 { + padding-top: 8px; +} + +.pr-8 { + padding-right: 8px; +} + +.pb-8 { + padding-bottom: 8px; +} + +.pl-8 { + padding-left: 8px; +} + +.p-16 { + padding: 16px; +} + +.pt-16 { + padding-top: 16px; +} + +.pr-16 { + padding-right: 16px; +} + +.pb-16 { + padding-bottom: 16px; +} + +.pl-16 { + padding-left: 16px; +} + +.p-24 { + padding: 24px; +} + +.pt-24 { + padding-top: 24px; +} + +.pr-24 { + padding-right: 24px; +} + +.pb-24 { + padding-bottom: 24px; +} + +.pl-24 { + padding-left: 24px; +} + +.p-32 { + padding: 32px; +} + +.pt-32 { + padding-top: 32px; +} + +.pr-32 { + padding-right: 32px; +} + +.pb-32 { + padding-bottom: 32px; +} + +.pl-32 { + padding-left: 32px; +} + +.p-40 { + padding: 40px; +} + +.pt-40 { + padding-top: 40px; +} + +.pr-40 { + padding-right: 40px; +} + +.pb-40 { + padding-bottom: 40px; +} + +.pl-40 { + padding-left: 40px; +} + +.p-48 { + padding: 48px; +} + +.pt-48 { + padding-top: 48px; +} + +.pr-48 { + padding-right: 48px; +} + +.pb-48 { + padding-bottom: 48px; +} + +.pl-48 { + padding-left: 48px; +} + +.p-56 { + padding: 56px; +} + +.pt-56 { + padding-top: 56px; +} + +.pr-56 { + padding-right: 56px; +} + +.pb-56 { + padding-bottom: 56px; +} + +.pl-56 { + padding-left: 56px; +} + +.p-64 { + padding: 64px; +} + +.pt-64 { + padding-top: 64px; +} + +.pr-64 { + padding-right: 64px; +} + +.pb-64 { + padding-bottom: 64px; +} + +.pl-64 { + padding-left: 64px; +} + +/* Reveal animations */ +.sr { + + .has-animations { + + .is-revealing { + visibility: hidden; + } + } +} diff --git a/html/share/src/scss/base/_typography.scss b/html/share/src/scss/base/_typography.scss new file mode 100644 index 0000000..589e40b --- /dev/null +++ b/html/share/src/scss/base/_typography.scss @@ -0,0 +1,263 @@ +html { + @include font-size(5, mobile, true, true); + @if ( get-font-size(5, desktop) != get-font-size(5, mobile) ) { + @include media( '>medium' ) { + @include font-size(5, desktop, true, true, true); + } + } +} + +body { + color: color(typography, 2); + font-size: 1rem; +} + +body, +button, +input, +select, +textarea { + @include font-family(base); +} + +a { + @include anchor-aspect(main); +} + +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6 { + clear: both; + color: color(typography, 1); + @if ( get-font-family(heading) != get-font-family(base) ) { + @include font-family(heading); + } + @include font-weight(semibold); +} + +h1, +.h1 { + @include font-size(1, mobile, true, true, true); + @if ( get-font-size(1, desktop) != get-font-size(1, mobile) ) { + @include media( '>medium' ) { + @include font-size(1, desktop, true, true, true); + } + } +} + +h2, +.h2 { + @include font-size(2, mobile, true, true, true); + @if ( get-font-size(2, desktop) != get-font-size(2, mobile) ) { + @include media( '>medium' ) { + @include font-size(2, desktop, true, true, true); + } + } +} + +h3, +.h3, +blockquote { + @include font-size(3, mobile, true, true, true); + @if ( get-font-size(3, desktop) != get-font-size(3, mobile) ) { + @include media( '>medium' ) { + @include font-size(3, desktop, true, true, true); + } + } +} + +h4, +.h4 { + @include font-size(4, mobile, true, true, true); + @if ( get-font-size(4, desktop) != get-font-size(4, mobile) ) { + @include media( '>medium' ) { + @include font-size(4, desktop, true, true, true); + } + } +} + +h5, +.h5, +h6, +.h6 { + @include font-size(5, mobile, true, true, true); + @if ( get-font-size(5, desktop) != get-font-size(5, mobile) ) { + @include media( '>medium' ) { + @include font-size(5, desktop, true, true, true); + } + } +} + +@include media( '<=medium' ) { + + .h1-mobile { + @include font-size(1, mobile, true, true, true); + } + + .h2-mobile { + @include font-size(2, mobile, true, true, true); + } + + .h3-mobile { + @include font-size(3, mobile, true, true, true); + } + + .h4-mobile { + @include font-size(4, mobile, true, true, true); + } + + .h5-mobile, + .h6-mobile { + @include font-size(5, mobile, true, true, true); + } +} + +.text-light { + color: color(typography, 2i); + + a { + color: color(typography, 2i); + } +} + +.text-light { + + h1, h2, h3, h4, h5, h6, + .h1, .h2, .h3, .h4, .h5, .h6 { + color: color(typography, 1i) !important; + } +} + +.text-sm { + @include font-size(6, mobile, true, true, true); + @if ( get-font-size(6, desktop) != get-font-size(6, mobile) ) { + @include media( '>medium' ) { + @include font-size(6, desktop, true, true, true); + } + } +} + +.text-xs { + @include font-size(7, mobile, true, true, true); + @if ( get-font-size(7, desktop) != get-font-size(7, mobile) ) { + @include media( '>medium' ) { + @include font-size(7, desktop, true, true, true); + } + } +} + +h1, h2, +.h1, .h2 { + margin-top: 48px; + margin-bottom: 16px; +} + +h3, +.h3 { + margin-top: 36px; + margin-bottom: 12px; +} + +h4, h5, h6, +.h4, .h5, .h6 { + margin-top: 24px; + margin-bottom: 4px; +} + +p { + margin-top: 0; + margin-bottom: 24px; +} + +dfn, cite, em, i { + font-style: italic; +} + +blockquote { + color: color(typography, 2); + font-style: italic; + margin-top: 24px; + margin-bottom: 24px; + margin-left: 24px; + + &::before { + content: "\201C"; + } + + &::after { + content: "\201D"; + } + + p { + display: inline; + } +} + +address { + color: color(typography, 2); + border-width: 1px 0; + border-style: solid; + border-color: color(bg, 3); + padding: 24px 0; + margin: 0 0 24px; +} + +pre, +pre h1, +pre h2, +pre h3, +pre h4, +pre h5, +pre h6, +pre .h1, +pre .h2, +pre .h3, +pre .h4, +pre .h5, +pre .h6 { + @include font-family(pre); +} + +pre, code, kbd, tt, var { + background: color(bg, 2); +} + +pre { + @include font-size(7, mobile, true, true); + margin-bottom: 1.6em; + max-width: 100%; + overflow: auto; + padding: 24px; + margin-top: 24px; + margin-bottom: 24px; +} + +code, kbd, tt, var { + @include font-family(code); + @include font-size(7, mobile, true); + padding: 2px 4px; +} + +abbr, acronym { + cursor: help; +} + +mark, ins { + text-decoration: none; +} + +small { + @include font-size(6, mobile, true, true, true); +} + +b, +strong { + @include font-weight(semibold); +} + +button, +input, +select, +textarea, +label { + @include font-size(5, mobile, true, true); +} diff --git a/html/share/src/scss/components/_buttons.scss b/html/share/src/scss/components/_buttons.scss new file mode 100644 index 0000000..180f084 --- /dev/null +++ b/html/share/src/scss/components/_buttons.scss @@ -0,0 +1,171 @@ +.button { + display: inline-flex; + @include font-size(8, mobile, true, false, true); + @if ( get-font-size(8, desktop) != get-font-size(8, mobile) ) { + @include media( '>medium' ) { + @include font-size(8, desktop, true, false, true); + } + } + @include font-weight(bold); + line-height: 16px; + text-decoration: none !important; + text-transform: uppercase; + background-color: color(bg, 1); + background: color(bg, 1); + color: color(primary, 1) !important; + border: none; + border-radius: 2px; + cursor: pointer; + justify-content: center; + padding: 16px 40px; + height: 48px; + text-align: center; + white-space: nowrap; + + &:active { + outline: 0; + } + + &::before { + border-radius: 2px; + } +} + +.button-shadow { + position: relative; + + &::before { + content: ''; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + box-shadow: 0 8px 16px rgba(color(typography, 1), .12); + mix-blend-mode: multiply; + transition: box-shadow .15s ease; + } + + &:hover { + + &::before { + box-shadow: 0 8px 16px rgba(color(typography, 1), .16); + } + } +} + +.button-sm { + padding: 8px 24px; + height: 32px; + + &.button-shadow { + + &::before { + box-shadow: 0 4px 16px rgba(color(typography, 1), .12); + } + + &:hover { + + &::before { + box-shadow: 0 4px 16px rgba(color(typography, 1), .16); + } + } + } +} + +.button-primary, +.button-secondary { + color: color(typography, 1i) !important; + transition: background .15s ease; +} + +.button-primary { + background: color(primary, 1); + + &:hover { + background: lighten(color(primary, 1), 2%); + } + + &.button-shadow { + + &::before { + box-shadow: 0 8px 16px rgba(color(primary, 1), .24); + } + + &:hover { + + &::before { + box-shadow: 0 8px 16px rgba(color(primary, 1), .32); + } + } + } + + .button-sm { + + &.button-shadow { + + &::before { + box-shadow: 0 4px 16px rgba(color(primary, 1), .24); + } + + &:hover { + + &::before { + box-shadow: 0 4px 16px rgba(color(primary, 1), .32); + } + } + } + } +} + +.button-secondary { + background: color(secondary, 1); + + &:hover { + background: lighten(color(secondary, 1), 3%); + } + + &.button-shadow { + + &::before { + box-shadow: 0 8px 16px rgba(color(secondary, 1), .24); + } + + &:hover { + + &::before { + box-shadow: 0 8px 16px rgba(color(secondary, 1), .32); + } + } + } + + .button-sm { + + &.button-shadow { + + &::before { + box-shadow: 0 4px 16px rgba(color(secondary, 1), .24); + } + + &:hover { + + &::before { + box-shadow: 0 4px 16px rgba(color(secondary, 1), .32); + } + } + } + } +} + +.button-block { + display: flex; + width: 100%; +} + +@include media( '<=medium' ) { + + .button-wide-mobile { + width: 100%; + max-width: 280px; + } +} diff --git a/html/share/src/scss/layout/_cta.scss b/html/share/src/scss/layout/_cta.scss new file mode 100644 index 0000000..3dd0103 --- /dev/null +++ b/html/share/src/scss/layout/_cta.scss @@ -0,0 +1,18 @@ +.cta { + + .section-paragraph { + margin-bottom: 32px; + } +} + +@include media( '>medium' ) { + + .cta { + + .section-paragraph { + margin-bottom: 32px; + padding-left: 72px; + padding-right: 72px; + } + } +} diff --git a/html/share/src/scss/layout/_features-extended.scss b/html/share/src/scss/layout/_features-extended.scss new file mode 100644 index 0000000..32c3b47 --- /dev/null +++ b/html/share/src/scss/layout/_features-extended.scss @@ -0,0 +1,164 @@ +.has-animations { + + .features-extended { + opacity: 0; + } + + &.is-loaded { + + .features-extended { + opacity: 1; + } + } +} + +.features-extended-header { + margin-bottom: 32px; +} + +.features-extended-wrap { + display: flex; + flex-wrap: wrap; + margin-top: -24px; + + &:last-of-type { + margin-bottom: -24px; + } + + &:not(:last-of-type) { + margin-bottom: 24px; + } +} + +.feature-extended { + padding: 24px 0; +} + +.feature-extended-image { + position: relative; + margin-bottom: 32px; + + img, + svg { + width: 100%; + max-width: 296px; + height: auto; + margin-left: auto; + margin-right: auto; + overflow: visible; + } +} + +.feature-extended-body { + text-align: center; +} + +@include media( '>medium' ) { + + .features-extended { + + .container { + /* image width (440) + padding (96) + text width (360) = 896 */ + max-width: 864px + ( get-content-padding(desktop) * 2 ); + } + + .section-inner { + padding-bottom: 128px; + } + + .section-paragraph { + padding-left: 72px; + padding-right: 72px; + margin-bottom: 0; + } + } + + .features-extended-header { + margin-bottom: 80px; + } + + .features-extended-wrap { + margin-top: -64px; + + &:last-of-type { + margin-bottom: -64px; + } + + &:not(:last-of-type) { + margin-bottom: 64px; + } + } + + .feature-extended { + display: flex; + flex-wrap: nowrap; + align-items: stretch; + justify-content: flex-end; + padding: 64px 0; + + .feature-extended-image { + width: 440px; + margin-right: 96px; + margin-bottom: 0; + + img, + svg { + width: auto; + + &.device-mockup { + max-width: 296px; + } + } + } + + &:nth-child(even) { + justify-content: flex-start; + + .feature-extended-image { + order: 1; + margin-left: 96px; + margin-right: 0; + } + } + } + + .feature-extended-body { + /* Align vertically */ + display: flex; + flex-direction: column; + justify-content: center; + /* Align vertically, end */ + flex-shrink: 0; + width: 360px; + text-align: left; + } +} + +@include media( '>large' ) { + + .features-extended { + + .container { + /* image width (440) + padding (64) + text width (392) = 896 */ + max-width: 896px + ( get-content-padding(desktop) * 2 ); + } + } + + .feature-extended { + + .feature-extended-image { + margin-right: 64px; + } + + &:nth-child(even) { + + .feature-extended-image { + margin-left: 64px; + } + } + } + + .feature-extended-body { + width: 392px; + } +} diff --git a/html/share/src/scss/layout/_footer.scss b/html/share/src/scss/layout/_footer.scss new file mode 100644 index 0000000..b1829db --- /dev/null +++ b/html/share/src/scss/layout/_footer.scss @@ -0,0 +1,128 @@ +.site-footer { + position: relative; + background: color(bg, 1i); + + &::before { + content: ''; + position: absolute; + top: -76px; + left: calc(50% - 360px); + width: 720px; + height: 291px; + background-image: url('../images/footer-bg.svg'); + background-size: 720px 291px; + background-repeat: no-repeat; + } + + .footer-particles-container { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + } +} + +.site-footer-bottom { + @include font-size(8, mobile, true, true, true); + @if ( get-font-size(8, desktop) != get-font-size(8, mobile) ) { + @include media( '>medium' ) { + @include font-size(8, desktop, true, true, true); + } + } + color: color(typography, 3); + z-index: 1; + + a { + @include anchor-aspect(footer); + } +} + +.site-footer-inner { + position: relative; /* To display all elements above the background color */ + display: flex; + flex-wrap: wrap; + padding-top: 48px; + padding-bottom: 48px; + @include divider(before, dark); +} + +.footer-brand, +.footer-links, +.footer-social-links, +.footer-copyright { + flex: none; + width: 100%; + display: inline-flex; + justify-content: center; +} + +.footer-brand, +.footer-links, +.footer-social-links { + margin-bottom: 24px; +} + +.footer-links, +.footer-social-links { + + li { + + + li { + margin-left: 16px; + } + } +} + +.footer-social-links { + + li { + display: inline-flex; + + a { + padding: 8px; + } + } +} + +@include media( '>medium' ) { + + .site-footer { + + &::before { + top: -152px; + left: calc(50% - 720px); + width: 1440px; + height: 582px; + background-size: 1440px 582px; + } + } + + .site-footer-inner { + justify-content: space-between; + padding-top: 64px; + padding-bottom: 64px; + } + + .footer-brand, + .footer-links, + .footer-social-links, + .footer-copyright { + flex: 50%; + } + + .footer-brand, + .footer-copyright { + justify-content: flex-start; + } + + .footer-links, + .footer-social-links { + justify-content: flex-end; + } + + .footer-links { + order: 1; + margin-bottom: 0; + } +} diff --git a/html/share/src/scss/layout/_header.scss b/html/share/src/scss/layout/_header.scss new file mode 100644 index 0000000..6667f3e --- /dev/null +++ b/html/share/src/scss/layout/_header.scss @@ -0,0 +1,36 @@ +.site-header { + padding: 24px 0; + position: absolute; + top: 0; + left: 0; + width: 100%; + z-index: 1; +} + +.site-header-inner { + position: relative; /* To display all elements above the background color */ + display: flex; + justify-content: space-between; + align-items: center; +} + +.header-links { + display: inline-flex; + + li { + display: inline-flex; + } + + a:not(.button) { + @include font-size(7, mobile, true, true, true); + @if ( get-font-size(7, desktop) != get-font-size(7, mobile) ) { + @include media( '>medium' ) { + @include font-size(7, desktop, true, true, true); + } + } + @include font-weight(semibold); + @include anchor-aspect(header); + line-height: 16px; + padding: 8px 24px; + } +} diff --git a/html/share/src/scss/layout/_hero.scss b/html/share/src/scss/layout/_hero.scss new file mode 100644 index 0000000..93bbdc5 --- /dev/null +++ b/html/share/src/scss/layout/_hero.scss @@ -0,0 +1,185 @@ +.hero { + position: relative; + padding-top: 128px; + padding-bottom: 88px; + z-index: 0; + + .hero-bg { + position: absolute; + top: 0; + bottom: 42%; + left: 0; + right: 0; + background: color(bg, 1i); + z-index: -2; + } + + .hero-particles-container { + position: absolute; + top: 0; + bottom: 42%; + left: 0; + right: 0; + } + + &::before, + &::after { + content: ''; + position: absolute; + left: calc(50% - 360px); + width: 720px; + background-repeat: no-repeat; + } + + &::before { + top: 0; + height: 159px; + background-image: url('../images/hero-bg-top.svg'); + background-size: 720px 159px; + } + + &::after { + bottom: 42%; + height: 173px; + background-image: url('../images/hero-bg-bottom.svg'); + background-size: 720px 173px; + } +} + +.hero-inner { + position: relative; + z-index: 1; +} + +.hero-copy { + position: relative; /* To display elements above hero illustrations */ + margin-bottom: 48px; +} + +@include media( '>medium' ) { + + .hero { + padding-top: 160px; + padding-bottom: 128px; + + &::before, + &::after { + left: calc(50% - 720px); + width: 1440px; + } + + &::before { + height: 318px; + background-size: 1440px 318px; + } + + &::after { + height: 347px; + background-size: 1440px 347px; + } + } + + .hero-copy { + margin-bottom: 88px; + } + + .hero-paragraph { + padding-left: 72px; + padding-right: 72px; + } +} + +.has-animations { + + .hero .hero-bg, + .hero::before, + .hero::after, + .hero-particles-container, + .site-header, + .hero-title, + .hero-paragraph, + .hero-cta, + .hero .mockup-bg, + .hero .device-mockup { + opacity: 0; + } + + &.is-loaded { + + .hero { + + .hero-bg { + animation: heroBg .6s cubic-bezier(0.215, 0.61, 0.355, 1) forwards; + } + + &::before, + &::after { + animation: heroFadeIn .6s ease forwards .45s; + } + } + + .site-header, + .hero-particles-container, + .hero .mockup-bg { + animation: heroFadeIn .6s ease forwards .45s; + } + + .hero-title { + animation: heroContent .6s cubic-bezier(0.215, 0.61, 0.355, 1) forwards .15s; + } + + .hero-paragraph { + animation: heroContent .6s cubic-bezier(0.215, 0.61, 0.355, 1) forwards .3s; + } + + .hero-cta { + animation: heroContent .6s cubic-bezier(0.215, 0.61, 0.355, 1) forwards .45s; + } + + .hero .device-mockup { + animation: heroMockup .6s ease forwards .6s; + } + } +} + +@keyframes heroBg { + from { + transform: scaleY(0) scaleX(1.2) skewY(30deg); + opacity: 1; + } + to { + transform: scaleY(1) scaleX(1) skewY(0); + opacity: 1; + } +} + +@keyframes heroContent { + from { + transform: translateY(40px) skewY(2deg); + opacity: 0; + } + to { + transform: translateY(0) skewY(0); + opacity: 1; + } +} + +@keyframes heroMockup { + from { + transform: translateY(80px); + opacity: 0; + } + to { + transform: translateY(0); + opacity: 1; + } +} + +@keyframes heroFadeIn { + from { + opacity: 0; + } + to { + opacity: 1; + } +} diff --git a/html/share/src/scss/layout/_main.scss b/html/share/src/scss/layout/_main.scss new file mode 100644 index 0000000..286a05c --- /dev/null +++ b/html/share/src/scss/layout/_main.scss @@ -0,0 +1,36 @@ +.is-boxed { + background: color(bg, 1); +} + +.body-wrap { + background: color(bg, 1); + overflow: hidden; + /* Sticky footer */ + display: flex; + flex-direction: column; + min-height: 100vh; +} + +.boxed-container { + max-width: 1440px; + margin: 0 auto; + @include shadow; +} + +main { + flex: 1 0 auto; +} + +.section-inner { + position: relative; /* To always display inner elements above pseudo decorative stuff */ + padding-top: 48px; + padding-bottom: 48px; +} + +@include media( '>medium' ) { + + .section-inner { + padding-top: 88px; + padding-bottom: 88px; + } +} diff --git a/html/share/src/scss/layout/_mockups.scss b/html/share/src/scss/layout/_mockups.scss new file mode 100644 index 0000000..611646d --- /dev/null +++ b/html/share/src/scss/layout/_mockups.scss @@ -0,0 +1,26 @@ +.mockup-container { + position: relative; +} + +.mockup-bg { + pointer-events: none; + + img, + svg { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: auto !important; + height: auto; + max-width: 300% !important; + } +} + +.device-mockup { + position: relative; + width: 350px; + height: auto; + margin: 0 auto; + z-index: 1; +} diff --git a/html/share/src/scss/style.scss b/html/share/src/scss/style.scss new file mode 100644 index 0000000..7d4e7fc --- /dev/null +++ b/html/share/src/scss/style.scss @@ -0,0 +1,69 @@ +/*-------------------------------------------------------------- +# Variables, functions and mixins +--------------------------------------------------------------*/ +@import "abstracts/variables", + "abstracts/functions", + "abstracts/mixins", + 'abstracts/include-media'; + +/*-------------------------------------------------------------- +1.0 Normalize + * normalize.css v7.0.0 | MIT License + * github.com/necolas/normalize.css +--------------------------------------------------------------*/ +@import "normalize"; + +/*-------------------------------------------------------------- +# Base +--------------------------------------------------------------*/ +@import "base/base"; + +/*-------------------------------------------------------------- +# Typography +--------------------------------------------------------------*/ +@import "base/typography"; + +/*-------------------------------------------------------------- +# Helpers +--------------------------------------------------------------*/ +@import "base/helpers"; + +/*-------------------------------------------------------------- +# Buttons +--------------------------------------------------------------*/ +@import "components/buttons"; + +/*-------------------------------------------------------------- +# Header +--------------------------------------------------------------*/ +@import "layout/header"; + +/*-------------------------------------------------------------- +# Hero +--------------------------------------------------------------*/ +@import "layout/hero"; + +/*-------------------------------------------------------------- +# Mockup +--------------------------------------------------------------*/ +@import "layout/mockups"; + +/*-------------------------------------------------------------- +# Features extended +--------------------------------------------------------------*/ +@import "layout/features-extended"; + +/*-------------------------------------------------------------- +# CTA +--------------------------------------------------------------*/ +@import "layout/cta"; + +/*-------------------------------------------------------------- +# Site content +--------------------------------------------------------------*/ +@import "layout/main"; + +/*-------------------------------------------------------------- +# Footer +--------------------------------------------------------------*/ +@import "layout/footer";