Posts for FractalFusion


Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
Regarding the problem Randil brought up, maximum likelihood seems to work the best (although I can't prove it). Basically, at each step we guess the four-digit code that is most likely to yield the evidence given so far. I will use the following notation: ● pr to denote Prob(green|right), ● pw to denote Prob(green|wrong), ● qr = 1-pr, ● qw = 1-pw, I will also assume that 0 < pw < pr < 1. The probability that a four-digit code (that is not already guessed) yields the evidence so far is prA qrB pwC qwD, where A is # of greens for correctly guessed digits (over all the evidence so far), B is # of reds for correctly guessed digits, C is # of greens for incorrectly guessed digits, and D is # of reds for incorrectly guessed digits. Note that A+C is the total number of greens and B+D is the total number of reds. So then divide probability by pwA+C qwB+D, which is constant over all four-digit codes, and this gives (pr/pw)A (qr/qw)B, and the log of this is A log (pr/pw) + B log (qr/qw). So we just choose the four-digit code that maximizes the above quantity. I wrote C++ code (C++11 standard) to simulate this. Various values of pr and pw are selected. For each set of values, it runs the guessing game 5000 times using the above strategy and takes the average number of tries. Except for the first guess which is completely random, if two or more values are tied for the maximum, this code chooses the first instance, which is the smallest 4-digit code/number. (Note that in the code, "TRIES" is number of times to run the game; the number of tries/guesses for each game is called "count".) Here are the results. The resulting averages tend to be better than the averages Randil posted for his strategy (ex. for pr=0.55 and pw=0.45, the average with this strategy is 276.97, compared to 506). Also, I noticed that pairs of values with fixed pr-pw which are further away from the center (0.5) have a lower average number of guesses. A few other things. I only did pr > pw but that's good enough since if pr < pw, just reverse the colors and switch pr with qr and pw with qw. The case pr = pw is obvious enough (it's equivalent to completely random guessing and the average number of tries for that is 5000.5). I didn't do pw=0 or pr=1 though since the code doesn't support it; you can try the code with something like pw=0.0001 or pr=0.9999 but I don't expect anything really special to come out of it. The only other thing is that the case pr=1 and pw=0 can be done theoretically; the strategy is obviously to independently test each digit 0, 1, ... until you get the right digit, and the number of tries is always the largest digit plus one. The probability that the largest digit is k is ((k+1)4-k4)/10000, and when you work it out, the expected value for the number of tries is 8.4667.
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
While watching online, I found this slot (well, all of the TAS-related slots actually) to be somewhat interesting, to see if anyone was able to do the stated glitches within 4 hours to beat the game; it sounded rather unreasonable and I was wondering whether the winning submission was just something that played the game normally without glitches. Turns out someone did manage to make a movie using that campfire glitch (or whatever it's called), so congrats to whoever did that (I hope the results are posted soon). EmoArbiter managed to get within a few seconds of the winning submission, but the real surprise to me is that Tompa's TAS didn't beat either of them (unless Tompa was restricted to the same 4 hours as everyone else?). My schedule didn't allow me to participate today but while looking briefly over the guides I somehow missed that the game was deliberately coded to be broken, glitches were previously known and documented, and their use encouraged with instructions. I only learned this information after coming back to this thread an hour later. To be honest, because I missed this information, it gave me a better impression of the game and a prospective TAS at the time than it does now.
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
Adding to what Tangent said, I was under the impression (based on what was posted in this thread) that someone was able to sync the TAS without the erroneous visual artifacts. Was I mistaken?
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
Invariel wrote:
One question though, at ~3:11 in the YouTube encode, can you not walljump up the left-hand wall instead of taking the moving platform back to the right?
The columns are just foreground graphics which are not on the same plane as the playing field. There is no wall there.
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
Was already uploaded to Nicovideo some time ago. Link to video
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
yybtcbk wrote:
2) should "0AAAABB" read as "0AAAAABB" instead? (line 1651 in above)
Sorry about that. I made a mistake in transcribing the text. It is 0AAAAABB in the video. I fixed it now. I didn't check the code as closely as the other text so there may still be errors.
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
I have transcribed the chat portion of this submission, the part where it scrolls with unreadably fast text (as it stands now according to https://www.youtube.com/watch?v=plVNKa9cQsg ). It's a little long. Exactly as shown, including formatting. Formatted for readability.
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
I managed to get it to sync using Virtualbox+WinXP on my system. - Download and install Virtualbox. - Download an official WinXP trial version ("IE6 on XP" and "Virtualbox"). - Open Virtualbox and install the WinXP image through File -> Import Appliance... . Set a large enough RAM (512MB works, I think). - Launch the WinXP image. Transfer hourglass, tia.wtf (the submission TAS), and the RKS game folder there. (You can use Devices -> Insert Guest Additions CD Image... , reboot, then set a shared folder through Devices -> Shared Folders and then run cmd.exe in WinXP and type "net use x: \\vboxsvr\sharename", replacing "sharename" with the name of the shared folder, and then access the X: drive from My Computer.) - Open the RKS game folder and delete config.dat if it exists. - Launch hourglass, then load tia.wtf and the RKS game executable. - For Multithreading and Wait Sync, click "Allow". (Checking the option Sound -> Disable DirectSound Creation seems to be optional but is recommended. Checking Fast-Forward is also recommended.) - Play the movie. I tested both the JP v1.05c version that Hetfield90 has as well as the English version (a patch of v1.05c), and both of them sync. I also tested another WinXP image (which runs faster) and both versions work on that image as well. The version in question is something like "Windows_XP_Professional_SP3_Nov_2013_Incl_SATA_Drivers.iso" but it is not official so I can't link it here. About RKS replay files: I generated an .rpy file of the TAS inside WinXP. However, this file appears to work only inside WinXP. It desyncs when attempting to run in RKS in Windows 7. About graphical glitches: There are a few graphical glitches in the encode (such as Luste's music note bubble having a black box around it when it's not supposed to be there). Indeed, the graphical glitch appears in the game itself when running hourglass+RKS, as well as when running standalone RKS inside WinXP. Note: Here is the Dxdiag report of my system, if it is somehow important.
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
I remember trying to make an algorithm that gives all possible sortings of k objects into n bins. It's like what Bobo the King described, but without the stars-and-bars aspect of it.
Bobo the King wrote:
1. Try to move the rightmost star one space to the left by exchanging its place with a bar to its immediate left. 2. If you cannot do this because there is a star to its left, try to move that star to its left by exchanging its place with a bar. Keep doing this until you find a star with a bar to its left. 3. Once you find a star that can be moved left, move all stars on its right fully to the rightmost position. 4. Continue in this manner until all stars are on the left and all bars are on the right.
How it works in the original formulation (no stars-and-bars): Start with 0 0 ... 0 k (n bins). At each step, take the rightmost nonzero number m and note its bin number (1 to n from left to right) and call it c. If c=1, stop. Otherwise, add 1 to bin c-1, set bin c to 0 and set bin n to m-1. Note that the algorithm generates all the solutions in lexicographic order (the next one is always lexicographically later than the previous) and the last one is k 0 ... 0 0, which is when c=1.
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
I definitely like this TAS a lot. Some things about the TAS (Hetfield90 may have already mentioned this in the Youtube commentary): - Nearly everything uses the RNG to varying degrees. That's why you see a lot of Freudenstachel shots (and jumping in boss rooms as well). - The Zwei slide glitch in Schwer's stage occurs by placing Zwei level to a platform; then sliding onto the platform makes the game think you are still riding Zwei so you achieve very high speeds until you jump, turn around or take damage. - Taking damage/having lower HP allows Grollschwert to do more damage. This is used against Sichte as well as Sepperin's second form. - There is an upper route in Trauare's stage but it is slower. - Getting four small weapon energy is faster than getting one big weapon energy; that's why there's all this manipulation for small weapon energy in the castle stages. - In Sepperin 4, the lower route is faster as Spiritia. According to Hetfield90, the upper route is faster as Grolla. - Hetfield90 shoots a lot of Freudenstachel in Iris 1 for Bosspider manipulation. Speaking of which, it is possible to hit Bosspider three times per round to kill it in two cycles. Start with Zwei to gain enough height to hit it as soon as possible; Bosspider must come down as fast as possible but have three wire crossings at the fifth row (from the top) or below to get three hits in. For the second cycle, get as high as possible using Eins, then hit it three times; the wires just have to be anything that allow enough time for three hits. Also some things about using Hourglass with RKS that Hetfield90 informed me about: - There are a few graphical encode glitches in Hetfield90's encode. I don't know if they are avoidable. - Hetfield90 used Virtualbox+WinXP to run Hourglass+RKS and TAS in it. He also was able to run hourglass+RKS in his Windows 7, but I was unable to when I tried (may be computer differences). - Hourglass+RKS crashes when a previous room is loaded in some cases. For example, after reaching Bosspider's room, loading a previous room causes a crash. Hetfield90 mentioned something about me and RNG. I'll explain about the RNG part: - I strongly suspect that the RNG uses 32-bit Mersenne Twister (MT19937). I have not verified it yet but my guess is based on the recurrence of the number 624 in the implementation of this RNG, which stores and uses 624 4-byte numbers. According to Wikipedia, in MT19937, every sequence of 624 4-byte numbers appears an equal number of times in a period (period is 2^19937-1) except for all-zero, which appears once less. - Hetfield90 mentioned something about changes to an earlier stage causing completely different RNG for later stages; I don't know what causes this. - My likely guess as to the implementation of how RNG is used is some kind of rand(n) function that generates a random integer between 0 and n-1. The likely implementation is to take a 4-byte number (between 0 and 2^32-1), multiply it by n, divide by 2^32, and round down to make it as normally distributed as possible. - Based on the above assumption and testing by changing memory values, item drop works as follows, when an enemy is killed (RNG numbers are hexadecimal): 1) Get RNG value. If RNG>=40000000 (rand(100)>=25), then no item drop. Otherwise, 2) Get another RNG value. If RNG<=51EB851E (rand(100)<32), then small health drop. Otherwise, 3) Get another RNG value. If RNG<=6B851EB8 (rand(100)<42), then big health drop. Otherwise, 4) Get another RNG value. If RNG<=BD70A3D7 (rand(100)<74), then small weapon drop. Otherwise, 5) Get another RNG value. If RNG<=F0A3D70A (rand(100)<94), then big weapon drop. Otherwise, 1-up drop. - Bosspider wire RNG is as follows (RNG numbers are hexadecimal): *) Get 8 or more RNG values to determine 8 wires. The RNG values determine the wires as in the following chart (value of rand(30) in brackets):
        LEFT             MIDDLE            RIGHT
|                     |                     |                     |
|00000000-08888888(00)|55555556-5DDDDDDD(10)|AAAAAAAB-B3333333(20)|
|08888889-11111111(01)|5DDDDDDE-66666666(11)|B3333334-BBBBBBBB(21)|
|11111112-19999999(02)|66666667-6EEEEEEE(12)|BBBBBBBC-C4444444(22)|
|1999999A-22222222(03)|6EEEEEEF-77777777(13)|C4444445-CCCCCCCC(23)|
|22222223-2AAAAAAA(04)|77777778-7FFFFFFF(14)|CCCCCCCD-D5555555(24)|
|2AAAAAAB-33333333(05)|80000000-88888888(15)|D5555556-DDDDDDDD(25)|
|33333334-3BBBBBBB(06)|88888889-91111111(16)|DDDDDDDE-E6666666(26)|
|3BBBBBBC-44444444(07)|91111112-99999999(17)|E6666667-EEEEEEEE(27)|
|44444445-4CCCCCCC(08)|9999999A-A2222222(18)|EEEEEEEF-F7777777(28)|
|4CCCCCCD-55555555(09)|A2222223-AAAAAAAA(19)|F7777778-FFFFFFFF(29)|
|                     |                     |                     |
*) If any wire determined by this method conflicts with a previously determined wire by being the same or directly to its left or right, then it is ignored and the next RNG value is used instead. *) The game keeps using RNG values until 8 wires are determined. By the way, I support Hetfield90's decision to go for in-game time. The previous TAS had its funny moment with the loophole abuse; now I get to see what the final boss looks like TASed. Sure, you don't get to hear as much music or see all of Iris's attacks, but that's not what a TAS is for. Edit: Oh, forgot to mention. I used Cheat Engine to figure out the RNG. Some addresses I know of are: 61DAB4 (rks.exe+21DAB4) Lives 61DB44 (rks.exe+21DB44) HP BCC8F0 (rks.exe+7CC8F0) RNG
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
WST wrote:
Anty-Lemon wrote:
Eh. Alongside the existing Sonic 2 TAS it mostly loses its charm. There are a few really nice jumps here and there, but imo it'd be a lot more entertaining as an RTA run, since a single hit means death
… even more, collecting a ring also would count as a death :)
That reminds me of a joke hack of Sonic 1 that I once saw. Sonic games have always been rather easy. One way to make it extremely difficult is to play it without taking any damage/death/hits, and yes, this is really hard to do because Sonic doesn't exactly have the best control. There are a few no damage runs on Youtube, and even a hack called Sonic 1 - YOLO Edition where there are no rings or powerups and taking a single hit is game over. No, this joke hack goes even further. Appropriately titled "OMG THE RED RINGS" (hint: sonicretro), every coin and powerup is replaced with an up-and-down-moving red coin sprite with a gigantic hitbox that kills you. Its only purpose is for sheer absurdity as every stage (except Final Zone, of course) becomes at least near-impossible to complete. (The game is literally impossible to complete barring glitches/codes/debug, in case you were wondering.) Many hacks at sonicretro are gimmick hacks though, so it's not that special anyway. So that just reinforces that the Sonic games are built around collecting coins so much that it is almost impossible (if not impossible) to avoid collecting them. I don't think there would be an RTA that collects no rings any time soon. So that only leaves a TAS, which, while the novelty factor is there, appears to be constrained in such a way (was OOB necessary?) that, in my opinion, doesn't justify setting the goal of avoiding rings in the first place.
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
Unfortunately, I only realized just now how awful my encode was (it was intended to be low-quality, but not that bad). To make up for it, I will post a 720p60 version, which is uploading now. Here is a ~60fps downloadable in the meantime: Mediafire download (~67MB): https://www.mediafire.com/?aj0s3lh24uw373c Edit: Youtube 720p60 encode, when it's processed (~4-5 hours from now): Link to video
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
Encode. Wait for it to process. Edit: Link to encode deleted because of unacceptable quality even at the level of a temp encode.
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
I didn't think anyone would have touched this game ever again. Impressive that a new route was found, and it is even better-looking than the old one (going for two sets of bombs on Spud City gets old very fast, plus there are now twice as many death exits as before).
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
I used PCSX in the past and used Lua most of the time. I never had a problem with Lua (don't know what scripts you're using though). Controller plugin "Segu Direct Pad Pro Driver 0.4" works for me (in PCSX-RR v0.1.3). I never tested BOF3 though.
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
jlun2 wrote:
feos wrote:
The refresh button?
I tried. If I get an error during a refresh, the button doesn't seem to work even after I fix the script. It won't give additional errors however.
Error means that the script is deactivated; clicking the refresh button does nothing and you will need to double-click on the script to reactivate it. Personally, I'd just twice double-click the script (once to deactivate, once to reactivate) to refresh it. Sure, four clicks takes longer than one, but it's like only a half-second longer, and, if you do the refresh-button method, then when you do forget that you can't click the refresh button after an error while testing your script (and you will), each time that it happens costs precious seconds of your time.
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
Amaraticando wrote:
Warp wrote:
What is the integral of sin(x)*cos(x) dx ? a) sin2(x) / 2 + C b) -cos2(x) / 2 + C c) -cos(2x) / 4 + C
You can derive each alternative or: sin(2x) = 2*sin(x)*cos(x) sin(x)*cos(x) = sin(2x)/2 integral of sin(x)*cos(x) dx = 1/2 * integral of sin(2x) dx Let u be 2x, then du = 2 dx: = 1/2 * integral of sin(u) * (1/2) du = 1/4 * integral of sin(u) du = 1/4 * (- cos u) + C = -1/4 * cos(2x) + C
What you stated is mathematically correct, but take a look at the given choices again. The joke is that all three choices are correct.
Warp wrote:
Solve x^x^x^... = 2. (That's an infinite power series.)
If there exists such an x, then it must satisfy x^2=2. It can't be -sqrt(2) since (-sqrt(2))^(-sqrt(2)) doesn't exist in reals (let's not go into complex here) so the only possibility is sqrt(2). Proof that sqrt(2)^sqrt(2)^... = 2: Consider sqrt(2)^x - x. It is decreasing on (-∞,2], since its derivative ln(sqrt(2))*sqrt(2)^x - 1 is negative on (-∞,2]. Furthermore sqrt(2)^2=2. Therefore sqrt(2)^c>c for all c<2. However, sqrt(2)^c < sqrt(2)^2 = 2 for all c<2. Therefore the sequence sqrt(2), sqrt(2)^sqrt(2), sqrt(2)^sqrt(2)^sqrt(2), ... is strictly increasing and bounded above by 2. Therefore it converges to some number in (-∞,2]. Furthermore, it must converge to 2, since 2 is the only number c in (-∞,2] for which sqrt(2)^c=c. (By the way, limit (sqrt(2)^sqrt(2)^sqrt(2)^...) = sqrt(2)^(limit sqrt(2)^sqrt(2)^...) since sqrt(2)^x is a continuous function.)
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
In case anyone wants a black-and-white version, I uploaded to Nicovideo: Link to video
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
SmashManiac wrote:
and I don't understand how this movie got Yes votes from everybody else so far.
The submission poll is useless at best. The judging of a submission is determined solely by the decision of a judge and not by the whims of some poll up top. Also, entertainment is subjective. :) (I wasn't one of the people who voted Yes.)
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
Bobmario511 wrote:
Let A,B,M be nxn matricies which have real entries where n is a natural number, where AM=MA and A and B share the same characteristic polynomial. Prove det(A- MX) = det(B - XM) if X is an nxn matrix with real entries.
Is the problem correct? I'm coming up with
M=A=
1 0
0 0

B=
0 0
0 1

X=
1 0
0 1
and AM=MA and A and B have the same characteristic polynomial, and this gives me det(A- MX) = 0 ≠ -1 = det(B - XM).
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
MUGG wrote:
Well, there doesn't seem to be a hook for the X or minimize buttons. When clicking X, var doesn't become nil but the form window is gone. How am I supposed to detect that the window has gone if all I have is the var variable?
A useful piece of code from Amaraticando's Super Mario World script:
event.unregisterbyname("exit")
event.onexit(function()
    local destroyed = forms.destroy(var)
    client.paint()
end, "exit")
There isn't a hook for X. So the next best thing is not to depend on the user clicking X. Destroy the form when the user closes or reloads the script. This also prevents handle overload crashes that occasionally happen when you don't do this.
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
I was thinking about another way to prove that S(N) grows without bound as N does. I don't know if this is easier or not. (I will state it more carefully as well.) Let's see the condition again (this time, I merged the 5^2 into odd k^2 case). 1) 2^2=4 divides neither 27M+23 nor 169M+144. 2) 3 does not divide 169M+144. (3^2 never divides 27M+23) 3) 13 does not divide 27M+23. (13^2 never divides 169M+144) 4) k^2 divides neither 27M+23 nor 169M+144 for all primes k>=5, k not 13. S(N) is the number of M between 0 and N-1 for which 1-4 are satisfied. Assume that N is sufficiently large and a multiple of (2^2)*3*13. Now, I didn't explicitly state before, but the congruences of M with the congruences of 27M+23 and 169M+144 are linked. If b and n are relatively prime then the equation bM + c = 0 (mod n) has the class of solutions M = (b^(-1))c (mod n). So approximately N/n of the numbers have bM + c divisible by n (exact when N is divisible by n). When N is not divisible by n, then it is at least floor(N/n) and at most ceiling(N/n). Also, for a given M, 27M+23 and 169M+144 are relatively prime (since they are a solution (A,B) to 169A+1=27B), so it is impossible for a number greater than 1 to divide both of them at the same time. Let T be the set of M between 0 and N-1 that satisfy condition 1. Then |T| = 2N/4 = N/2. (There are two congruences mod 4 that M cannot be in). Now the number of T that do not satisfy condition 2 is N/3 - 2N/12 = N/6. (Of the congruence mod 3 that M is in, there are two congruences mod 12 that M cannot be in.) The number of T that do not satisfy condition 3 is N/13 - 2N/52 = N/26. (Of the congruence mod 13 that M is in, there are two congruences mod 52 that M cannot be in.) For each prime k>=5 (other than 13), the number of T for which k^2 divides 27M+23 or 169M+144 is at most 2*ceiling(N/k^2) - 4*floor(N/(2k)^2) < 2N/k^2 + 2 - 4N/(2k)^2 + 4 = N/k^2 + 6. (Of the two congruences mod k^2 that M is in, there are four congruences mod (2k)^2 that M cannot be in.) So by summing over all odd 5<=k<=sqrt(169N+144), the number of T that do not satisfy condition 4 is at most (N/5^2 + N/7^2 + ... ) + 6*sqrt(169N+144) < N/4 + o(N). (The upper range is sqrt(169N+144) since if k>sqrt(169N+144), then k^2 is larger than both 27M+23 and 169M+144 for all M between 0 and N-1. 1/5^2 + 1/7^2 + ... < 1/4 using the same argument as in my previous post, but with calculus, you can get < 1/6. o(N) refers to little o notation.) So then S(N) > N/2 - N/6 - N/26 - N/4 - o(N) = 7N/156 - o(N) ~ 7N/156 as N goes to infinity.
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
Hm, too bad this game has fixed slide distance. It really makes the TAS look worse than it actually is. SmartFrame, do you know if the glitch can further improve the TAS, possibly such that it may be faster to do Hard Man fifth instead of sixth?
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
I watched this TAS twice already. Pretty good I'd say, and the glitches are very useful. The only thing that disappointed me was that the upload on Nicovideo has only 20K views. But it seems to have affected all videos tagged TAS lately, so maybe it's a downturn thing.
Editor, Experienced Forum User, Published Author, Skilled player (1941)
Joined: 6/15/2005
Posts: 3247
http://www.fceux.com/web/help/fceux.html?LuaBot.html It seems it is necessary to learn how to code in Lua to use this. I never used this so I don't know anything else.