Jump to content

Recommended Posts

Posted

One of my structures causes the game to lag while it's being generated, and I was wondering if anyone knows how I can put it in a seperate thread to reduce the lag caused during structure generation. I just need to know how I would get the structure to generate in the new thread. I already have a class sort of set up. Here's what I have so far.

https://github.com/code-lyoko-modding/CodeLyokoMod/blob/master/matt/lyoko/lib/TowerGenThread.java

Posted

I suck at threading so I'm probably not much help, but to create a new thread do you not just call

(new Thread(Runnable runnable)).start()

at the point in the game loop where you want the thread to start?

 

this causes the run method to be called in your Runnable class, so form there call your methods to generate the structure

Posted

given you pass it an object instance of the runnable class, can you not pass the required variables through the constructor for that then use them in the generation methods? I will repeat that I suck with threading and you will probably have to be careful with de-synchronizing the world variable (so two different ones exist as one was changed in the thread and the other remained the same) but I can't think how to fix this (lots of synchronization at points possibly???) I'll look into how to fix that in a bit

 

I'm probably being as useless as a... well.... as s sleep deprived me...

 

you did all i was just typing, looks like my knowledge isn't as bad as I thought it was :D

 

I'll look through your classes, but I probably won't be to much use in this state... why is England so hot all of a sudden???

Posted

hey there, i do have some thread knowledge and i think i might be able to help you. since youre asking the qestion youre obviously not a noob soooo i wont go into deep details.

but basicly youre gonna want your world generator to create more then 1 thread, because if you only create 1 youre not solving the problem at all (feel free to ask why you need more then 1)

basicly each thread will have to do 1/number of thread  of your structure

aka, if your structure is 50 block long (doesnt matter how much width and height) and you have 5 thread, thread 1 will do from 0-9, T2 from 10-19 etc

 

so make some class extends Runnable or even thread, make the constructor of this thread have a reference to the world, the starting location of the structure, the structure youre trying to do and which part of it the thread is suppose to construct.

also include a reference to the thread that started the threads (aka the world generator )

 

once thats all setup, in the world generator starts/run all thread and wait for them to complete. 

 

it is important to note that minecraft is single threaded and it is a huge problem. so i suggest that even before starting to work on this. make a program an try to understand how thread works and specificly what are the functions Object.wait and Object.notify are doing (btw you know that every class that doesnt extends something specificly by default extends Object right ? so every object has the methods wait and notify)

 

sry if my explanation is shitty but ive written all this on a phone

fell free to pm me

how to debug 101:http://www.minecraftforge.net/wiki/Debug_101

-hydroflame, author of the forge revolution-

Posted

I sometimes answer things like this on my phone too, so I know how you feel. I actually got a decent Thread set up, but why do I need multiple threads if minecraft is single threaded? and how would I use the wait and notify methods in this scenario.

Posted

