cehua_LC
2018-08-21 e94adc958cea62d482cde83d3ef367aec73f12f1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
lù1[c @s`ddlZddlZddlZddlZddlZddlZddlZddlZddlZddl    Z    ddl
Z
ddl Z ddl Z ddl mZddlZddlZddlZddlZejdƒdZdad„Zd„Zd„Zd    „Zd
„Zd „Zd „Zd d„Zd„Zd„Zd„Z d„Z!d„Z"d„Z#d„Z$dd„Z%d„Z&d„Z'd„Z(d„Z)d„Z*d„Z+e j,d„Z-d„Z.d„Z/d „Z0d!„Z1d"„Z2d#„Z3d$„Z4d%„Z5ej6d&„Z7d'„Z8d(„Z9d)„Z:d*„Z;d+„Z<d,„Z=d-„Z>d.„Z?d/„Z@d0„ZAd1„ZBejƒZCejDƒZEejFƒZGd2„ZHd3„ZId4„ZJd5„ZKd6„ZLd7„ZMd8„ZNd9„ZOd:„ZPd;„ZQd<„ZRd=„ZSd>„ZTd?„ZUd@„ZVdA„ZWdB„ZDdC„ZXdddD„ZYdddE„ZZdddF„Z[dG„Z\dH„Z]dI„Z^dJ„Z_dK„Z`dL„ZadM„ZbdN„ZcdOZddP„ZedQ„ZfdR„ZgdS„ZhdT„ZidU„ZjdV„ZkdWZldX„ZmdY„ZndddddddddddZ„
Zod[„Zpdeqd\„Zrd]„Zsd^„Ztd_„Zud`„Zvddda„Zxdb„Zydc„Zzddd„Z{dde„Z|df„Z}e~dg„Zdh„Z€e~di„Zdj„Z‚dk„Zƒdl„Z„dm„Z…dn„Z†do„Z‡dp„Zˆdq„Z‰dr„ZŠds„Z‹ej6dt„ZŒej6du„Zej6dv„ZŽdw„Zdx„Zdy„Z‘dz„Z’d{„Z“d|„Z”d}„Z•d~„Z–d„Z—dd€„Z˜e~gd„Z™e~gd‚„Zše~gdƒ„Z›e~d„„Zœdddd…„Ze~d†„Zžd‡„ZŸdˆ„Z dd‰dŠ„Z¡ddd‹„Z¢dŒ„Z£dS(iÿÿÿÿN(tDecimaliÐticCsftjƒ||}t|ƒ}x?|D]7}t||ƒ}tjj|ƒrTq'nt|ƒq'WdS(N(tChConfigt
GetAppPatht__GetFuncFileNameListt__GetSysModulesScriptPathtsystmodulesthas_keyt
__import__(tpathDirt    importDirt
scriptPatht fileNameListtfileNamet
importPath((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyt    ImportAllJs  cCsttƒ}|jƒ}||jtjƒtjtjkr?dS|jtj|ƒtƒrit|ƒdSt    ƒdS(N(
t GetGameWorldtGetTickt GetTickByTypeRtTYPE_Map_Tick_ReloadScripttTYPE_Map_Tick_Timet SetTickByTypet__GetPsycoIsOpent PsycoReloadt__ReloadScript(R R t    gameWorldttick((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyt ReloadScript`s         
cCszxbtjjƒD]Q\}}y.|dkr?td|ƒwnt|ƒWqtk
r`qqXqWtdtƒƒdS(Nt
PyGameDatas%s Ä£¿é²»ÖضÁ!sReload Begin : time = %s(R(RRtitemstDebugLogtreloadt    ExceptiontLogtGetCurrentDataTimeStr(tnamet
reloadPath((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyRys   cCs¾g}tjj|ƒs*td|ƒ|Stj|ƒ}x~|D]v}|jdƒ}t|ƒdkrmq@n|\}}|jdƒdkr”q@n|tj    kr©q@n|j
|ƒq@W|S(Ns&ReloadScript Err, path = %s is not dirs.it__init__i( tostpathtisdirtErrLogtlistdirtsplittlentfindRtTYPE_Load_Module_Exttappend(R R t    filesListtfilet
fileStructRtfileExt((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyRŒs   cCs'|}|dkr#|d|}n|S(NRs.((R RtsysModulesPath((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyR®s cCsttj|t|ƒƒƒS(N(tinttmathtceiltfloat(txtdiv((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyt GetIntUpper»scCsttj|ƒƒS(N(R6R7R8(R:((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyt GetFloatUpperÃsicCs;td|ƒ}tj|d||dƒ}|t|ƒS(Ni
i(tpowtrandomtrandintR9(tminXtmaxXtprecistmultipletran((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyt GetFloatRanØscCsh||kr||krdStj||||ƒ}ttj|ƒƒ}|dkrd|d}n|S(Niih(R7tatan2R6tdegrees(tStartXtStartYtEndXtEndYtradtth((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytGetAngleæs  c CsZtƒ}tjtj||dƒtj||dƒƒ}d}d}|dkrs|||}|||}nx¯tdt|ƒƒD]˜}    t||    d|||    d|ƒ}
t||    d|||    d|ƒ} x?t|
| ƒD].} |j| ƒdkrqïn|j    | ƒqïWq‰Wddg|krVd|krV|j
ddƒn|S(Nigð?gii(ii(ii( tlistR7tsqrtR>trangeR-tFiveInOtherOutt    GetAllPostcountR0tinsert( tmatrixtplayerXtplayerYtdestXtdestYtresulttdisttcostsintitxlisttylisttcurPos((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyt MatrixCircle.s"    3 ((c
Csœtjtj||dƒtj||dƒƒ}d}d}|dkrj|||}|||}nt|||ƒ}t|||ƒ}    ||    fS(Nigð?gi(R7RQR>R6(
tposDistRZR[tposXtposYR]R^R_tresultXtresultY((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytPosInLineByDistHs3 c
Csœtjtj||dƒtj||dƒƒ}d}d}|dkrj|||}|||}nt|||ƒ}t|||ƒ}    ||    fS(Nigð?gi(R7RQR>R6(
ReRZR[RfRgR]R^R_RhRi((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytPosInLineByDistExWs3 cCs;t|ƒ}tt|ƒƒ}||kr1|gS||gS(N(R6tMyRound(tnumtnum1tnum2((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyRSks
  cCs?g}x2|D]*}x!|D]}|j||fƒqWq W|S(N(R0(RaRbtposlistR:ty((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyRTvs
  cCs ||dS(Nid((tvaluetpercent((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyt
GetPercent…scCs-yt|ƒ}|SWntk
r(|SXdS(N(R6t
ValueError(tinputtdefValueR\((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytToIntDefŽs
  cCsttt||ƒ|ƒƒS(N(R6tmintmax(RvtminNumtmaxNum((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyt    ToIntArea›scCsb|jdƒ}t|ƒdkr%dSx6|D].}t||ƒtkrKdSt||ƒ}q,W|S(Ns.i(R,R-tNonethasattrtTruetgetattr(t
curCallObjtcallNametcallListt curCallName((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytParseNameGetObj¤s cCs9t||ƒ}|dkrdSt|ƒtkr5dS|S(N(R†R~tcallableR€(R‚Rƒ((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyt GetExecFunc¸s  cCstS(N(R€(tcurItem((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytCheckItemIsMaxEndureÈscCs!tt||ƒt||ƒƒS(N(Rztabs(RfRgttagXttagY((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytGetDistØscCs1ttjt||dƒt||dƒƒƒS(Ni(R=R7RQR>(RfRgRŒR((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyt    GetDistExãscCs$tjd|dƒ|kr dSdS(Nii(R?R@(tratetmaxRate((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyt    CanHappenìscCsH|jƒtjd|dƒ}x!|D]}||kr?q'n|SWdS(Nii(tsortR?R@R~(trateListR‘t    ranNumbertnumber((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytWhichCanHappen÷s
  cCsJ| s| rtS|jƒ|jƒkrF|jƒ|jƒkrFtStS(N(tFalsetGetIDtGetGameObjTypeR€(tsrcObjtdesObj((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyt    IsSameObjs
0cCst|jƒ|jƒƒS(N(tIsSameCountry_Namet
GetCountry(R›Rœ((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyt IsSameCountryscCs6||krtS|tjks.|tjkr2tStS(N(R€t IPY_GameWorldttcNewR˜(tsrcNametdesName((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyRž!s
 cCs>|jƒ}|jƒ}|dks0|dkr4tS||kS(Ni(t GetFamilyIDR˜(R›Rœt    srcFamilyt    desFamily((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyt IsSameFamily1s
  cCs#|jƒdtjgkrdStS(Ni(t
GetGMLevelRt Def_GM_LV_GodR€(t    curPlayer((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytIsGM>scCs,tƒ}t|ƒ}|jdƒd}|S(Ns.i(tGetCurrentTimetstrR,(tcurTimet
curTimeStr((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyR#Js     cCs tjjƒS(N(tdatetimettoday(((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyR­UscCs_|jƒjdƒd}ytjj||ƒSWn(tk
rZ}td||fƒdSXdS(Ns.is%s : %s(tstripR,R±tstrptimet BaseExceptionR*(ttimeStrt    timeFomatte((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytGetDateTimeByStrhscCs@t|ƒ}|dkr*td|ƒdS|jd|jdS(Ns GetPastHour Err dateTimeStr = %siii(t__GetPastTimeDeltaR~R*tdaystseconds(t dateTimeStrt pastTimeDelta((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyt GetPastHourws
  cCsDt|ƒ}|dkr*td|ƒdS|jdd|jdS(Ns"GetPastMinute Err dateTimeStr = %siii<(RºR~R*R»R¼(R½R¾((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyt GetPastMinute„s
  cCsDt|ƒ}|dkr*td|ƒdS|jddd|jS(Ns"GetPastMinute Err dateTimeStr = %siii<(RºR~R*R»R¼(R½R¾((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytGetPastSeconds’s
  cCs9tƒ}t|ƒ}|dks-|dkr1dS||S(N(R­R¹R~(tcompareTimeStrt curDataTimetcompareDataTime((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyRº s
     cCs$||}|jdd|jdS(Nii<(R»R¼(R¯ttagTimet    diff_Time((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytGetDiff_Minute°s
cCsqt|ƒ}tj|j|j|jdddƒ}t|ƒ}tj|j|j|jdddƒ}||jS(Ni(tChangeTimeNumToDatetimeR±tyeartmonthtdayR»(ttimeAttimeBt    dateTimeAt    dateTimeB((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyt GetDiff_Dayµs
 ' 'cCstƒtjd|ƒS(NR»(R­R±t    timedelta(tdiffDays((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytGetDatetimeByDiffDaysÂscCstƒj|ƒ}t|ƒS(N(t GetNPCManagert FindNPCByIDt__GetSummonTagNPC(tnpcIDtcurTag((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyRÕÉscCs;tƒ}|j|ƒ}|s-t|ƒ}n|r7|SdS(N(RÔtFindGameNPCByNPCIDtFindSummerNPCByNPCID(R×tnpcMgrtfindNPC((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytFindNPCByNPCIDÍs    cCsgtƒ}xWt|jƒƒD]C}|j|ƒ}|jƒdkrIqn|jƒ|kr|SqWdS(Ni(RÔtxrangetGetSummonNPCCounttGetSummonNPCAtR™tGetNPCID(R×RÛtindextcurNPC((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyRÚÖs    cCstƒj|ƒ}t|ƒS(N(RÔt GetNPCByIndexRÖ(tnpcIndexRØ((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyRäåscCstS(N(t __GameWorld(((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyRôscCs
tjƒS(N(RæRÔ(((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyRÔüscCs
tjƒS(N(RætGetTeamManager(((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyRçscCs
tjƒS(N(RætGetPlayerManager(((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyRè scCs
tjƒS(N(RætGetMapItemManager(((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyRéscCs
tjƒS(N(RætGetMapCopyPlayerManager(((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyRêscCs
tjƒS(N(RætGetMap(((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyRë$scCs
tjƒS(N(RætGetMail(((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyRì,scCs
tjƒS(N(Ræt    GetScript(((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyRí4scCs
tjƒS(N(Ræt    GetGameFB(((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyRî<scCs
tjƒS(N(RætGetAllFbNPCManager(((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyRïDscCs|dkrdS|jƒ}|tjkrAtƒj|jƒƒS|tjkrftƒj|jƒƒS|tj    kr‹tƒj
|jƒƒS|S(N( R~tGetGameNPCObjTypeR¡t
gnotSummonRÔtFindSummonNPCByIDR™t    gnotTruckt FindTruckByIDtgnotPett FindPetByID(t    curTagNPCtnpcObj((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyRÖLs  cCsA|jƒtjkr=|jƒtjtjtjgkr=tSdS(N(RšR¡tgotNPCtGetTypetntWalltntDeert ntDefenceMaxR€(tcurObj((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytGetNPC_Is_Gate`s9cCs‡|jƒ}|jƒ}|tjkr7tƒj|ƒS|tjkrPt|ƒS|tjkrot    ƒj
|ƒSt d||fƒdS(Ns*»ñµÃobjÀàʧ°Ü objType = %s , objIndex = %s( RštGetIndexR¡t    gotPlayerRètGetPlayerByIndexRùRätgotItemRétGetPoolItemByIndexR*R~(tobjtobjTypetobjIndex((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyt GetObjDetailks  
cCs[|tjkrtƒj|ƒS|tjkr8t|ƒS|tjkrWtƒj|ƒSdS(N(
R¡RRêtFindPlayerByIDRùRÕRRét GetItemByIDR~(tobjIDR((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytGetObj€s
cCstS(N(t ItemFactory(((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytGetItemFactory‘scCstS(N(tGameData(((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyt GetGameData™scCs*|jƒtjkrdSt||ƒdS(N(R©RRªt DebugAnswer(R«tmsg((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytGodLog¢s cCstjd|||fƒdS(Ns%s    %s    %s(tLogUItMsg(RtplayerIDtpar((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyR"°scCstjd|||fƒdS(Ns%s    %s    ###Error:%s(RR(RRR((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyR*»scCs1tƒjƒsdStjd|||fƒdS(Ns%s    %s    PyDebug:%s(Rt GetDebugLevelRR(RRR((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyRÄscCsÎtsÊtjƒ}|d}tjj|ƒsOtd|ƒtd|ƒ‚ntjƒ}|j    |ƒd\}}|j
||ƒs¡td|||fƒdSt |j ||ƒƒat dtƒntS(    NsT\ZoneServerGroup\rungate\InterfaceServer\MultiServerWarProxyServer\Config\config.inisÎÞ·¨ÕÒµ½Îļþ = %stConfigtServerIDs#%s ÕÒ²»µ½ÅäÖÃ: section=%s,option=%sis¶ÁÈ¡ MergeServerID=%s(RR(t MergeServerIDRtGetServerRootPathR'R(tisfileR*R!t ConfigParsertreadt
has_optionRxtgetR"(trootPathtmergeServerIniFiletmergeServerInitsectiontoption((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytGetMergeServerIDÏs 
   cCs tƒjƒS(N(RtGetServerVersion(((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyR(êscCs^tƒ}t|ƒ}|sdStdtd|ƒƒ}tdtdtƒƒƒ}|d|S(NiiiÐi?Bi@B(t GetPlatformtGetPlatformServerNumRzRyt GetServerID(tplatformt    serverNumtserverID((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytGetServerGroupIDís     cCstjdƒ}|j|dƒS(Nt DBPlatformNumi(t ReadChConfigtGetDBEvalChConfigR!(R,tplatformNumDict((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyR*ûscCstjddƒS(NR,t PlatformName(R1tGetPyMongoConfig(((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyR)scCsttƒddƒS(Nii(Rxt GetServerSID(((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyR+scCstjddƒS(NR,R(R1R5(((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyR6scCs=|jƒ}tƒt|jdƒdtjƒ}|jdS(Ns ii(tGetCreateRoleTimeR­R¹R,RtTYPE_Time_Format_DayR»(R«tcreateRoleTimetdiffTime((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytGetCreateRoleDayss &s@cCsC|jƒ}|jtƒ}t|ƒdkr1dSt|ddƒS(Niiiÿÿÿÿi(tGetAccIDR,tDef_AccID_Split_SignR-R6(R«taccIDtinfoList((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytGetPlayerServerID!s cCs9|jƒ}|jtƒ}t|ƒdkr1dS|dS(NiRiÿÿÿÿ(R<R,R=R-(R«R>R?((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytGetPlayerServerSID&s cCs6ttjdd|ƒdƒ}|dkr/|StƒS(NR,s%sMainServerID(RxR1R5R~R+(t accIDPlatformt mainServerID((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytGetPlayerMainServerID,s cCs-|jtƒ}t|ƒdkr%dS|dS(NiRiþÿÿÿ(R,R=R-(t    gameAccIDR?((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytGetPlayerPlatform5scCs,|jtƒ}|d }tj|ƒ}|S(Niþÿÿÿ(R,R=tjoin(RER?t
paInfoListt platformAccID((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytGetPlatformAccID:s
cCs-tj|jƒ|jƒjƒdƒjƒS(Ntmobile(tmd5R<tGetAccountDatatGetLastLoginTimet    hexdigest(R«((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyt GetSessionID@scCs|jtjƒS(N(tNomalDictGetPropertyRtDef_Player_Dict_Account_Type(R«((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytGetAccountTypeCstPDict_ChannelCodeNumcCs·tjdƒ}|s&|jtƒdS|jƒ}||krYtd||jƒƒdSxW|jƒD]I\}}||krf|jt|ƒt    d||f|jƒƒPqfqfWdS(Nt ChannelCodes?Can not find channel code(%s) in ChannelCode.txt, please check!s#SetPlayerChannelCode code=%s,num=%s(
R1tGetEvalChConfigtNomalDictDelPropertyRTtvaluesR*t GetPlayerIDRtNomalDictAddPropertyR(R«t channelCodetChannelCodeDicttcodeListtcodeNumtcode((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytSetPlayerChannelCodeKs    cCs>|jtƒ}|dkrdStjdƒ}|j|dƒS(NiRRU(RQRTR1RVR!(R«R^R\((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytGetPlayerChannelCodeds
 c
 
Cs/tƒj||||||||||    ƒ
dS(N(RtDataServer_HugeTradeRec(
t    tradeGoldt tradeSilvert tradeItemIDttradeItemCounttsenderIDt
senderGoldt senderSilvert
receiverIDt receiverGoldtreceiverSilver((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytNoteDownLargeTradezs    cCsZ|tjkr+|j||||dƒn+|tjkrV|j|||d|ƒndS(Ni(R¡tTYPE_Price_Gold_MoneytInterface_GoldRectTYPE_Price_Gold_Paper(R«ttypeIDt    typeCountttypeNamet    moneyTypet
moneyCount((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytLogin_Interface_GoldRec”s
cCsÇtƒj||ƒs6td||f|jƒƒdS|j|||ƒt|ƒ|rÃ|jƒjƒ}|rÃddl}|j    |ƒj
|j ƒ|j ƒdƒ\}}|j||ƒqÃndS(Ns5ResetPlayerPos ³¢ÊÔÒÆ¶¯µ½Õϰ­µã, posX = %s, posY = %siÿÿÿÿi( RëtCanMoveR*R™tResetPostClearPlayerPosCountt    GetPetMgrt GetFightPett    NPCCommont
NPCControltGetMoveNearPostGetPosXtGetPosY(R«RfRgtreasont
isResetPettrolePetR|((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytResetPlayerPos¥s
 0cCs|jdƒ|jdƒdS(Ni(t SetMoveCounttSetMoveDistDiff(R«((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyRy»s  cCsB|s
tSt|dƒ|ko5t|dƒknr>tSdS(Nii(R€R¹(R¯tactSect((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyt IsAtActTimeÆs
0cCsdS(Ni((tcurLV((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyt
GetReMoneyÕscCs8||j|ƒtj|kr$tS|j||ƒtS(N(RRtTYPE_Player_Tick_TimeR˜RR€(R«tfuncKeyR((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytSetPlayerTickTimeßs c Cs2|dkr|Sg}t|ƒ}||kr2|S||krox|D]}|j|dƒqEW|rk|SgStj|ƒ}|rŠ|n |dd}xˆt|ƒD]z}tjd|ƒ}    x_t|ƒD]Q\}
}|    |dkrìqÊn|j|dƒt||
ƒ}|dd}PqÊWq¥W|r.|SgS(Niiiÿÿÿÿ(    R-R0tcopytdeepcopyRRR?R@t    enumeratet ResetRiseList( triseListt    randomNumRwR‘tdataInfotlistLentdatat tempRiseListR`Rtj((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytGetResultByRandomListExís,         cCs½t|ƒ}|dkrgS||kr-|Stj|ƒ}|dkrZ||ddnd}||d}||d|!}x"|D]}|dc||8<q†Wtj|d|!|ƒS(Nii(R-RŽR(R’tdelIndext riseListLenR—t lastBaseRetetbaseRatettempListtriseInfo((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyR‘s   $ c
Cs°g}x£t|ƒD]•\}}|\}}|dkr=|n|||dd}|s_|n|t||dƒ}|sƒ|n|dd|}    |j|    |fƒqW|S(NiigˆÃ@iÿÿÿÿ(RR6R0(
t
srcPieListtplusRatet plusPieListR`trateInfoRtinfotsrcRatetnewRatetspecRate((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytGetPlusPieList&s ($cCs4|s
|Stjd|ddƒ}t|||ƒS(Niiÿÿÿÿ(R?R@tGetResultByRiseList(trandListRwR((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytGetResultByRandomList4scCs0x)|D]!}||dkr#qn|dSW|S(Nii((R’tpointRwt    smallList((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyR©?s
     cCsg}d}xO|D]G}||d7}|j|t|ƒdkrL|dn|dgƒqW|shdStjd|ddƒ}t||ƒS(Niiiiÿÿÿÿ(R0R-R?R@R©(t
weightListRªtweightR¤R((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytGetResultByWeightListJs 7cCsmxDtt|ƒƒD]0}|dkr+qn||c||d7<qWtjd|dƒ}t|||ƒS(Niiiÿÿÿÿ(RRR-R?R@tGetResultByRiseIndex(RªtisCriticalDownwardR`R¬((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytGetIndexByIndependRate[s  cCs"tjdtjƒ}t||ƒS(Ni(R?R@RtDef_NPCMapDropRateR±(RªR((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytGetResultByRandomIndexkscCs~xwtdt|ƒƒD]`}||}t|tƒr>|}n
|d}|rc||kruqqun||kruqn|SWdS(Niiÿÿÿÿ(RRR-t
isinstanceR6(R’R¬R²RâtelementtcmpPoint((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyR±us
    
      cCs|S(N((tfunc((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyt GetPsycoFuncŽscCs tjdƒS(Nt PsycoSwitch(R1RV(((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyR›scCshtdtƒƒg}x7tjjƒD]&}|j||jdƒdgƒq'Wttj    d|ƒdS(NsPsycoReload Begin : time = %ss.iÿÿÿÿR(
R"R#RRtkeysR0R,t
TravelFileRt
ScriptPath(RtmoduleNameListt
moduleName((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyR¢s $cCsØxÑtj||ƒD]¼}|jdƒr/qn|jdƒd}xN|D]F\}}||krgqIntjj|ƒ}|s…qInt|ƒqIWtjj    ||d|ƒrt
||d|d|ƒqqWdS(Ns.is\( R'R+t
startswithR,RRR!R R(R)R½(R tfilePathR¿Rt curModuleNamet
reloadNameRÀtmodule((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyR½±s #cCsMt|dƒd}t|dƒdd}t|dƒd}|||fS(Nièii<(R6(t    inputTimet curTimeHourt curTimeMinutet curTimeSecond((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytChangeInputTimeÏscCs/|jƒ}tjdƒ}||kr+tStS(NtDef_Mission_DR_MinLV(tGetLVR1RVR˜R€(R«tplayerLVtminDRLV((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyt
IsMissonDRÙs
  cCsatjdƒ}t|ƒdkr/tdƒtS|dr=tSyt||dƒWntSXtS(Nt EncodingTexisEncodingTex.txt Error len != 2ii(R1RVR-R*R˜R€tunicode(t    inputTextt encodingList((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytEncodingToUnicodeès
 
cCs7tjdƒ}t|ƒdkr/tdƒdS|dS(NRÐisEncodingTex.txt Error len != 2tutf8i(R1RVR-R*(RÓ((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytGetCharacterEncodingüs
 
cCs^tjdƒ}t|ƒdkr/tdƒ|Sy |jtjƒjtƒƒSWn|SX|S(NRÐisEncodingTex.txt Error len != 2(    R1RVR-R*tdecodet ShareDefinetDef_Game_Character_EncodingtencodeRÖ(RÒRÓ((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyt    GbkToCodes
 cCstjƒ}|jddƒS(NtIsMergeWarServei(t    MapConfigt    GetConfigR!(tconfig((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyt IsMergeServers cCs.tjj||ƒjƒ}ttj|ƒƒS(N(R±R´t    timetupleR6ttimetmktime(R¶t
timeFormat((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytChangeTimeStrToNum scCstj|tj|ƒƒS(N(Râtstrftimet    localtime(ttimeNumRä((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytChangeTimeNumToStr'scCs.tj|tj|ƒƒ}tjj||ƒS(N(RâRæRçR±R´(RèRäR¶((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyRÈ-sc
CsGt|ƒ}tƒ}||kr%tStj}|j|j|j|jf\}}}}|j|j|j|jf\}}    }
} ||krÊ||    krÊ||
krÊ||ko½| knrÆtSt    St
j
|||dddƒ} t
j
||    |
dddƒ} | | j }|dkrC||kr/tS| |kr?tSt    StS(s°ÅжÏÖ¸¶¨timeÖµÓëµ±Ììʱ¼ä¶Ô±ÈÊÇ·ñΪÓÎÏ·ÄÚµÄͬһÌì£»ÌØÊâʱ¼äµã¹ýÌìºó²ÅË㲻ͬÌì
    ¸Ãº¯ÊýÒ»°ãÓÃÓÚÅжÏij¸ö¹¦ÄܼǼµÄ°æ±¾ÌìÊÇ·ñÓëµ±Ììʱ¼äÊÇͬһÌìµÄÂß¼­
    @return: ÊÇ·ñͬһÌì
    ii( RÈR­R˜RØtDef_OnEventHourRÉRÊRËthourR€R±R»(t    checkTimet    checkDatetcurDateRêtchkYeartchkMonthtchkDaytchkHourtcurYeartcurMonthtcurDaytcurHourt checkDateExt    curDateExRÒ((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytCheckTimeIsSameServerDayEx1s*          **$    cCsO|jƒjƒ}|jƒjƒ}tjdƒ}t|jddƒƒ}|S(Nt AreaNameInfotNameExprR(RMt GetOperatort    GetAreaIDR1RVtevalR!(R«toperatortareaIDt areaNameInfotareaName((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyt GetAreaName]s
cCst|ƒ}tj|ƒS(N(RtCommFunct    GetStrCrc(R«R((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyt
GetAreaCrcks cCs;x4|jƒD]&\}}|j|dƒ|||<q WdS(Ni(RR!(tdict1tdict2tkeyRr((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyt AddDictValuetscCsPxI|jƒD];\}}|j|dƒ}||||tj||<q WdS(Ni(RR!RØtDef_MaxRateValue(RRR    Rrtvalue1((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytCalcAttrDictPers!cCs|td|ƒdS(Ni
(R>(tnumValuet    dataIndex((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytGetDataByDigitPlaceŒscCsY|dks'|dks'|tjkr+|St||ƒ}|td|ƒ||7}|S(Nii    i
(RØtDef_PDictDigitCntRR>(RRt    dataValuet    lastTagLV((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytChangeDataByDigitPlace•s
'cCsJt|ƒtt|ƒƒdkr,t|ƒSt|ƒt|t|ƒƒS(Ngà?(R‹R6(Rm((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyRl¤scCsT||kr||Sx9|jƒD]+\}}t|tƒr!||kr!|Sq!WdS(N(RR¶ttuple(tattrDicttfindKeyR    Rr((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytGetDictValueByKey¬s  cCs~||kr||Sxc|jƒD]U\}}t|tƒr!t|ƒdkr!|d|kom|dknr!|Sq!W|S(Niii(RR¶RR-(tsrcDictRRwtrangeKeyRr((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytGetDictValueByRangeKey¹s  Ec Cs|r dnd}||}|s,||n|t||gƒ}|j|ƒ}||}    |rŠ|td|    ƒ@}
|
rdnd}
nt||    ƒ}
|
S(Nii    iii(RRQR>R( R«t    keyFormattbittisBintkeyParamt perKeyMaxBittkeyNumtkeyNamet    dictValuetbitIndextbitValue((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytGetDictValueByBitËs
'
c Csô|r dnd}||}|s,||n|t||gƒ}|j|ƒ}    ||}
|r©|r~|    td|
ƒB} q»|    td|dƒdtd|
ƒ@} nt|    |
|ƒ} | dkrÚ|j|dƒn|j|| ƒ|    | fS(Nii    iii(RRQR>RRWRZ( R«RRRrRRR R!R"R#R$t updDictValue((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytSetDictValueByBitãs
'
+ c    Cs€|r dnd}ttj|t|ƒƒƒ}xHt|ƒD]:}|sT||n|t||gƒ}|j|ƒq>WdS(Nii    (R6R7R8R9RRRRW(    R«RtmaxLenRRR tkeyCntR`R"((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytResetDictAllBitValueús 'cCsG||||g}t|ƒ}tƒjdddd|t|ƒƒdS(NitSendBroadcastMergeClient(R®RètGameServer_QueryPlayerResultR-(toperTypetmapIDR”tisRepeattmsgList((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytSendBroadcastMerges %cCsA||g}t|ƒ}tƒj|||d|t|ƒƒdS(NtSendMergerChildMsg(R®RèR-R-(R.tdataMsgt srcPlayerIDt    queryTypetqueryIDR1((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyt!SendMergerChildToCenterStringDatas
  cCsp||kr||St|jƒƒ}|dkrZx%|D]}||kr9||Sq9Wn|rl||dSdS(Niiÿÿÿÿ(tsortedR¼R~(t    orderDicttordert isDefaultLastt    orderListtdOrder((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytGetOrderValueByDicts    cCs8||j|ƒtj|kr$tS|j||ƒtS(N(RRR‹R˜RR€(R«ttickTypeR((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pytCheckPlayerTick,s cCs‹|jƒ}tjdƒ}|d}|d}|d}d}x:t|ƒD],\}}||krn|}Pn|d}qLW||d}    ||d}
|t|ƒkr°dn||} d} d} xg|jƒD]Y\}}||    ksÓ|| krýqÓnt|ƒ}| |7} ||krÓ| |7} qÓqÓW||krY| |jtj|ƒ7} n|dkrk|n||    |
| | }||fS(Nt ClientLVRuleiiiiŸ†(    RÌR1RVRR-RRQRtDef_PDict_SplitExpLVCnt(R«tserverLVt clientLVRuletTransRealLVListtTransNewLvListtSplitLVExpDictttransCntR`treallvtcurTransRealLVtcurNewLVtnextTransRealLVtcurTransAddSplitLVtcurTransTotalSplitLVt splitRealLVt splitLVListt splitLVExCnttshowLV((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyt GetClientLV6s6 
 
 
 " 
  (icCsDt|||||gƒ}tƒj|ddd|t|ƒƒdS(s³
    @todo: Ìí¼ÓGameServer´æ´¢Í¨ÓüǼ
    @param recType: Í¨ÓüǼÀàÐÍ, ¶ÔÓ¦ ShareDefine.Def_UniversalGameRecTypeList
    @param valueList: ÊýÖµÁбí[value1, value2, ...], °´Ë³Ðò, Ö§³Övalue1 ~ value5
    @param strValueList: ×Ö·ûÖµÁбí[strValue1, strValue2, ...], °´Ë³Ðò, Ö§³ÖstrValue1 ~ strValue3
    @param notifyType: 0-²»Í¨Öª; 1-֪ͨ±¾ÈË; 2-֪ͨȫ·þ
    @param isSort: ´æ´¢¼Ç¼ÂúÐèɾ³ýʱÊÇ·ñÐèÒªÏȰ´Ê±¼äÅÅÐò, Ä¬ÈÏ1ÊÇ, ÏȽøÏȳö
    itAddUniversalGameRecN(R®RèR-R-(RtrecTypet    valueListt strValueListt
notifyTypetisSorttmsgStr((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyRU[s    %cCs;t||gƒ}tƒj|ddd|t|ƒƒdS(s³
    @todo: É¾³ýGameServer´æ´¢Í¨ÓüǼ
    @param recType: Í¨ÓüǼÀàÐÍ, ¶ÔÓ¦ ShareDefine.Def_UniversalGameRecTypeList
    @param notifyType: 0-²»Í¨Öª; 1-֪ͨ±¾ÈË; 2-֪ͨȫ·þ
    itDelUniversalGameRecN(R®RèR-R-(RVRRYR[((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyR\hs%cCs9t|ƒ|jtjƒjtƒƒ}|j|ƒdS(sתÂëºóÔÙ·¢DebugAnswerN(RR×RØRÙRÚRÖR(R«ttext((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyRss
 (¤R¡RR1R?R7RR±RR'RÝRRØt
PyMapTabletdecimalRRâRŽRRLtsetrecursionlimittServerRootPathRRRRRRR<R=RFRORdRjRkRSRTRtRxR}R†RˆRŠRŽRR R’R—RR RžR¨R¬R#R­tTYPE_Time_FormatR¹R¿RÀRÁRºRÇRÐRÓRÕRÝRÚRäRæRRtIPY_ItemFactoryR RRÔRçRèRéRêRëRìRíRîRïRÖRÿRR RRR"R*RR'R(R/R*R)R+R6R;R=R@RARDRFRJRPRSRTR`RaRmRvR˜R„RyRˆRŠRR~R™R‘R¨R«R©R°R€R³RµR±RºRRR½RÊRÏRÔRÖRÛRàRåRéRÈRùRRR
R RRRlRRR&R(R+R2R8R?RARTRUR\R(((sR.\ServerPython\ZoneServerGroup\map1_8G\MapServer\MapServerData\Script\GameWorld.pyt<module>'s<                                  "                  H                                                                                                                                                                                                                                                                                                                                              
    '                  
                     
            
                ,                                           
     
    %