round 2 (this "keyboard is painfull)

 

ok so in the case that you are using only 1 thread, basicly this would happen.

the minecraft thread creates a new thread, calls this thread and wait til its done... basicly while the main thread is waiting you got only 1 thread running, you didnt solve anything because overall, theres 1 thread doing nothing, 1 working. its the same as just having 1 thread doing all the work

 

in the case of creating 2 thread, you have the main thread waiting but 2 thread creating the structure

this is when you start gaining power

if you've actually read about wait and notify and dont understand them heres another solution

 

have the main thread create and start all thread and then have the main thread do something like this

for(all my thread){

while(!thread.isDoneGenerating()){}

}

 

make sure the custom thread set a boolean value to true tgat will be returned by isDoneGenerating when they are done generating their part

 

basicly if it takes 5 sec (its just an overkill example) to generate the structure, they should all finish at the same time. so the mc server thread will do the first "while" a lot but then the next while might not even make it in once

 

if thats still not clear tell me

and sorry for the shitty typing/typos/explanation, coding on a phone is horrible

how to debug 101:http://www.minecraftforge.net/wiki/Debug_101

-hydroflame, author of the forge revolution-

Posted

let me see if I can understand this. you want me to make a bunch of threads with the default boolean value to false. then you want me to iterate through them all and while they're not finished, you want me to do something? I'm still kind of confused. if you have a skype it might be easier to talk through there.

Posted

nope all good i got a computer ill be albe to make complete answers

 

ok so basicly your code to generate the world will look like this

 

public void idontknowthename(arguments){
//code
StructureGeneratorThread[] threads = new StructureGeneratorThread[5];
for(int i = 0; i < threads.length; i++){
threads[i] = new StructureGeneratorThread(/*argument to give to have all information */ world, structureToGenerate, startIndex, endIndex);
}

for(StructureGeneratorThread thread : threads){//do you know about this way of writing for loops ? if not its just going to iterate through the list
thread.start();
}

for(StructureGeneratorThread thread : threads){
while(!thread.isDone()){}
}
//more code
}

 

public class StructureGeneratorThread extends Thread{
boolean isDone = false;
public StructureGeneratorThread(/*the args showed earlier*/){
blah blah save all the args
}

public void run(){//this method will be automaticly called when start() is called
//here you generate the structure from startIndex to endIndex, aka thread 1 from 0-9, 2 from 10-19 etc if its 5 thread for a 50 block wide structure

isDone = true;
}

public boolean isDone(){ return isDone;}
}

 

how to debug 101:http://www.minecraftforge.net/wiki/Debug_101

-hydroflame, author of the forge revolution-

Posted

so heres how to read this code

 

 

when youll start generating the structure, the server thread creates X "sub threads" each of those will be responsible to generate 1/X of the structure. (pick any axis and keep it as the "seperatable axis" exemple if you have a 10x20x30 structure, and you chose the x axis, the threads will generate from 1x20x30 to 5x20x30 and 6x20x30 to 10x20x30 (this is for 2 threads,  x threads= x subdivision) now the first loop creates all the threads and tell them which part they are responsible for

 

the 2nd loops starts all the thread, after the 2nd loop is done executing all the threads will be generating the structure

 

since they're all running in parallel the event log from this could look like this:

situation 2 thread generating a 2x2x2

 

thread1: generated 1, 1, 1

thread2: generated 2, 1, 1

thread1: generated 1, 1, 2

thread2: generated 2, 1, 2

thread1: generated 1, 2, 1

thread2: generated 2, 2, 1

thread1: generated 1, 2, 2

thread2: generated 2, 2, 2

 

optionnal note: since they are running in parallel this could be happening in ANY order (for some reason is it possible that the 2nd thread will generate more slowly but GENERALLY i should be pretty "symmetrical" )

 

so after the 2nd loop they're all generating and thats great, but how do we know its done? this is what the third loop is for

 

you see, at the end of the "run" method theres a isDone = true

meaning when the thread is done generating its own part of the structure itll set the boolean to true and the function isDone will now return true

 

the 3r loop basicly goes through each thread and wait til they are done generating

since this is happening in parrallel this SHOULD happen all at the same time

so the 3rd loop might wait 50 iteration of the while for the 1st loop to be done, but when itll be done all the other threads should ALSO be done, meaning it might not even enter then once !

 

was that better ?

how to debug 101:http://www.minecraftforge.net/wiki/Debug_101

-hydroflame, author of the forge revolution-

Posted
  On 7/20/2013 at 2:44 AM, hydroflame said:

the minecraft thread creates a new thread, calls this thread and wait til its done... basicly while the main thread is waiting you got only 1 thread running, you didnt solve anything because overall, theres 1 thread doing nothing, 1 working. its the same as just having 1 thread doing all the work

 

sorry for hijacking this thread (no pun intended), but @hydroflame, wouldn't there be two threads running if you create a new thread (the main mc thread and the new one you created)? correct me if i'm wrong, but wouldn't the main mc thread continue running whether or not the new one's finished (it's a new separate thread after all)?

Posted
  Quote
hijacking this thread

i loled

 

  Quote
wouldn't there be two threads running if you create a new thread (the main mc thread and the new one you created)?

you are absolutelly right there will be 2 thread running BUT the thin is the server thread cannot continue its work until the generation is finished. saying that it can continue it works (like continue to generate the caves n everything) would mean that from anywhere in the code you can receive the "is finished" message from the generating threads.

 

technicly... it could be possible that the generating threads (GT) would NOT in ANY way communicate with the main thread other then by the method that creates then

 

this "technique" would imply that the threads have "queue" of structure to generate and whenever the world gen wants to generate a structure he simply queues it to the least filled queue

 

the code would ressemble this

 

  Quote

public class TowerGen implements IWorldGen{

private TowerGenThread[] threads;

public TowerGen(){

threads = new TowerGenThread[5];

}

 

public void generateTower(){

 

//code to decide where/if to put a tower

//find tower with least ammount of queued tower

//add tower to that thread

 

//more code if you want

 

}

 

 

}

 

public class TowerGenThread extends Thread{

private Queue towerToGen = new IDontKnowTheExactClassName();

 

public int getQueueSize(){

return towerToGen.size();

}

 

 

public void addToQueue(/*args that describe the location*/){

towerToGen.add(the args, either an object or wtv);

}

 

public void run(){

while(true){

if(towerToGen.hasNext()){//or wtv the name to check if theres an object in the queue

//code to generate the tower

}

}

}

 

bascily this would also work, BUT you might find yourself in situation where a particular chunk isnt loaded because it took so much time that the player leaved the general area where the tower was supposed to be generated

 

 

 

both design have advantage and disadvantage

 

the first one keep the main idea of "single thread" because the server doesnt continue until its done but will be useless if the structures are very small

 

if the structure are numerous but small in size the 2nd design MAY be a better solution.

 

how to debug 101:http://www.minecraftforge.net/wiki/Debug_101

-hydroflame, author of the forge revolution-

Posted
  On 7/20/2013 at 4:06 AM, hydroflame said:
BUT the thin is the server thread cannot continue its work until the generation is finished

 

woops. didn't see that "while(!blabla.isDone)" part at first. anyway, i was just clarifying :P

Posted

ExecutorService exe = Executors.newCachedThreadPool();
exe.execute(new MyWorldGenThread(params));

That will run alongside the main thread. I just tested it with one of my mods by executing the Runnable using the service. By printing a line at the start of the run() method, and then another during a loop, and then placing a line after the exe.execute() invocation, you will see something like this:

 

The thread has started

Test 1

Test 2

This should show after the thread has started

Test 3

Test 4

Test 5

 

This should help you run a world gen thread alongside the main thread.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Looking to save big while shopping online? Our Temu coupon code 100€ off is here to make your shopping experience across Europe even better. If you're from Germany, France, Italy, or Switzerland, using the "acw696499" Temu coupon code guarantees you maximum benefits on all your purchases. This powerful code works seamlessly on both the Temu app and official website. With Temu coupon 100€ off and Temu 100 off coupon code, you're not only securing major savings but also unlocking exclusive offers across thousands of categories. Don't miss this golden opportunity to shop smart in 2025! What Is The Coupon Code For Temu 100€ Off? Great news for all shoppers—whether you're a new user or a long-time customer, you can enjoy exciting discounts with our Temu coupon 100€ off. With this 100€ off Temu coupon, shopping across Europe has never been more rewarding. acw696499: Use this code to get a flat 100€ discount instantly. acw696499: Unlock a 100€ coupon pack usable multiple times. acw696499: New customers get a 100€ flat discount as a welcome gift. acw696499: Existing customers receive an additional 100€ promo offer. acw696499: Designed specifically for users in Germany, France, Italy, Switzerland, and more. Temu Coupon Code 100€ Off For New Users In 2025 As a new user, you're in luck! The Temu coupon 100€ off makes your first experience unforgettable with savings that are hard to ignore. Our Temu coupon code 100€ off guarantees the best deals for new users on their first purchases across Europe. acw696499: Flat 100€ discount for all first-time buyers. acw696499: Receive a 100€ coupon bundle immediately after signing up. acw696499: Enjoy up to 100€ coupon value usable multiple times. acw696499: Benefit from free shipping to Germany, France, Italy, Switzerland, etc. acw696499: Get an extra 30% off on your first purchase. How To Redeem The Temu coupon 100€ off For New Customers? To use the Temu 100€ coupon, start by downloading the Temu app or visiting the official website. Then follow this step-by-step guide to apply the Temu 100€ off coupon code for new users: Create an account or sign up on the Temu platform. Browse through categories and add items to your cart. Proceed to checkout and enter the code "acw696499". Apply the code and see the discount reflected instantly. Complete your purchase and enjoy your savings! Temu Coupon 100€ Off For Existing Customers Existing users can also enjoy big rewards! Our Temu 100€ coupon codes for existing users offer various benefits when shopping with the Temu app or site. You can unlock exclusive Temu coupon 100€ off for existing customers free shipping deals using our code "acw696499" today. acw696499: Get a 100€ discount as a returning Temu shopper. acw696499: Claim a 100€ coupon bundle valid across multiple purchases. acw696499: Receive a free gift with fast delivery across Europe. acw696499: Stack up to 70% off on top of your 100€ coupon. acw696499: Enjoy free shipping in Germany, France, Italy, Spain, Switzerland, and more. How To Use The Temu Coupon Code 100€ Off For Existing Customers? To apply the Temu coupon code 100€ off, visit the Temu website or open the app and log into your existing account. Here's how to redeem the Temu coupon 100€ off code: Select the items you wish to purchase. Add them to your cart and proceed to checkout. Enter the code "acw696499" in the promo section. Enjoy the instant 100€ discount applied to your total. Complete the payment to finalize your purchase. Latest Temu Coupon 100€ Off First Order Don't miss the chance to get the biggest deal on your very first purchase with our Temu coupon code 100€ off first order. Whether you're from France, Italy, Germany, or Switzerland, this Temu coupon code first order is your gateway to mega savings. Use this Temu coupon code 100€ off first time user to unlock the following: acw696499: Flat 100€ discount on your very first Temu order. acw696499: Enjoy a 100€ coupon pack tailored for your first-time use. acw696499: Up to 100€ in coupons spread over multiple uses. acw696499: Free shipping to countries like Germany, France, Italy, Switzerland, and Spain. acw696499: Additional 30% off on your first order. How To Find The Temu Coupon Code 100€ Off? You can easily find the Temu coupon 100€ off by subscribing to the Temu newsletter, where verified codes are shared regularly. Users searching for Temu coupon 100€ off Reddit can also explore discussions for active and tested codes. To ensure the best deals, follow Temu on social media platforms for real-time updates. Trusted coupon websites also offer the latest, verified Temu promo codes. Is Temu 100€ Off Coupon Legit? Yes, the Temu 100€ Off Coupon Legit claim is absolutely true. Our code "acw696499" has been tested multiple times to ensure legitimacy. You can confidently use our code knowing it's not only genuine but also safe for first and repeat orders. This Temu 100 off coupon legit code is valid across Europe and has no expiry date. How Does Temu 100€ Off Coupon Work? To put it simply, once you apply our Temu coupon code 100€ off first-time user, the discount is automatically subtracted from your total at checkout. The process is instant and works on both the app and website. The Temu coupon codes 100 off activate exclusive discounts depending on your user status (new or existing). Once validated, the code applies a flat 100€ reduction or bundles, which can include gifts, free shipping, and more discounts. How To Earn Temu 100€ Coupons As A New Customer? You can earn the Temu coupon code 100€ off simply by signing up as a new user. Additionally, inviting friends or completing tasks on the Temu app can get you extra coupons. Our 100 off Temu coupon code is available to every first-time user without any hidden conditions. Be active on the platform and check for pop-up deals that often contain surprise coupon drops. What Are The Advantages Of Using Temu Coupon 100€ Off? Here are the top reasons why you should apply our Temu coupon code 100 off and Temu coupon code 100€ off: 100€ discount on your very first order. 100€ coupon bundle valid for multiple uses. Up to 70% off on popular items. Extra 30% off for European existing customers. Up to 90% off on selected products. Free gift for new users across Europe. Free delivery in countries like Germany, France, Italy, Switzerland, and more. Temu 100€ Discount Code And Free Gift For New And Existing Customers Using the Temu 100€ off coupon code and 100€ off Temu coupon code gives you access to premium perks. acw696499: Flat 100€ off on your very first Temu purchase. acw696499: Additional 30% discount on any item. acw696499: Free welcome gift for new users. acw696499: Up to 70% off on top-rated items. acw696499: Free gift with fast shipping across Germany, France, Italy, Switzerland. Pros And Cons Of Using Temu Coupon Code 100€ Off This Month Here are some Temu coupon 100€ off code and Temu 100 off coupon benefits and limitations: Pros: Saves you up to 100€ instantly. No minimum purchase requirement. Works on both app and website. Valid in multiple European countries. Bonus gifts and free delivery available. Cons: Some items may not be eligible. One-time use per account per offer type. Terms And Conditions Of Using The Temu Coupon 100€ Off In 2025 Here are the Temu coupon code 100€ off free shipping and latest Temu coupon code 100€ off rules you should know: No expiration date on the code "acw696499." Valid for both new and existing users. Usable in Germany, France, Italy, Switzerland, Spain, and more. No minimum order requirement. Can be used on all product categories. Stackable with certain site promotions. Final Note: Use The Latest Temu Coupon Code 100€ Off Start saving instantly with our Temu coupon code 100€ off and elevate your online shopping journey today. There has never been a better time to use Temu for your fashion, tech, home, or beauty needs. With our verified Temu coupon 100€ off, you can enjoy discounts, free shipping, and bonus gifts across Europe. Happy shopping! FAQs Of Temu 100€ Off Coupon What is the latest working Temu coupon code 100€ off? The latest working Temu coupon code is "acw696499" which provides 100€ off for new and existing users across Europe. Is there any expiry date for this coupon code? No, our coupon code "acw696499" does not have an expiration date and is valid all year round. Can existing customers also use the Temu 100€ coupon? Yes, existing users can redeem the 100€ coupon using "acw696499" and enjoy exclusive benefits. Is the Temu 100€ off coupon legit? Absolutely! Our coupon code "acw696499" is tested and verified regularly for legitimacy. How many times can I use the Temu coupon code 100€ off? You can use it once per user type (new or existing), and it may apply for multiple uses depending on promotions.
    • Looking to grab the Temu coupon code $100 off this month? You're in the right place for the biggest savings on your favorite products. Use the exclusive "acw696499" Temu coupon code for maximum benefits across the USA, Canada, and European nations. Whether you're a new customer or a long-time user, this code unlocks massive discounts and perks. With the Temu coupon $100 off and Temu 100 off coupon code, you’re not just saving money—you’re upgrading your shopping experience. What Is The Coupon Code For Temu $100 Off? Both new and existing customers can enjoy unbeatable savings with our exclusive coupon code. Use this Temu coupon $100 off and get a $100 off Temu coupon for your next order. acw696499 – Flat $100 off your order at checkout. acw696499 – $100 coupon pack you can use on multiple products. acw696499 – $100 flat discount exclusively for new customers. acw696499 – Extra $100 promo code for loyal, existing customers. acw696499 – $100 coupon available for shoppers in the USA and Canada. Temu Coupon Code $100 Off For New Users In 2025 If you're new to Temu, you're in for a treat. Use our code for the Temu coupon $100 off and enjoy unmatched discounts. acw696499 – Flat $100 discount for first-time buyers. acw696499 – Unlock a $100 coupon bundle specially for new customers. acw696499 – Redeem up to $100 coupon value across multiple purchases. acw696499 – Get free shipping to over 68 countries. acw696499 – Enjoy an extra 30% off any purchase as a new user. How To Redeem The Temu Coupon $100 Off For New Customers? To use the Temu $100 coupon and claim your Temu $100 off coupon code for new users, follow these steps: Download the Temu app or visit the official website. Register for a new account using your email or phone number. Add your favorite products to the cart. Enter the coupon code acw696499 at checkout. Enjoy instant savings and free shipping benefits. Temu Coupon $100 Off For Existing Customers Returning customers can still enjoy exceptional deals by applying our exclusive code. Use the Temu $100 coupon codes for existing users and unlock Temu coupon $100 off for existing customers free shipping perks. acw696499 – Receive an additional $100 discount as a returning user. acw696499 – Use the $100 coupon bundle for multiple purchases. acw696499 – Get a free gift with express shipping across the USA and Canada. acw696499 – Enjoy an extra 30% off on top of your current discounts. acw696499 – Free shipping available to 68 countries worldwide. How To Use The Temu Coupon Code $100 Off For Existing Customers? To activate the Temu coupon code $100 off and enjoy your savings as a returning buyer, follow these simple steps: Log into your existing Temu account. Add your chosen items to the shopping cart. Head to the checkout page. Apply the code acw696499 in the promo code box. Watch your total drop instantly with the Temu coupon $100 off code. Latest Temu Coupon $100 Off First Order Enjoy your first shopping experience on Temu with massive savings! Apply the Temu coupon code $100 off first order, Temu coupon code first order, or Temu coupon code $100 off first time user to save more. acw696499 – Flat $100 discount for your first order. acw696499 – Special $100 Temu coupon code for first orders. acw696499 – Enjoy up to $100 coupon bundle across different purchases. acw696499 – Free shipping to more than 68 countries. acw696499 – Extra 30% off on your initial order. How To Find The Temu Coupon Code $100 Off? Searching for the best Temu coupon $100 off deals? Check out Temu coupon $100 off Reddit threads for user-shared experiences and updated codes. You can also sign up for Temu’s newsletter for personalized offers. Visit their official social media pages or rely on trusted coupon-sharing websites to grab the most recent working promo codes. Is Temu $100 Off Coupon Legit? Yes, the Temu $100 Off Coupon Legit claim is absolutely true. We guarantee our Temu 100 off coupon legit code "acw696499" is tested and verified for accuracy. Anyone can safely use this code to receive $100 off their first or repeat orders. It’s valid internationally and doesn’t expire, so use it anytime for instant savings. How Does Temu $100 Off Coupon Work? The Temu coupon code $100 off first-time user and Temu coupon codes 100 off give users a direct discount during checkout. When you enter the coupon code during payment, the system automatically deducts $100 from your total bill. Whether you're a first-time buyer or a loyal customer, our code ensures unbeatable savings. How To Earn Temu $100 Coupons As A New Customer? To earn the Temu coupon code $100 off and get access to the 100 off Temu coupon code, sign up as a new customer on the Temu platform. Once registered, apply the promo code "acw696499" during checkout. You’ll instantly receive a $100 coupon bundle, free shipping, and extra discounts exclusive to new users. What Are The Advantages Of Using The Temu Coupon $100 Off? Using the Temu coupon code 100 off and Temu coupon code $100 off unlocks the following perks: $100 discount on your first order. $100 coupon bundle for multiple uses. 70% discount on popular items. Extra 30% off for returning customers. Up to 90% off on selected products. Free gift for new users. Free shipping to over 68 countries. Temu $100 Discount Code And Free Gift For New And Existing Customers Want more than discounts? The Temu $100 off coupon code and $100 off Temu coupon code offer added bonuses for everyone. acw696499 – $100 discount for your first order. acw696499 – Extra 30% off on any product. acw696499 – Free gift for first-time buyers. acw696499 – Up to 70% discount sitewide. acw696499 – Free shipping and gift in 68 countries including USA & UK. Pros And Cons Of Using The Temu Coupon Code $100 Off This Month Using the Temu coupon $100 off code and Temu 100 off coupon offers major pros and a couple of cons: Pros: Huge $100 discount on first and repeat orders. Free shipping globally. Free gift for new users. Up to 90% off on exclusive deals. Extra 30% discount for all users. Cons: Cannot be combined with certain flash sale items. Limited-time availability for some regional users. Terms And Conditions Of Using The Temu Coupon $100 Off In 2025 Before using the Temu coupon code $100 off free shipping and latest Temu coupon code $100 off, keep these in mind: Valid for both new and returning users. Code "acw696499" works across 68 countries worldwide. No minimum purchase required. No expiration date—use it anytime. Free shipping and gifts depend on regional availability. Final Note: Use The Latest Temu Coupon Code $100 Off Save big on every order with our Temu coupon code $100 off—it’s the smartest way to shop. Apply your Temu coupon $100 off today and make your online shopping budget-friendly and exciting.
    • Update your drivers: https://www.amd.com/en/support/downloads/previous-drivers.html/processors/ryzen/ryzen-3000-series/amd-ryzen-7-3700u.html
    • mclo only shows 25000 lines - add the rest with another link
    • Make a test without Create Big Cannons More Shells
  • Topics

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.