From ee9ead6cabce5f9f9fd137e3524db77227a8130f Mon Sep 17 00:00:00 2001 From: Dave MacLachlan Date: Sat, 18 Nov 2017 16:11:20 -0800 Subject: [PATCH] Standardize formatting across files using clang-format -style=Google --- MetadataGenerator/AppDelegate.h | 6 +- MetadataGenerator/AppDelegate.m | 486 +- MetadataGenerator/ViewController.h | 2 - MetadataGenerator/ViewController.m | 10 +- MetadataGenerator/main.m | 8 +- libPhoneNumber-iOS/libPhoneNumberiOS.h | 8 +- libPhoneNumber-macOS/libPhoneNumbermacOS.h | 8 +- libPhoneNumber-tvOS/libPhoneNumbertvOS.h | 8 +- .../libPhoneNumberwatchOS.h | 8 +- libPhoneNumber/NBAsYouTypeFormatter.h | 8 +- libPhoneNumber/NBAsYouTypeFormatter.m | 1843 ++-- .../NBGeneratedPhoneNumberMetaData.h | 8102 ++++++++--------- libPhoneNumber/NBMetadataHelper.h | 1 - libPhoneNumber/NBMetadataHelper.m | 221 +- libPhoneNumber/NBNumberFormat.h | 20 +- libPhoneNumber/NBNumberFormat.m | 124 +- libPhoneNumber/NBPhoneMetaData.h | 55 +- libPhoneNumber/NBPhoneMetaData.m | 248 +- libPhoneNumber/NBPhoneNumber.h | 21 +- libPhoneNumber/NBPhoneNumber.m | 162 +- libPhoneNumber/NBPhoneNumberDefines.h | 110 +- libPhoneNumber/NBPhoneNumberDefines.m | 10 +- libPhoneNumber/NBPhoneNumberDesc.h | 15 +- libPhoneNumber/NBPhoneNumberDesc.m | 121 +- libPhoneNumber/NBPhoneNumberUtil.h | 146 +- libPhoneNumber/NBPhoneNumberUtil.m | 5186 +++++------ libPhoneNumber/NSArray+NBAdditions.m | 26 +- .../NBAsYouTypeFormatterTest.m | 158 +- libPhoneNumberTests/NBPhoneNumberUtilTest.m | 2355 +++-- 29 files changed, 10103 insertions(+), 9373 deletions(-) mode change 100755 => 100644 libPhoneNumber/NBAsYouTypeFormatter.h mode change 100755 => 100644 libPhoneNumber/NBAsYouTypeFormatter.m mode change 100755 => 100644 libPhoneNumber/NBNumberFormat.h mode change 100755 => 100644 libPhoneNumber/NBNumberFormat.m mode change 100755 => 100644 libPhoneNumber/NBPhoneMetaData.h mode change 100755 => 100644 libPhoneNumber/NBPhoneMetaData.m mode change 100755 => 100644 libPhoneNumber/NBPhoneNumber.h mode change 100755 => 100644 libPhoneNumber/NBPhoneNumber.m mode change 100755 => 100644 libPhoneNumber/NBPhoneNumberDefines.h mode change 100755 => 100644 libPhoneNumber/NBPhoneNumberDesc.h mode change 100755 => 100644 libPhoneNumber/NBPhoneNumberDesc.m mode change 100755 => 100644 libPhoneNumber/NBPhoneNumberUtil.h mode change 100755 => 100644 libPhoneNumber/NBPhoneNumberUtil.m mode change 100755 => 100644 libPhoneNumberTests/NBAsYouTypeFormatterTest.m mode change 100755 => 100644 libPhoneNumberTests/NBPhoneNumberUtilTest.m diff --git a/MetadataGenerator/AppDelegate.h b/MetadataGenerator/AppDelegate.h index 9124170..9d204cc 100644 --- a/MetadataGenerator/AppDelegate.h +++ b/MetadataGenerator/AppDelegate.h @@ -8,10 +8,8 @@ #import -@interface AppDelegate : UIResponder - -@property (strong, nonatomic) UIWindow *window; +@interface AppDelegate : UIResponder +@property(strong, nonatomic) UIWindow *window; @end - diff --git a/MetadataGenerator/AppDelegate.m b/MetadataGenerator/AppDelegate.m index 9f801a3..d104020 100644 --- a/MetadataGenerator/AppDelegate.m +++ b/MetadataGenerator/AppDelegate.m @@ -9,340 +9,342 @@ #import "AppDelegate.h" @import libPhoneNumberiOS; - @interface AppDelegate () @end - @implementation AppDelegate -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions -{ - self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; - self.window.backgroundColor = [UIColor blackColor]; - [self.window makeKeyAndVisible]; +- (BOOL)application:(UIApplication *)application + didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; + self.window.backgroundColor = [UIColor blackColor]; + [self.window makeKeyAndVisible]; - [self.window setRootViewController:[[UIViewController alloc] init]]; + [self.window setRootViewController:[[UIViewController alloc] init]]; - [self testWithRealData]; - //[self testWithGCD]; - //[self testForGetSupportedRegions]; + [self testWithRealData]; + //[self testWithGCD]; + //[self testForGetSupportedRegions]; - return YES; + return YES; } -- (void)testForGetSupportedRegions -{ - NBPhoneNumberUtil *phoneUtil = [NBPhoneNumberUtil sharedInstance]; - NSLog(@"%@", [phoneUtil getSupportedRegions]); +- (void)testForGetSupportedRegions { + NBPhoneNumberUtil *phoneUtil = [NBPhoneNumberUtil sharedInstance]; + NSLog(@"%@", [phoneUtil getSupportedRegions]); } +- (void)testWithRealData { + NBAsYouTypeFormatter *formatter = [[NBAsYouTypeFormatter alloc] initWithRegionCode:@"US"]; -- (void)testWithRealData -{ - NBAsYouTypeFormatter *formatter = [[NBAsYouTypeFormatter alloc] initWithRegionCode:@"US"]; + NSLog(@"%@ (%@)", [formatter inputDigit:@"2"], formatter.isSuccessfulFormatting ? @"Y" : @"N"); + NSLog(@"%@ (%@)", [formatter inputDigit:@"1"], formatter.isSuccessfulFormatting ? @"Y" : @"N"); + NSLog(@"%@ (%@)", [formatter inputDigit:@"2"], formatter.isSuccessfulFormatting ? @"Y" : @"N"); + NSLog(@"%@ (%@)", [formatter inputDigit:@"5"], formatter.isSuccessfulFormatting ? @"Y" : @"N"); + NSLog(@"%@ (%@)", [formatter inputDigit:@"5"], formatter.isSuccessfulFormatting ? @"Y" : @"N"); + NSLog(@"%@ (%@)", [formatter inputDigit:@"5"], formatter.isSuccessfulFormatting ? @"Y" : @"N"); + NSLog(@"%@ (%@)", [formatter inputDigit:@"5"], formatter.isSuccessfulFormatting ? @"Y" : @"N"); + NSLog(@"%@ (%@)", [formatter inputDigit:@"5"], formatter.isSuccessfulFormatting ? @"Y" : @"N"); + NSLog(@"%@ (%@)", [formatter inputDigit:@"5"], formatter.isSuccessfulFormatting ? @"Y" : @"N"); + NSLog(@"%@ (%@)", [formatter inputDigit:@"5"], formatter.isSuccessfulFormatting ? @"Y" : @"N"); + NSLog(@"%@ (%@)", [formatter inputDigit:@"5"], formatter.isSuccessfulFormatting ? @"Y" : @"N"); - NSLog(@"%@ (%@)", [formatter inputDigit:@"2"], formatter.isSuccessfulFormatting ? @"Y":@"N"); - NSLog(@"%@ (%@)", [formatter inputDigit:@"1"], formatter.isSuccessfulFormatting ? @"Y":@"N"); - NSLog(@"%@ (%@)", [formatter inputDigit:@"2"], formatter.isSuccessfulFormatting ? @"Y":@"N"); - NSLog(@"%@ (%@)", [formatter inputDigit:@"5"], formatter.isSuccessfulFormatting ? @"Y":@"N"); - NSLog(@"%@ (%@)", [formatter inputDigit:@"5"], formatter.isSuccessfulFormatting ? @"Y":@"N"); - NSLog(@"%@ (%@)", [formatter inputDigit:@"5"], formatter.isSuccessfulFormatting ? @"Y":@"N"); - NSLog(@"%@ (%@)", [formatter inputDigit:@"5"], formatter.isSuccessfulFormatting ? @"Y":@"N"); - NSLog(@"%@ (%@)", [formatter inputDigit:@"5"], formatter.isSuccessfulFormatting ? @"Y":@"N"); - NSLog(@"%@ (%@)", [formatter inputDigit:@"5"], formatter.isSuccessfulFormatting ? @"Y":@"N"); - NSLog(@"%@ (%@)", [formatter inputDigit:@"5"], formatter.isSuccessfulFormatting ? @"Y":@"N"); - NSLog(@"%@ (%@)", [formatter inputDigit:@"5"], formatter.isSuccessfulFormatting ? @"Y":@"N"); + NBAsYouTypeFormatter *f = [[NBAsYouTypeFormatter alloc] initWithRegionCode:@"US"]; + NSLog(@"%@", [f inputDigit:@"6"]); // "6" + NSLog(@"%@", [f inputDigit:@"5"]); // "65" + NSLog(@"%@", [f inputDigit:@"0"]); // "650" + NSLog(@"%@", [f inputDigit:@"2"]); // "650 2" + NSLog(@"%@", [f inputDigit:@"5"]); // "650 25" + NSLog(@"%@", [f inputDigit:@"3"]); // "650 253" - NBAsYouTypeFormatter *f = [[NBAsYouTypeFormatter alloc] initWithRegionCode:@"US"]; - NSLog(@"%@", [f inputDigit:@"6"]); // "6" - NSLog(@"%@", [f inputDigit:@"5"]); // "65" - NSLog(@"%@", [f inputDigit:@"0"]); // "650" - NSLog(@"%@", [f inputDigit:@"2"]); // "650 2" - NSLog(@"%@", [f inputDigit:@"5"]); // "650 25" - NSLog(@"%@", [f inputDigit:@"3"]); // "650 253" + // Note this is how a US local number (without area code) should be formatted. + NSLog(@"%@", [f inputDigit:@"2"]); // "650 2532" + NSLog(@"%@", [f inputDigit:@"2"]); // "650 253 22" + NSLog(@"%@", [f inputDigit:@"2"]); // "650 253 222" + NSLog(@"%@", [f inputDigit:@"2"]); // "650 253 2222" + // Can remove last digit + NSLog(@"%@", [f removeLastDigit]); // "650 253 222" - // Note this is how a US local number (without area code) should be formatted. - NSLog(@"%@", [f inputDigit:@"2"]); // "650 2532" - NSLog(@"%@", [f inputDigit:@"2"]); // "650 253 22" - NSLog(@"%@", [f inputDigit:@"2"]); // "650 253 222" - NSLog(@"%@", [f inputDigit:@"2"]); // "650 253 2222" - // Can remove last digit - NSLog(@"%@", [f removeLastDigit]); // "650 253 222" + NSLog(@"%@", [f inputString:@"16502532222"]); // 1 650 253 2222 - NSLog(@"%@", [f inputString:@"16502532222"]); // 1 650 253 2222 + // Unit test for isValidNumber is failing some valid numbers. #7 - // Unit test for isValidNumber is failing some valid numbers. #7 - - NBPhoneNumberUtil *phoneUtil = [NBPhoneNumberUtil sharedInstance]; - - { - NSError *error = nil; - NBPhoneNumber *phoneNumberUS = [phoneUtil parse:@"(366) 522-8999" defaultRegion:@"US" error:&error]; - if (error) { - NSLog(@"err [%@]", [error localizedDescription]); - } - NSLog(@"- isValidNumber [%@]", [phoneUtil isValidNumber:phoneNumberUS] ? @"YES" : @"NO"); - NSLog(@"- isPossibleNumber [%@]", [phoneUtil isPossibleNumber:phoneNumberUS error:&error] ? @"YES" : @"NO"); - NSLog(@"- getRegionCodeForNumber [%@]", [phoneUtil getRegionCodeForNumber:phoneNumberUS]); - } + NBPhoneNumberUtil *phoneUtil = [NBPhoneNumberUtil sharedInstance]; { NSError *error = nil; - NBPhoneNumber *phoneNumberUS = [phoneUtil parse:@"14155552671" defaultRegion:@"US" error:&error]; + NBPhoneNumber *phoneNumberUS = + [phoneUtil parse:@"(366) 522-8999" defaultRegion:@"US" error:&error]; if (error) { NSLog(@"err [%@]", [error localizedDescription]); } NSLog(@"- isValidNumber [%@]", [phoneUtil isValidNumber:phoneNumberUS] ? @"YES" : @"NO"); - NSLog(@"- isPossibleNumber [%@]", [phoneUtil isPossibleNumber:phoneNumberUS error:&error] ? @"YES" : @"NO"); + NSLog(@"- isPossibleNumber [%@]", + [phoneUtil isPossibleNumber:phoneNumberUS error:&error] ? @"YES" : @"NO"); NSLog(@"- getRegionCodeForNumber [%@]", [phoneUtil getRegionCodeForNumber:phoneNumberUS]); } - NSLog(@"- - - - -"); - - { - NSError *error = nil; - NBPhoneNumber *phoneNumberZZ = [phoneUtil parse:@"+84 74 883313" defaultRegion:NB_UNKNOWN_REGION error:&error]; - if (error) { - NSLog(@"err [%@]", [error localizedDescription]); - } - NSLog(@"- isValidNumber [%@]", [phoneUtil isValidNumber:phoneNumberZZ] ? @"YES" : @"NO"); - NSLog(@"- isPossibleNumber [%@]", [phoneUtil isPossibleNumber:phoneNumberZZ error:&error] ? @"YES" : @"NO"); - NSLog(@"- getRegionCodeForNumber [%@]", [phoneUtil getRegionCodeForNumber:phoneNumberZZ]); + { + NSError *error = nil; + NBPhoneNumber *phoneNumberUS = + [phoneUtil parse:@"14155552671" defaultRegion:@"US" error:&error]; + if (error) { + NSLog(@"err [%@]", [error localizedDescription]); } + NSLog(@"- isValidNumber [%@]", [phoneUtil isValidNumber:phoneNumberUS] ? @"YES" : @"NO"); + NSLog(@"- isPossibleNumber [%@]", + [phoneUtil isPossibleNumber:phoneNumberUS error:&error] ? @"YES" : @"NO"); + NSLog(@"- getRegionCodeForNumber [%@]", [phoneUtil getRegionCodeForNumber:phoneNumberUS]); + } - NSLog(@"- - - - - GB / +923406171134"); + NSLog(@"- - - - -"); - // I can't validate pakistani numbers #58 - { - NSError *error = nil; - NBPhoneNumber *phoneNumberUS = [phoneUtil parse:@"+923406171134" defaultRegion:@"GB" error:&error]; - if (error) { - NSLog(@"err [%@]", [error localizedDescription]); - } - NSLog(@"- isValidNumber [%@]", [phoneUtil isValidNumber:phoneNumberUS] ? @"YES" : @"NO"); - NSLog(@"- isPossibleNumber [%@]", [phoneUtil isPossibleNumber:phoneNumberUS error:&error] ? @"YES" : @"NO"); - NSLog(@"- getRegionCodeForNumber [%@]", [phoneUtil getRegionCodeForNumber:phoneNumberUS]); + { + NSError *error = nil; + NBPhoneNumber *phoneNumberZZ = + [phoneUtil parse:@"+84 74 883313" defaultRegion:NB_UNKNOWN_REGION error:&error]; + if (error) { + NSLog(@"err [%@]", [error localizedDescription]); } + NSLog(@"- isValidNumber [%@]", [phoneUtil isValidNumber:phoneNumberZZ] ? @"YES" : @"NO"); + NSLog(@"- isPossibleNumber [%@]", + [phoneUtil isPossibleNumber:phoneNumberZZ error:&error] ? @"YES" : @"NO"); + NSLog(@"- getRegionCodeForNumber [%@]", [phoneUtil getRegionCodeForNumber:phoneNumberZZ]); + } - // finnish phone number don't get recognised #59 - { - NSString *nationalNumber = @""; - NSNumber *countryCode = [phoneUtil extractCountryCode:@"+358401493292" nationalNumber:&nationalNumber]; - NSLog(@"- %@ %@", countryCode, nationalNumber); + NSLog(@"- - - - - GB / +923406171134"); - NBPhoneNumber *phonePN = [phoneUtil parse:@"+358401493292" defaultRegion:@"FIN" error:nil]; - NSLog(@"- %@", [phoneUtil format:phonePN numberFormat:NBEPhoneNumberFormatINTERNATIONAL error:nil]); + // I can't validate pakistani numbers #58 + { + NSError *error = nil; + NBPhoneNumber *phoneNumberUS = + [phoneUtil parse:@"+923406171134" defaultRegion:@"GB" error:&error]; + if (error) { + NSLog(@"err [%@]", [error localizedDescription]); } + NSLog(@"- isValidNumber [%@]", [phoneUtil isValidNumber:phoneNumberUS] ? @"YES" : @"NO"); + NSLog(@"- isPossibleNumber [%@]", + [phoneUtil isPossibleNumber:phoneNumberUS error:&error] ? @"YES" : @"NO"); + NSLog(@"- getRegionCodeForNumber [%@]", [phoneUtil getRegionCodeForNumber:phoneNumberUS]); + } - NSLog(@"-------------- customTest"); + // finnish phone number don't get recognised #59 + { + NSString *nationalNumber = @""; + NSNumber *countryCode = + [phoneUtil extractCountryCode:@"+358401493292" nationalNumber:&nationalNumber]; + NSLog(@"- %@ %@", countryCode, nationalNumber); - NSError *anError = nil; + NBPhoneNumber *phonePN = [phoneUtil parse:@"+358401493292" defaultRegion:@"FIN" error:nil]; + NSLog(@"- %@", + [phoneUtil format:phonePN numberFormat:NBEPhoneNumberFormatINTERNATIONAL error:nil]); + } - NBPhoneNumber *myNumber = [phoneUtil parse:@"+8617196622520," defaultRegion:nil error:&anError]; - if (anError == nil) - { - NSLog(@"isValidPhoneNumber ? [%@]", [phoneUtil isValidNumber:myNumber] ? @"YES":@"NO"); - NSLog(@"E164 : %@", [phoneUtil format:myNumber numberFormat:NBEPhoneNumberFormatE164 error:&anError]); - NSLog(@"INTERNATIONAL : %@", [phoneUtil format:myNumber numberFormat:NBEPhoneNumberFormatINTERNATIONAL error:&anError]); - NSLog(@"NATIONAL : %@", [phoneUtil format:myNumber numberFormat:NBEPhoneNumberFormatNATIONAL error:&anError]); - NSLog(@"RFC3966 : %@", [phoneUtil format:myNumber numberFormat:NBEPhoneNumberFormatRFC3966 error:&anError]); - } - else - { - NSLog(@"Error : %@", [anError localizedDescription]); - } + NSLog(@"-------------- customTest"); - NSLog (@"extractCountryCode [%@]", [phoneUtil extractCountryCode:@"823213123123" nationalNumber:nil]); - NSString *res = nil; - NSNumber *dRes = [phoneUtil extractCountryCode:@"823213123123" nationalNumber:&res]; - NSLog (@"extractCountryCode [%@] [%@]", dRes, res); + NSError *anError = nil; - NBAsYouTypeFormatter *fr = [[NBAsYouTypeFormatter alloc] initWithRegionCode:@"FR"]; - NSLog(@"%@", [fr inputDigit:@"6"]); - NSLog(@"%@", [fr inputDigit:@"7"]); - NSLog(@"%@", [fr inputDigit:@"8"]); - NSLog(@"%@", [fr inputDigit:@"9"]); - NSLog(@"%@", [fr inputDigit:@"0"]); - NSLog(@"%@", [fr inputDigit:@"1"]); + NBPhoneNumber *myNumber = [phoneUtil parse:@"+8617196622520," defaultRegion:nil error:&anError]; + if (anError == nil) { + NSLog(@"isValidPhoneNumber ? [%@]", [phoneUtil isValidNumber:myNumber] ? @"YES" : @"NO"); + NSLog(@"E164 : %@", + [phoneUtil format:myNumber numberFormat:NBEPhoneNumberFormatE164 error:&anError]); + NSLog( + @"INTERNATIONAL : %@", + [phoneUtil format:myNumber numberFormat:NBEPhoneNumberFormatINTERNATIONAL error:&anError]); + NSLog(@"NATIONAL : %@", + [phoneUtil format:myNumber numberFormat:NBEPhoneNumberFormatNATIONAL error:&anError]); + NSLog(@"RFC3966 : %@", + [phoneUtil format:myNumber numberFormat:NBEPhoneNumberFormatRFC3966 error:&anError]); + } else { + NSLog(@"Error : %@", [anError localizedDescription]); + } - // Note this is how a US local number (without area code) should be formatted. - NSLog(@"%@", [fr inputDigit:@"2"]); - NSLog(@"%@", [fr inputDigit:@"3"]); - NSLog(@"%@", [fr inputDigit:@"4"]); + NSLog(@"extractCountryCode [%@]", + [phoneUtil extractCountryCode:@"823213123123" nationalNumber:nil]); + NSString *res = nil; + NSNumber *dRes = [phoneUtil extractCountryCode:@"823213123123" nationalNumber:&res]; + NSLog(@"extractCountryCode [%@] [%@]", dRes, res); - NSLog(@"%@", [fr inputString:@"0678901234"]); // 6 78 90 12 34 // it Should be like this + NBAsYouTypeFormatter *fr = [[NBAsYouTypeFormatter alloc] initWithRegionCode:@"FR"]; + NSLog(@"%@", [fr inputDigit:@"6"]); + NSLog(@"%@", [fr inputDigit:@"7"]); + NSLog(@"%@", [fr inputDigit:@"8"]); + NSLog(@"%@", [fr inputDigit:@"9"]); + NSLog(@"%@", [fr inputDigit:@"0"]); + NSLog(@"%@", [fr inputDigit:@"1"]); - // JP Test - NBPhoneNumber *phoneJP = [phoneUtil parse:@"0066-33-132432" defaultRegion:@"JP" error:nil]; - NSLog(@"- %@", [phoneUtil format:phoneJP numberFormat:NBEPhoneNumberFormatINTERNATIONAL error:nil]); - NSLog(@"- isValidNumber %@", [phoneUtil isValidNumber:phoneJP] ? @"Y":@"N"); - NSLog(@"- isPossibleNumber %@", [phoneUtil isPossibleNumber:phoneJP] ? @"Y":@"N"); + // Note this is how a US local number (without area code) should be formatted. + NSLog(@"%@", [fr inputDigit:@"2"]); + NSLog(@"%@", [fr inputDigit:@"3"]); + NSLog(@"%@", [fr inputDigit:@"4"]); + NSLog(@"%@", [fr inputString:@"0678901234"]); // 6 78 90 12 34 // it Should be like this + + // JP Test + NBPhoneNumber *phoneJP = [phoneUtil parse:@"0066-33-132432" defaultRegion:@"JP" error:nil]; + NSLog(@"- %@", + [phoneUtil format:phoneJP numberFormat:NBEPhoneNumberFormatINTERNATIONAL error:nil]); + NSLog(@"- isValidNumber %@", [phoneUtil isValidNumber:phoneJP] ? @"Y" : @"N"); + NSLog(@"- isPossibleNumber %@", [phoneUtil isPossibleNumber:phoneJP] ? @"Y" : @"N"); } +- (NSString *)stringWithRandomNumber { + NSString *numbers = @"0123456789"; + NSMutableString *randomString = [NSMutableString stringWithCapacity:11]; -- (NSString *)stringWithRandomNumber -{ - NSString *numbers = @"0123456789"; - NSMutableString *randomString = [NSMutableString stringWithCapacity:11]; + for (int i = 0; i < 12; i++) { + [randomString appendFormat:@"%C", [numbers characterAtIndex:arc4random() % [numbers length]]]; + } - for (int i=0; i<12; i++) { - [randomString appendFormat: @"%C", [numbers characterAtIndex: arc4random() % [numbers length]]]; - } - - return randomString; + return randomString; } - -- (NSString *)randomRegion -{ - NBMetadataHelper *aHelper = [[NBMetadataHelper alloc] init]; - NSDictionary *metadata = [[aHelper getAllMetadata] objectAtIndex:(arc4random() % [aHelper getAllMetadata].count)]; - if (metadata) { - NSString *region = [metadata objectForKey:@"code"]; - if (region) { - return region; - } +- (NSString *)randomRegion { + NBMetadataHelper *aHelper = [[NBMetadataHelper alloc] init]; + NSDictionary *metadata = + [[aHelper getAllMetadata] objectAtIndex:(arc4random() % [aHelper getAllMetadata].count)]; + if (metadata) { + NSString *region = [metadata objectForKey:@"code"]; + if (region) { + return region; } + } - return nil; + return nil; } +- (void)testForMultithread { + NBPhoneNumberUtil *aUtil = [NBPhoneNumberUtil sharedInstance]; + NSString *testRegion = [self randomRegion]; -- (void)testForMultithread -{ - NBPhoneNumberUtil *aUtil = [NBPhoneNumberUtil sharedInstance]; - NSString *testRegion = [self randomRegion]; + if (!testRegion) { + return; + } - if (!testRegion) { - return; + NSLog(@"- START [%@]", testRegion); + + dispatch_async(dispatch_get_main_queue(), ^{ + NSError *error = nil; + + for (int i = 0; i < 10000; i++) { + NBPhoneNumber *phoneNumber = + [aUtil parse:[self stringWithRandomNumber] defaultRegion:testRegion error:&error]; + if (error && ![error.domain isEqualToString:@"INVALID_COUNTRY_CODE"]) { + NSLog(@"error [%@]", [error localizedDescription]); + } + + if (!error) { + error = nil; + [aUtil format:phoneNumber numberFormat:NBEPhoneNumberFormatINTERNATIONAL error:&error]; + } + error = nil; } - NSLog(@"- START [%@]", testRegion); + NSLog(@"OK [%@]", testRegion); + }); +} - dispatch_async(dispatch_get_main_queue(), ^{ - NSError *error = nil; - - for (int i=0; i<10000; i++) { - NBPhoneNumber *phoneNumber = [aUtil parse:[self stringWithRandomNumber] defaultRegion:testRegion error:&error]; - if (error && ![error.domain isEqualToString:@"INVALID_COUNTRY_CODE"]) { - NSLog(@"error [%@]", [error localizedDescription]); - } - - if (!error) { - error = nil; - [aUtil format:phoneNumber numberFormat:NBEPhoneNumberFormatINTERNATIONAL error:&error]; - } - error = nil; - } - - NSLog(@"OK [%@]", testRegion); +- (void)testWithGCD { + for (int i = 0; i < 100; i++) { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ + [self testForMultithread]; }); + } } +- (void)testForExtraDatas { + NBMetadataHelper *helper = [[NBMetadataHelper alloc] init]; -- (void)testWithGCD -{ - for (int i = 0; i<100; i++) { - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ - [self testForMultithread]; - }); - } + NSArray *arrayData = [helper getAllMetadata]; + if (arrayData && arrayData.count > 0) { + NSLog(@"Log sample metadata [%@]", [arrayData firstObject]); + } else { + NSLog(@"Fail to extract meta data"); + } } - -- (void)testForExtraDatas -{ - NBMetadataHelper *helper = [[NBMetadataHelper alloc] init]; - - NSArray *arrayData = [helper getAllMetadata]; - if (arrayData && arrayData.count > 0) { - NSLog(@"Log sample metadata [%@]", [arrayData firstObject]); - } else { - NSLog(@"Fail to extract meta data"); - } +- (void)testCarrierRegion { + NSLog(@"testCarrierRegion %@", [self getPhoneNumberFormatted:@"1234567890"]); } -- (void)testCarrierRegion -{ - NSLog(@"testCarrierRegion %@", [self getPhoneNumberFormatted:@"1234567890"]); +- (NSString *)getPhoneNumberFormatted:(NSString *)phoneNumber { + NBPhoneNumberUtil *phoneUtil = [NBPhoneNumberUtil sharedInstance]; + NSString *retValue; + NBPhoneNumber *phoneNumberFormatted = + [phoneUtil parseWithPhoneCarrierRegion:phoneNumber error:nil]; + retValue = + [phoneUtil format:phoneNumberFormatted numberFormat:NBEPhoneNumberFormatRFC3966 error:nil]; + return retValue; } - -- (NSString *)getPhoneNumberFormatted:(NSString *)phoneNumber -{ - NBPhoneNumberUtil *phoneUtil = [NBPhoneNumberUtil sharedInstance]; - NSString *retValue; - NBPhoneNumber *phoneNumberFormatted = [phoneUtil parseWithPhoneCarrierRegion:phoneNumber error:nil]; - retValue = [phoneUtil format:phoneNumberFormatted numberFormat:NBEPhoneNumberFormatRFC3966 error:nil]; - return retValue; -} - - // FIXME: This unit test ALWAYS FAIL ... until google libPhoneNumber fix this issue -- (void)testAustriaNationalNumberParsing -{ - NBPhoneNumberUtil *phoneUtil = [NBPhoneNumberUtil sharedInstance]; +- (void)testAustriaNationalNumberParsing { + NBPhoneNumberUtil *phoneUtil = [NBPhoneNumberUtil sharedInstance]; - NSError *anError = nil; + NSError *anError = nil; - NSString *internationalNumberForInput = @"436606545646"; - NSString *nationalNumberForExpect = @"6606545646"; - NSString *defaultRegion = @"AT"; + NSString *internationalNumberForInput = @"436606545646"; + NSString *nationalNumberForExpect = @"6606545646"; + NSString *defaultRegion = @"AT"; - NBPhoneNumber *phoneNumber = [phoneUtil parse:internationalNumberForInput defaultRegion:defaultRegion error:&anError]; - NSString *nationalNumberForActual = [NSString stringWithFormat:@"%@", phoneNumber.nationalNumber]; - - // ALWAYS FAIL need fix "google libPhoneNumber" - NSLog(nationalNumberForExpect, nationalNumberForActual); + NBPhoneNumber *phoneNumber = + [phoneUtil parse:internationalNumberForInput defaultRegion:defaultRegion error:&anError]; + NSString *nationalNumberForActual = [NSString stringWithFormat:@"%@", phoneNumber.nationalNumber]; + // ALWAYS FAIL need fix "google libPhoneNumber" + NSLog(nationalNumberForExpect, nationalNumberForActual); } +- (void)testForiOS7 { + NBPhoneNumberUtil *phoneUtil = [NBPhoneNumberUtil sharedInstance]; -- (void)testForiOS7 -{ - NBPhoneNumberUtil *phoneUtil = [NBPhoneNumberUtil sharedInstance]; - - NSError *anError = nil; - NBPhoneNumber *myNumber = [phoneUtil parse:@"0174 2340XXX" defaultRegion:@"DE" error:&anError]; - if (anError == nil) { - NSLog(@"isValidPhoneNumber ? [%@]", [phoneUtil isValidNumber:myNumber] ? @"YES":@"NO"); - NSLog(@"E164 : %@", [phoneUtil format:myNumber numberFormat:NBEPhoneNumberFormatE164 error:&anError]); - NSLog(@"INTERNATIONAL : %@", [phoneUtil format:myNumber numberFormat:NBEPhoneNumberFormatINTERNATIONAL error:&anError]); - NSLog(@"NATIONAL : %@", [phoneUtil format:myNumber numberFormat:NBEPhoneNumberFormatNATIONAL error:&anError]); - NSLog(@"RFC3966 : %@", [phoneUtil format:myNumber numberFormat:NBEPhoneNumberFormatRFC3966 error:&anError]); - } else { - NSLog(@"Error : %@", [anError localizedDescription]); - } + NSError *anError = nil; + NBPhoneNumber *myNumber = [phoneUtil parse:@"0174 2340XXX" defaultRegion:@"DE" error:&anError]; + if (anError == nil) { + NSLog(@"isValidPhoneNumber ? [%@]", [phoneUtil isValidNumber:myNumber] ? @"YES" : @"NO"); + NSLog(@"E164 : %@", + [phoneUtil format:myNumber numberFormat:NBEPhoneNumberFormatE164 error:&anError]); + NSLog( + @"INTERNATIONAL : %@", + [phoneUtil format:myNumber numberFormat:NBEPhoneNumberFormatINTERNATIONAL error:&anError]); + NSLog(@"NATIONAL : %@", + [phoneUtil format:myNumber numberFormat:NBEPhoneNumberFormatNATIONAL error:&anError]); + NSLog(@"RFC3966 : %@", + [phoneUtil format:myNumber numberFormat:NBEPhoneNumberFormatRFC3966 error:&anError]); + } else { + NSLog(@"Error : %@", [anError localizedDescription]); + } } - - (void)applicationWillResignActive:(UIApplication *)application { - // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. + // Sent when the application is about to move from active to inactive state. This can occur for + // certain types of temporary interruptions (such as an incoming phone call or SMS message) or + // when the user quits the application and it begins the transition to the background state. Use + // this method to pause ongoing tasks, disable timers, and invalidate graphics rendering + // callbacks. Games should use this method to pause the game. } - - (void)applicationDidEnterBackground:(UIApplication *)application { - // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + // Use this method to release shared resources, save user data, invalidate timers, and store + // enough application state information to restore your application to its current state in case + // it is terminated later. If your application supports background execution, this method is + // called instead of applicationWillTerminate: when the user quits. } - - (void)applicationWillEnterForeground:(UIApplication *)application { - // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. + // Called as part of the transition from the background to the active state; here you can undo + // many of the changes made on entering the background. } - - (void)applicationDidBecomeActive:(UIApplication *)application { - // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + // Restart any tasks that were paused (or not yet started) while the application was inactive. If + // the application was previously in the background, optionally refresh the user interface. } - - (void)applicationWillTerminate:(UIApplication *)application { - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + // Called when the application is about to terminate. Save data if appropriate. See also + // applicationDidEnterBackground:. } - @end diff --git a/MetadataGenerator/ViewController.h b/MetadataGenerator/ViewController.h index bb2f9e1..c591439 100644 --- a/MetadataGenerator/ViewController.h +++ b/MetadataGenerator/ViewController.h @@ -10,6 +10,4 @@ @interface ViewController : UIViewController - @end - diff --git a/MetadataGenerator/ViewController.m b/MetadataGenerator/ViewController.m index f8111da..c9f1e77 100644 --- a/MetadataGenerator/ViewController.m +++ b/MetadataGenerator/ViewController.m @@ -15,15 +15,13 @@ @implementation ViewController - (void)viewDidLoad { - [super viewDidLoad]; - // Do any additional setup after loading the view, typically from a nib. + [super viewDidLoad]; + // Do any additional setup after loading the view, typically from a nib. } - - (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. } - @end diff --git a/MetadataGenerator/main.m b/MetadataGenerator/main.m index e08a272..105ca2c 100644 --- a/MetadataGenerator/main.m +++ b/MetadataGenerator/main.m @@ -9,8 +9,8 @@ #import #import "AppDelegate.h" -int main(int argc, char * argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } +int main(int argc, char* argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } } diff --git a/libPhoneNumber-iOS/libPhoneNumberiOS.h b/libPhoneNumber-iOS/libPhoneNumberiOS.h index 7675d83..ca4274a 100644 --- a/libPhoneNumber-iOS/libPhoneNumberiOS.h +++ b/libPhoneNumber-iOS/libPhoneNumberiOS.h @@ -14,20 +14,20 @@ FOUNDATION_EXPORT double libPhoneNumber_iOSVersionNumber; //! Project version string for libPhoneNumber-iOS. FOUNDATION_EXPORT const unsigned char libPhoneNumber_iOSVersionString[]; -// In this header, you should import all the public headers of your framework using statements like #import - +// In this header, you should import all the public headers of your framework +// using statements like #import #import "NBPhoneNumberDefines.h" // Features -#import "NBPhoneNumberUtil.h" #import "NBAsYouTypeFormatter.h" +#import "NBPhoneNumberUtil.h" // Metadata #import "NBMetadataHelper.h" // Model -#import "NBPhoneMetaData.h" #import "NBNumberFormat.h" +#import "NBPhoneMetaData.h" #import "NBPhoneNumber.h" #import "NBPhoneNumberDesc.h" diff --git a/libPhoneNumber-macOS/libPhoneNumbermacOS.h b/libPhoneNumber-macOS/libPhoneNumbermacOS.h index bc17479..589832e 100644 --- a/libPhoneNumber-macOS/libPhoneNumbermacOS.h +++ b/libPhoneNumber-macOS/libPhoneNumbermacOS.h @@ -14,20 +14,20 @@ FOUNDATION_EXPORT double libPhoneNumbermacOSVersionNumber; //! Project version string for libPhoneNumbermacOS. FOUNDATION_EXPORT const unsigned char libPhoneNumbermacOSVersionString[]; -// In this header, you should import all the public headers of your framework using statements like #import - +// In this header, you should import all the public headers of your framework +// using statements like #import #import "NBPhoneNumberDefines.h" // Features -#import "NBPhoneNumberUtil.h" #import "NBAsYouTypeFormatter.h" +#import "NBPhoneNumberUtil.h" // Metadata #import "NBMetadataHelper.h" // Model -#import "NBPhoneMetaData.h" #import "NBNumberFormat.h" +#import "NBPhoneMetaData.h" #import "NBPhoneNumber.h" #import "NBPhoneNumberDesc.h" diff --git a/libPhoneNumber-tvOS/libPhoneNumbertvOS.h b/libPhoneNumber-tvOS/libPhoneNumbertvOS.h index c019da5..2891f00 100644 --- a/libPhoneNumber-tvOS/libPhoneNumbertvOS.h +++ b/libPhoneNumber-tvOS/libPhoneNumbertvOS.h @@ -14,20 +14,20 @@ FOUNDATION_EXPORT double libPhoneNumber_tvOSVersionNumber; //! Project version string for libPhoneNumber-tvOS. FOUNDATION_EXPORT const unsigned char libPhoneNumber_tvOSVersionString[]; -// In this header, you should import all the public headers of your framework using statements like #import - +// In this header, you should import all the public headers of your framework +// using statements like #import #import "NBPhoneNumberDefines.h" // Features -#import "NBPhoneNumberUtil.h" #import "NBAsYouTypeFormatter.h" +#import "NBPhoneNumberUtil.h" // Metadata #import "NBMetadataCore.h" // Model -#import "NBPhoneMetaData.h" #import "NBNumberFormat.h" +#import "NBPhoneMetaData.h" #import "NBPhoneNumber.h" #import "NBPhoneNumberDesc.h" diff --git a/libPhoneNumber-watchOS/libPhoneNumberwatchOS.h b/libPhoneNumber-watchOS/libPhoneNumberwatchOS.h index 0df7f71..fe11e12 100644 --- a/libPhoneNumber-watchOS/libPhoneNumberwatchOS.h +++ b/libPhoneNumber-watchOS/libPhoneNumberwatchOS.h @@ -14,20 +14,20 @@ FOUNDATION_EXPORT double libPhoneNumber_watchOSVersionNumber; //! Project version string for libPhoneNumber-watchOS. FOUNDATION_EXPORT const unsigned char libPhoneNumber_watchOSVersionString[]; -// In this header, you should import all the public headers of your framework using statements like #import - +// In this header, you should import all the public headers of your framework +// using statements like #import #import "NBPhoneNumberDefines.h" // Features -#import "NBPhoneNumberUtil.h" #import "NBAsYouTypeFormatter.h" +#import "NBPhoneNumberUtil.h" // Metadata #import "NBMetadataCore.h" // Model -#import "NBPhoneMetaData.h" #import "NBNumberFormat.h" +#import "NBPhoneMetaData.h" #import "NBPhoneNumber.h" #import "NBPhoneNumberDesc.h" diff --git a/libPhoneNumber/NBAsYouTypeFormatter.h b/libPhoneNumber/NBAsYouTypeFormatter.h old mode 100755 new mode 100644 index 807021e..417f4e8 --- a/libPhoneNumber/NBAsYouTypeFormatter.h +++ b/libPhoneNumber/NBAsYouTypeFormatter.h @@ -7,10 +7,8 @@ #import - @class NBAsYouTypeFormatter; - @interface NBAsYouTypeFormatter : NSObject - (instancetype)initWithRegionCode:(NSString *)regionCode; @@ -19,8 +17,8 @@ - (NSString *)inputString:(NSString *)string; - (NSString *)inputStringAndRememberPosition:(NSString *)string; -- (NSString *)inputDigit:(NSString*)nextChar; -- (NSString *)inputDigitAndRememberPosition:(NSString*)nextChar; +- (NSString *)inputDigit:(NSString *)nextChar; +- (NSString *)inputDigitAndRememberPosition:(NSString *)nextChar; - (NSString *)removeLastDigit; - (NSString *)removeLastDigitAndRememberPosition; @@ -29,6 +27,6 @@ - (void)clear; -@property (nonatomic, assign, readonly) BOOL isSuccessfulFormatting; +@property(nonatomic, assign, readonly) BOOL isSuccessfulFormatting; @end diff --git a/libPhoneNumber/NBAsYouTypeFormatter.m b/libPhoneNumber/NBAsYouTypeFormatter.m old mode 100755 new mode 100644 index b9c2812..908bb03 --- a/libPhoneNumber/NBAsYouTypeFormatter.m +++ b/libPhoneNumber/NBAsYouTypeFormatter.m @@ -10,16 +10,16 @@ #import "NBMetadataHelper.h" -#import "NBPhoneNumberUtil.h" -#import "NBPhoneMetaData.h" #import "NBNumberFormat.h" +#import "NBPhoneMetaData.h" +#import "NBPhoneNumberUtil.h" #import "NSArray+NBAdditions.h" /** * The digits that have not been entered yet will be represented by a \u2008, * the punctuation space. */ - static NSString *const NBDigitPlaceHolder = @"\u2008"; +static NSString *const NBDigitPlaceHolder = @"\u2008"; /** * Character used when appropriate to separate a prefix, such as a long NDD or a * country calling code, from the national number. @@ -36,208 +36,222 @@ static const NSUInteger NBMinLeadingDigitsLength = 3; @interface NBAsYouTypeFormatter () -@property (nonatomic, strong, readwrite) NSString *currentOutput_, *currentFormattingPattern_; -@property (nonatomic, strong, readwrite) NSString *defaultCountry_; -@property (nonatomic, strong, readwrite) NSString *nationalPrefixExtracted_; -@property (nonatomic, strong, readwrite) NSMutableString *formattingTemplate_, *accruedInput_, *prefixBeforeNationalNumber_, *accruedInputWithoutFormatting_, *nationalNumber_; -@property (nonatomic, strong, readwrite) NSRegularExpression *DIGIT_PATTERN_, *NATIONAL_PREFIX_SEPARATORS_PATTERN_, *CHARACTER_CLASS_PATTERN_, *STANDALONE_DIGIT_PATTERN_; -@property (nonatomic, strong, readwrite) NSRegularExpression *ELIGIBLE_FORMAT_PATTERN_; -@property (nonatomic, assign, readwrite) BOOL ableToFormat_, inputHasFormatting_, isCompleteNumber_, isExpectingCountryCallingCode_, shouldAddSpaceAfterNationalPrefix_; -@property (nonatomic, strong, readwrite) NBPhoneNumberUtil *phoneUtil_; -@property (nonatomic, assign, readwrite) NSUInteger lastMatchPosition_, originalPosition_, positionToRemember_; -@property (nonatomic, strong, readwrite) NSMutableArray *possibleFormats_; -@property (nonatomic, strong, readwrite) NBPhoneMetaData *currentMetaData_, *defaultMetaData_; +@property(nonatomic, strong, readwrite) NSString *currentOutput_, *currentFormattingPattern_; +@property(nonatomic, strong, readwrite) NSString *defaultCountry_; +@property(nonatomic, strong, readwrite) NSString *nationalPrefixExtracted_; +@property(nonatomic, strong, readwrite) NSMutableString *formattingTemplate_, *accruedInput_, + *prefixBeforeNationalNumber_, *accruedInputWithoutFormatting_, *nationalNumber_; +@property(nonatomic, strong, readwrite) NSRegularExpression *DIGIT_PATTERN_, + *NATIONAL_PREFIX_SEPARATORS_PATTERN_, *CHARACTER_CLASS_PATTERN_, *STANDALONE_DIGIT_PATTERN_; +@property(nonatomic, strong, readwrite) NSRegularExpression *ELIGIBLE_FORMAT_PATTERN_; +@property(nonatomic, assign, readwrite) BOOL ableToFormat_, inputHasFormatting_, isCompleteNumber_, + isExpectingCountryCallingCode_, shouldAddSpaceAfterNationalPrefix_; +@property(nonatomic, strong, readwrite) NBPhoneNumberUtil *phoneUtil_; +@property(nonatomic, assign, readwrite) NSUInteger lastMatchPosition_, originalPosition_, + positionToRemember_; +@property(nonatomic, strong, readwrite) NSMutableArray *possibleFormats_; +@property(nonatomic, strong, readwrite) NBPhoneMetaData *currentMetaData_, *defaultMetaData_; @end - @implementation NBAsYouTypeFormatter -- (instancetype)init -{ - self = [super init]; - - if (self) { - _isSuccessfulFormatting = NO; - - /** - * @type {string} - * @private - */ - self.currentOutput_ = @""; - - /** - * @type {!goog.string.StringBuffer} - * @private - */ - self.formattingTemplate_ = [[NSMutableString alloc] init]; - - NSError *anError = nil; - - /** - * @type {RegExp} - * @private - */ - self.DIGIT_PATTERN_ = [NSRegularExpression regularExpressionWithPattern:NBDigitPlaceHolder options:0 error:&anError]; - - /** - * A set of characters that, if found in a national prefix formatting rules, are - * an indicator to us that we should separate the national prefix from the - * number when formatting. - * @const - * @type {RegExp} - * @private - */ - self.NATIONAL_PREFIX_SEPARATORS_PATTERN_ = [NSRegularExpression regularExpressionWithPattern:@"[- ]" options:0 error:&anError]; - - /** - * A pattern that is used to match character classes in regular expressions. - * An example of a character class is [1-4]. - * @const - * @type {RegExp} - * @private - */ - self.CHARACTER_CLASS_PATTERN_ = [NSRegularExpression regularExpressionWithPattern:@"\\[([^\\[\\]])*\\]" options:0 error:&anError]; - - /** - * Any digit in a regular expression that actually denotes a digit. For - * example, in the regular expression 80[0-2]\d{6,10}, the first 2 digits - * (8 and 0) are standalone digits, but the rest are not. - * Two look-aheads are needed because the number following \\d could be a - * two-digit number, since the phone number can be as long as 15 digits. - * @const - * @type {RegExp} - * @private - */ - self.STANDALONE_DIGIT_PATTERN_ = [NSRegularExpression regularExpressionWithPattern:@"\\d(?=[^,}][^,}])" options:0 error:&anError]; - - /** - * A pattern that is used to determine if a numberFormat under availableFormats - * is eligible to be used by the AYTF. It is eligible when the format element - * under numberFormat contains groups of the dollar sign followed by a single - * digit, separated by valid phone number punctuation. This prevents invalid - * punctuation (such as the star sign in Israeli star numbers) getting into the - * output of the AYTF. - * @const - * @type {RegExp} - * @private - */ - NSString *eligible_format = @"^[-x‐-―−ー--/ ­​⁠ ()()[].\\[\\]/~⁓∼~]*(\\$\\d[-x‐-―−ー--/ ­​⁠ ()()[].\\[\\]/~⁓∼~]*)+$"; - self.ELIGIBLE_FORMAT_PATTERN_ = [NSRegularExpression regularExpressionWithPattern:eligible_format options:0 error:&anError]; - - /** - * The pattern from numberFormat that is currently used to create - * formattingTemplate. - * @type {string} - * @private - */ - self.currentFormattingPattern_ = @""; - - /** - * @type {!goog.string.StringBuffer} - * @private - */ - self.accruedInput_ = [[NSMutableString alloc] init]; - - /** - * @type {!goog.string.StringBuffer} - * @private - */ - self.accruedInputWithoutFormatting_ = [[NSMutableString alloc] init]; - - /** - * This indicates whether AsYouTypeFormatter is currently doing the - * formatting. - * @type {BOOL} - * @private - */ - self.ableToFormat_ = YES; - - /** - * Set to YES when users enter their own formatting. AsYouTypeFormatter will - * do no formatting at all when this is set to YES. - * @type {BOOL} - * @private - */ - self.inputHasFormatting_ = NO; - - /** - * This is set to YES when we know the user is entering a full national - * significant number, since we have either detected a national prefix or an - * international dialing prefix. When this is YES, we will no longer use - * local number formatting patterns. - * @type {BOOL} - * @private - */ - self.isCompleteNumber_ = NO; - - /** - * @type {BOOL} - * @private - */ - self.isExpectingCountryCallingCode_ = NO; - - /** - * @type {number} - * @private - */ - self.lastMatchPosition_ = 0; - - /** - * The position of a digit upon which inputDigitAndRememberPosition is most - * recently invoked, as found in the original sequence of characters the user - * entered. - * @type {number} - * @private - */ - self.originalPosition_ = 0; - - /** - * The position of a digit upon which inputDigitAndRememberPosition is most - * recently invoked, as found in accruedInputWithoutFormatting. - * entered. - * @type {number} - * @private - */ - self.positionToRemember_ = 0; - - /** - * This contains anything that has been entered so far preceding the national - * significant number, and it is formatted (e.g. with space inserted). For - * example, this can contain IDD, country code, and/or NDD, etc. - * @type {!goog.string.StringBuffer} - * @private - */ - self.prefixBeforeNationalNumber_ = [[NSMutableString alloc] init]; - - /** - * @type {BOOL} - * @private - */ - self.shouldAddSpaceAfterNationalPrefix_ = NO; - - /** - * This contains the national prefix that has been extracted. It contains only - * digits without formatting. - * @type {string} - * @private - */ - self.nationalPrefixExtracted_ = @""; - - /** - * @type {!goog.string.StringBuffer} - * @private - */ - self.nationalNumber_ = [[NSMutableString alloc] init]; - - /** - * @type {Array.} - * @private - */ - self.possibleFormats_ = [[NSMutableArray alloc] init]; - } - - return self; +- (instancetype)init { + self = [super init]; + + if (self) { + _isSuccessfulFormatting = NO; + + /** + * @type {string} + * @private + */ + self.currentOutput_ = @""; + + /** + * @type {!goog.string.StringBuffer} + * @private + */ + self.formattingTemplate_ = [[NSMutableString alloc] init]; + + NSError *anError = nil; + + /** + * @type {RegExp} + * @private + */ + self.DIGIT_PATTERN_ = [NSRegularExpression regularExpressionWithPattern:NBDigitPlaceHolder + options:0 + error:&anError]; + + /** + * A set of characters that, if found in a national prefix formatting rules, are + * an indicator to us that we should separate the national prefix from the + * number when formatting. + * @const + * @type {RegExp} + * @private + */ + self.NATIONAL_PREFIX_SEPARATORS_PATTERN_ = + [NSRegularExpression regularExpressionWithPattern:@"[- ]" options:0 error:&anError]; + + /** + * A pattern that is used to match character classes in regular expressions. + * An example of a character class is [1-4]. + * @const + * @type {RegExp} + * @private + */ + self.CHARACTER_CLASS_PATTERN_ = + [NSRegularExpression regularExpressionWithPattern:@"\\[([^\\[\\]])*\\]" + options:0 + error:&anError]; + + /** + * Any digit in a regular expression that actually denotes a digit. For + * example, in the regular expression 80[0-2]\d{6,10}, the first 2 digits + * (8 and 0) are standalone digits, but the rest are not. + * Two look-aheads are needed because the number following \\d could be a + * two-digit number, since the phone number can be as long as 15 digits. + * @const + * @type {RegExp} + * @private + */ + self.STANDALONE_DIGIT_PATTERN_ = + [NSRegularExpression regularExpressionWithPattern:@"\\d(?=[^,}][^,}])" + options:0 + error:&anError]; + + /** + * A pattern that is used to determine if a numberFormat under availableFormats + * is eligible to be used by the AYTF. It is eligible when the format element + * under numberFormat contains groups of the dollar sign followed by a single + * digit, separated by valid phone number punctuation. This prevents invalid + * punctuation (such as the star sign in Israeli star numbers) getting into the + * output of the AYTF. + * @const + * @type {RegExp} + * @private + */ + NSString *eligible_format = + @"^[-x‐-―−ー--/ ­​⁠ ()()[].\\[\\]/~⁓∼~]*(\\$\\d[-x‐-―−ー--/ " + @"­​⁠ ()()[].\\[\\]/~⁓∼~]*)+$"; + self.ELIGIBLE_FORMAT_PATTERN_ = + [NSRegularExpression regularExpressionWithPattern:eligible_format options:0 error:&anError]; + + /** + * The pattern from numberFormat that is currently used to create + * formattingTemplate. + * @type {string} + * @private + */ + self.currentFormattingPattern_ = @""; + + /** + * @type {!goog.string.StringBuffer} + * @private + */ + self.accruedInput_ = [[NSMutableString alloc] init]; + + /** + * @type {!goog.string.StringBuffer} + * @private + */ + self.accruedInputWithoutFormatting_ = [[NSMutableString alloc] init]; + + /** + * This indicates whether AsYouTypeFormatter is currently doing the + * formatting. + * @type {BOOL} + * @private + */ + self.ableToFormat_ = YES; + + /** + * Set to YES when users enter their own formatting. AsYouTypeFormatter will + * do no formatting at all when this is set to YES. + * @type {BOOL} + * @private + */ + self.inputHasFormatting_ = NO; + + /** + * This is set to YES when we know the user is entering a full national + * significant number, since we have either detected a national prefix or an + * international dialing prefix. When this is YES, we will no longer use + * local number formatting patterns. + * @type {BOOL} + * @private + */ + self.isCompleteNumber_ = NO; + + /** + * @type {BOOL} + * @private + */ + self.isExpectingCountryCallingCode_ = NO; + + /** + * @type {number} + * @private + */ + self.lastMatchPosition_ = 0; + + /** + * The position of a digit upon which inputDigitAndRememberPosition is most + * recently invoked, as found in the original sequence of characters the user + * entered. + * @type {number} + * @private + */ + self.originalPosition_ = 0; + + /** + * The position of a digit upon which inputDigitAndRememberPosition is most + * recently invoked, as found in accruedInputWithoutFormatting. + * entered. + * @type {number} + * @private + */ + self.positionToRemember_ = 0; + + /** + * This contains anything that has been entered so far preceding the national + * significant number, and it is formatted (e.g. with space inserted). For + * example, this can contain IDD, country code, and/or NDD, etc. + * @type {!goog.string.StringBuffer} + * @private + */ + self.prefixBeforeNationalNumber_ = [[NSMutableString alloc] init]; + + /** + * @type {BOOL} + * @private + */ + self.shouldAddSpaceAfterNationalPrefix_ = NO; + + /** + * This contains the national prefix that has been extracted. It contains only + * digits without formatting. + * @type {string} + * @private + */ + self.nationalPrefixExtracted_ = @""; + + /** + * @type {!goog.string.StringBuffer} + * @private + */ + self.nationalNumber_ = [[NSMutableString alloc] init]; + + /** + * @type {Array.} + * @private + */ + self.possibleFormats_ = [[NSMutableArray alloc] init]; + } + + return self; } /** @@ -248,30 +262,28 @@ static const NSUInteger NBMinLeadingDigitsLength = 3; * @constructor */ -- (instancetype)initWithRegionCode:(NSString*)regionCode -{ - return [self initWithRegionCode:regionCode bundle:[NSBundle mainBundle]]; +- (instancetype)initWithRegionCode:(NSString *)regionCode { + return [self initWithRegionCode:regionCode bundle:[NSBundle mainBundle]]; } -- (instancetype)initWithRegionCode:(NSString*)regionCode bundle:(NSBundle *)bundle -{ - self = [self init]; - if (self) { - /** - * @private - * @type {i18n.phonenumbers.PhoneNumberUtil} - */ - self.phoneUtil_ = [NBPhoneNumberUtil sharedInstance]; - self.defaultCountry_ = regionCode; - self.currentMetaData_ = [self getMetadataForRegion_:self.defaultCountry_]; - /** - * @type {i18n.phonenumbers.PhoneMetadata} - * @private - */ - self.defaultMetaData_ = self.currentMetaData_; - } - - return self; +- (instancetype)initWithRegionCode:(NSString *)regionCode bundle:(NSBundle *)bundle { + self = [self init]; + if (self) { + /** + * @private + * @type {i18n.phonenumbers.PhoneNumberUtil} + */ + self.phoneUtil_ = [NBPhoneNumberUtil sharedInstance]; + self.defaultCountry_ = regionCode; + self.currentMetaData_ = [self getMetadataForRegion_:self.defaultCountry_]; + /** + * @type {i18n.phonenumbers.PhoneMetadata} + * @private + */ + self.defaultMetaData_ = self.currentMetaData_; + } + + return self; } /** @@ -282,195 +294,193 @@ static const NSUInteger NBMinLeadingDigitsLength = 3; * @return {i18n.phonenumbers.PhoneMetadata} main metadata for this region. * @private */ -- (NBPhoneMetaData*)getMetadataForRegion_:(NSString*)regionCode -{ - NBMetadataHelper *helper = [[NBMetadataHelper alloc] init]; - /** @type {number} */ - NSNumber *countryCallingCode = [self.phoneUtil_ getCountryCodeForRegion:regionCode]; - /** @type {string} */ - NSString *mainCountry = [self.phoneUtil_ getRegionCodeForCountryCode:countryCallingCode]; - /** @type {i18n.phonenumbers.PhoneMetadata} */ - NBPhoneMetaData *metadata = [helper getMetadataForRegion:mainCountry]; - if (metadata != nil) { - return metadata; - } - // Set to a default instance of the metadata. This allows us to function with - // an incorrect region code, even if formatting only works for numbers - // specified with '+'. - return [[NBPhoneMetaData alloc] init]; +- (NBPhoneMetaData *)getMetadataForRegion_:(NSString *)regionCode { + NBMetadataHelper *helper = [[NBMetadataHelper alloc] init]; + /** @type {number} */ + NSNumber *countryCallingCode = [self.phoneUtil_ getCountryCodeForRegion:regionCode]; + /** @type {string} */ + NSString *mainCountry = [self.phoneUtil_ getRegionCodeForCountryCode:countryCallingCode]; + /** @type {i18n.phonenumbers.PhoneMetadata} */ + NBPhoneMetaData *metadata = [helper getMetadataForRegion:mainCountry]; + if (metadata != nil) { + return metadata; + } + // Set to a default instance of the metadata. This allows us to function with + // an incorrect region code, even if formatting only works for numbers + // specified with '+'. + return [[NBPhoneMetaData alloc] init]; } - /** * @return {BOOL} YES if a new template is created as opposed to reusing the * existing template. * @private */ -- (BOOL)maybeCreateNewTemplate_ -{ - // When there are multiple available formats, the formatter uses the first - // format where a formatting template could be created. - /** @type {number} */ - NSUInteger possibleFormatsLength = [self.possibleFormats_ count]; - for (NSUInteger i = 0; i < possibleFormatsLength; ++i) - { - /** @type {i18n.phonenumbers.NumberFormat} */ - NBNumberFormat *numberFormat = [self.possibleFormats_ nb_safeObjectAtIndex:i class:[NBNumberFormat class]]; - /** @type {string} */ - NSString *pattern = numberFormat.pattern; - - if (!pattern.length || [self.currentFormattingPattern_ isEqualToString:pattern]) { - return NO; - } - - if ([self createFormattingTemplate_:numberFormat ]) - { - self.currentFormattingPattern_ = pattern; - NSRange nationalPrefixRange = NSMakeRange(0, [numberFormat.nationalPrefixFormattingRule length]); - if (nationalPrefixRange.length > 0) { - NSTextCheckingResult *matchResult = - [self.NATIONAL_PREFIX_SEPARATORS_PATTERN_ firstMatchInString:numberFormat.nationalPrefixFormattingRule - options:0 - range:nationalPrefixRange]; - self.shouldAddSpaceAfterNationalPrefix_ = (matchResult != nil); - } else { - self.shouldAddSpaceAfterNationalPrefix_ = NO; - } - // With a new formatting template, the matched position using the old - // template needs to be reset. - self.lastMatchPosition_ = 0; - return YES; - } - } - self.ableToFormat_ = NO; - return NO; -} +- (BOOL)maybeCreateNewTemplate_ { + // When there are multiple available formats, the formatter uses the first + // format where a formatting template could be created. + /** @type {number} */ + NSUInteger possibleFormatsLength = [self.possibleFormats_ count]; + for (NSUInteger i = 0; i < possibleFormatsLength; ++i) { + /** @type {i18n.phonenumbers.NumberFormat} */ + NBNumberFormat *numberFormat = + [self.possibleFormats_ nb_safeObjectAtIndex:i class:[NBNumberFormat class]]; + /** @type {string} */ + NSString *pattern = numberFormat.pattern; + if (!pattern.length || [self.currentFormattingPattern_ isEqualToString:pattern]) { + return NO; + } + + if ([self createFormattingTemplate_:numberFormat]) { + self.currentFormattingPattern_ = pattern; + NSRange nationalPrefixRange = + NSMakeRange(0, [numberFormat.nationalPrefixFormattingRule length]); + if (nationalPrefixRange.length > 0) { + NSTextCheckingResult *matchResult = [self.NATIONAL_PREFIX_SEPARATORS_PATTERN_ + firstMatchInString:numberFormat.nationalPrefixFormattingRule + options:0 + range:nationalPrefixRange]; + self.shouldAddSpaceAfterNationalPrefix_ = (matchResult != nil); + } else { + self.shouldAddSpaceAfterNationalPrefix_ = NO; + } + // With a new formatting template, the matched position using the old + // template needs to be reset. + self.lastMatchPosition_ = 0; + return YES; + } + } + self.ableToFormat_ = NO; + return NO; +} /** * - param leadingDigits leadingThreeDigits first three digits of entered number. * @private */ -- (void)getAvailableFormats_:(NSString*)leadingDigits -{ - /** @type {Array.} */ - BOOL isIntlNumberFormats = (self.isCompleteNumber_ && self.currentMetaData_.intlNumberFormats.count > 0); - NSArray *formatList = isIntlNumberFormats ? self.currentMetaData_.intlNumberFormats : self.currentMetaData_.numberFormats; - - /** @type {number} */ - NSUInteger formatListLength = formatList.count; - - for (NSUInteger i = 0; i < formatListLength; ++i) - { - /** @type {i18n.phonenumbers.NumberFormat} */ - NBNumberFormat *format = [formatList nb_safeObjectAtIndex:i class:[NBNumberFormat class]]; - /** @type {BOOL} */ - BOOL nationalPrefixIsUsedByCountry = (self.currentMetaData_.nationalPrefix && self.currentMetaData_.nationalPrefix.length > 0); - - if (!nationalPrefixIsUsedByCountry || self.isCompleteNumber_ || format.nationalPrefixOptionalWhenFormatting || - [self.phoneUtil_ formattingRuleHasFirstGroupOnly:format.nationalPrefixFormattingRule]) - { - if ([self isFormatEligible_:format.format]) { - [self.possibleFormats_ addObject:format]; - } - } - } - - [self narrowDownPossibleFormats_:leadingDigits]; -} +- (void)getAvailableFormats_:(NSString *)leadingDigits { + /** @type {Array.} */ + BOOL isIntlNumberFormats = + (self.isCompleteNumber_ && self.currentMetaData_.intlNumberFormats.count > 0); + NSArray *formatList = isIntlNumberFormats ? self.currentMetaData_.intlNumberFormats + : self.currentMetaData_.numberFormats; + /** @type {number} */ + NSUInteger formatListLength = formatList.count; + + for (NSUInteger i = 0; i < formatListLength; ++i) { + /** @type {i18n.phonenumbers.NumberFormat} */ + NBNumberFormat *format = [formatList nb_safeObjectAtIndex:i class:[NBNumberFormat class]]; + /** @type {BOOL} */ + BOOL nationalPrefixIsUsedByCountry = + (self.currentMetaData_.nationalPrefix && self.currentMetaData_.nationalPrefix.length > 0); + + if (!nationalPrefixIsUsedByCountry || self.isCompleteNumber_ || + format.nationalPrefixOptionalWhenFormatting || + [self.phoneUtil_ formattingRuleHasFirstGroupOnly:format.nationalPrefixFormattingRule]) { + if ([self isFormatEligible_:format.format]) { + [self.possibleFormats_ addObject:format]; + } + } + } + + [self narrowDownPossibleFormats_:leadingDigits]; +} /** * - param format format * @return {BOOL} * @private */ -- (BOOL)isFormatEligible_:(NSString*)format -{ - if ( !format.length ) { - return NO; - } - NSTextCheckingResult *matchResult = - [self.ELIGIBLE_FORMAT_PATTERN_ firstMatchInString:format options:0 range:NSMakeRange(0, [format length])]; - return (matchResult != nil); +- (BOOL)isFormatEligible_:(NSString *)format { + if (!format.length) { + return NO; + } + NSTextCheckingResult *matchResult = + [self.ELIGIBLE_FORMAT_PATTERN_ firstMatchInString:format + options:0 + range:NSMakeRange(0, [format length])]; + return (matchResult != nil); } - /** * - param leadingDigits leadingDigits * @private */ -- (void)narrowDownPossibleFormats_:(NSString *)leadingDigits -{ - /** @type {Array.} */ - NSMutableArray *possibleFormats = [[NSMutableArray alloc] init]; - /** @type {number} */ - NSUInteger indexOfLeadingDigitsPattern = leadingDigits.length - NBMinLeadingDigitsLength; - /** @type {number} */ - NSUInteger possibleFormatsLength = self.possibleFormats_.count; - - for (NSUInteger i = 0; i < possibleFormatsLength; ++i) - { - /** @type {i18n.phonenumbers.NumberFormat} */ - NBNumberFormat *format = [self.possibleFormats_ nb_safeObjectAtIndex:i class:[NBNumberFormat class]]; - - if (format.leadingDigitsPatterns.count == 0) { - // Keep everything that isn't restricted by leading digits. - [possibleFormats addObject:format]; - continue; - } - - /** @type {number} */ - NSInteger lastLeadingDigitsPattern = MIN(indexOfLeadingDigitsPattern, format.leadingDigitsPatterns.count - 1); - - /** @type {string} */ - NSString *leadingDigitsPattern = [format.leadingDigitsPatterns nb_safeStringAtIndex:lastLeadingDigitsPattern]; +- (void)narrowDownPossibleFormats_:(NSString *)leadingDigits { + /** @type {Array.} */ + NSMutableArray *possibleFormats = [[NSMutableArray alloc] init]; + /** @type {number} */ + NSUInteger indexOfLeadingDigitsPattern = leadingDigits.length - NBMinLeadingDigitsLength; + /** @type {number} */ + NSUInteger possibleFormatsLength = self.possibleFormats_.count; - if ([self.phoneUtil_ stringPositionByRegex:leadingDigits regex:leadingDigitsPattern] == 0) { - [possibleFormats addObject:format]; - } + for (NSUInteger i = 0; i < possibleFormatsLength; ++i) { + /** @type {i18n.phonenumbers.NumberFormat} */ + NBNumberFormat *format = + [self.possibleFormats_ nb_safeObjectAtIndex:i class:[NBNumberFormat class]]; + + if (format.leadingDigitsPatterns.count == 0) { + // Keep everything that isn't restricted by leading digits. + [possibleFormats addObject:format]; + continue; } - self.possibleFormats_ = possibleFormats; -} + /** @type {number} */ + NSInteger lastLeadingDigitsPattern = + MIN(indexOfLeadingDigitsPattern, format.leadingDigitsPatterns.count - 1); + + /** @type {string} */ + NSString *leadingDigitsPattern = + [format.leadingDigitsPatterns nb_safeStringAtIndex:lastLeadingDigitsPattern]; + + if ([self.phoneUtil_ stringPositionByRegex:leadingDigits regex:leadingDigitsPattern] == 0) { + [possibleFormats addObject:format]; + } + } + self.possibleFormats_ = possibleFormats; +} /** * - param {i18n.phonenumbers.NumberFormat} format * @return {BOOL} * @private */ -- (BOOL)createFormattingTemplate_:(NBNumberFormat*)format -{ - /** @type {string} */ - NSString *numberPattern = format.pattern; - - // The formatter doesn't format numbers when numberPattern contains '|', e.g. - // (20|3)\d{4}. In those cases we quickly return. - NSRange stringRange = [numberPattern rangeOfString:@"|"]; - if (stringRange.location != NSNotFound) { - return NO; - } - - // Replace anything in the form of [..] with \d - numberPattern = [self.CHARACTER_CLASS_PATTERN_ stringByReplacingMatchesInString:numberPattern - options:0 range:NSMakeRange(0, [numberPattern length]) - withTemplate:@"\\\\d"]; - - // Replace any standalone digit (not the one in d{}) with \d - numberPattern = [self.STANDALONE_DIGIT_PATTERN_ stringByReplacingMatchesInString:numberPattern - options:0 range:NSMakeRange(0, [numberPattern length]) - withTemplate:@"\\\\d"]; - [self.formattingTemplate_ setString:@""]; - - /** @type {string} */ - NSString *tempTemplate = [self getFormattingTemplate_:numberPattern numberFormat:format.format]; - if (tempTemplate.length > 0) { - [self.formattingTemplate_ appendString:tempTemplate]; - return YES; - } - return NO; -} +- (BOOL)createFormattingTemplate_:(NBNumberFormat *)format { + /** @type {string} */ + NSString *numberPattern = format.pattern; + // The formatter doesn't format numbers when numberPattern contains '|', e.g. + // (20|3)\d{4}. In those cases we quickly return. + NSRange stringRange = [numberPattern rangeOfString:@"|"]; + if (stringRange.location != NSNotFound) { + return NO; + } + + // Replace anything in the form of [..] with \d + numberPattern = [self.CHARACTER_CLASS_PATTERN_ + stringByReplacingMatchesInString:numberPattern + options:0 + range:NSMakeRange(0, [numberPattern length]) + withTemplate:@"\\\\d"]; + + // Replace any standalone digit (not the one in d{}) with \d + numberPattern = [self.STANDALONE_DIGIT_PATTERN_ + stringByReplacingMatchesInString:numberPattern + options:0 + range:NSMakeRange(0, [numberPattern length]) + withTemplate:@"\\\\d"]; + [self.formattingTemplate_ setString:@""]; + + /** @type {string} */ + NSString *tempTemplate = [self getFormattingTemplate_:numberPattern numberFormat:format.format]; + if (tempTemplate.length > 0) { + [self.formattingTemplate_ appendString:tempTemplate]; + return YES; + } + return NO; +} /** * Gets a formatting template which can be used to efficiently format a @@ -481,130 +491,127 @@ static const NSUInteger NBMinLeadingDigitsLength = 3; * @return {string} * @private */ -- (NSString*)getFormattingTemplate_:(NSString*)numberPattern numberFormat:(NSString*)numberFormat -{ - // Creates a phone number consisting only of the digit 9 that matches the - // numberPattern by applying the pattern to the longestPhoneNumber string. - /** @type {string} */ - NSString *longestPhoneNumber = @"999999999999999"; - - /** @type {Array.} */ - NSArray *m = [self.phoneUtil_ matchedStringByRegex:longestPhoneNumber regex:numberPattern]; - - // this match will always succeed - /** @type {string} */ - NSString *aPhoneNumber = [m nb_safeStringAtIndex:0]; - // No formatting template can be created if the number of digits entered so - // far is longer than the maximum the current formatting rule can accommodate. - if (aPhoneNumber.length < self.nationalNumber_.length) { - return @""; - } - // Formats the number according to numberFormat - /** @type {string} */ - NSString *template = [self.phoneUtil_ replaceStringByRegex:aPhoneNumber regex:numberPattern withTemplate:numberFormat]; - - // Replaces each digit with character DIGIT_PLACEHOLDER - template = [self.phoneUtil_ replaceStringByRegex:template regex:@"9" withTemplate:NBDigitPlaceHolder]; - return template; -} +- (NSString *)getFormattingTemplate_:(NSString *)numberPattern + numberFormat:(NSString *)numberFormat { + // Creates a phone number consisting only of the digit 9 that matches the + // numberPattern by applying the pattern to the longestPhoneNumber string. + /** @type {string} */ + NSString *longestPhoneNumber = @"999999999999999"; + /** @type {Array.} */ + NSArray *m = [self.phoneUtil_ matchedStringByRegex:longestPhoneNumber regex:numberPattern]; + + // this match will always succeed + /** @type {string} */ + NSString *aPhoneNumber = [m nb_safeStringAtIndex:0]; + // No formatting template can be created if the number of digits entered so + // far is longer than the maximum the current formatting rule can accommodate. + if (aPhoneNumber.length < self.nationalNumber_.length) { + return @""; + } + // Formats the number according to numberFormat + /** @type {string} */ + NSString *template = [self.phoneUtil_ replaceStringByRegex:aPhoneNumber + regex:numberPattern + withTemplate:numberFormat]; + + // Replaces each digit with character DIGIT_PLACEHOLDER + template = + [self.phoneUtil_ replaceStringByRegex:template regex:@"9" withTemplate:NBDigitPlaceHolder]; + return template; +} /** * Clears the internal state of the formatter, so it can be reused. */ -- (void)clear -{ - self.currentOutput_ = @""; - [self.accruedInput_ setString:@""]; - [self.accruedInputWithoutFormatting_ setString:@""]; - [self.formattingTemplate_ setString:@""]; - self.lastMatchPosition_ = 0; - self.currentFormattingPattern_ = @""; - [self.prefixBeforeNationalNumber_ setString:@""]; - self.nationalPrefixExtracted_ = @""; - [self.nationalNumber_ setString:@""]; - self.ableToFormat_ = YES; - self.inputHasFormatting_ = NO; - self.positionToRemember_ = 0; - self.originalPosition_ = 0; - self.isCompleteNumber_ = NO; - self.isExpectingCountryCallingCode_ = NO; - [self.possibleFormats_ removeAllObjects]; - self.shouldAddSpaceAfterNationalPrefix_ = NO; - - if (self.currentMetaData_ != self.defaultMetaData_) { - self.currentMetaData_ = [self getMetadataForRegion_:self.defaultCountry_]; - } +- (void)clear { + self.currentOutput_ = @""; + [self.accruedInput_ setString:@""]; + [self.accruedInputWithoutFormatting_ setString:@""]; + [self.formattingTemplate_ setString:@""]; + self.lastMatchPosition_ = 0; + self.currentFormattingPattern_ = @""; + [self.prefixBeforeNationalNumber_ setString:@""]; + self.nationalPrefixExtracted_ = @""; + [self.nationalNumber_ setString:@""]; + self.ableToFormat_ = YES; + self.inputHasFormatting_ = NO; + self.positionToRemember_ = 0; + self.originalPosition_ = 0; + self.isCompleteNumber_ = NO; + self.isExpectingCountryCallingCode_ = NO; + [self.possibleFormats_ removeAllObjects]; + self.shouldAddSpaceAfterNationalPrefix_ = NO; + + if (self.currentMetaData_ != self.defaultMetaData_) { + self.currentMetaData_ = [self getMetadataForRegion_:self.defaultCountry_]; + } } -- (NSString*)removeLastDigitAndRememberPosition -{ - NSString *accruedInputWithoutFormatting = [self.accruedInput_ copy]; - [self clear]; - - NSString *result = @""; - - NSUInteger length = accruedInputWithoutFormatting.length; - if (length == 0) { - return result; - } - - for (NSUInteger i = 0; i < length - 1; i++) { - NSString *ch = [accruedInputWithoutFormatting substringWithRange:NSMakeRange(i, 1)]; - result = [self inputDigitAndRememberPosition:ch]; - } - +- (NSString *)removeLastDigitAndRememberPosition { + NSString *accruedInputWithoutFormatting = [self.accruedInput_ copy]; + [self clear]; + + NSString *result = @""; + + NSUInteger length = accruedInputWithoutFormatting.length; + if (length == 0) { return result; + } + + for (NSUInteger i = 0; i < length - 1; i++) { + NSString *ch = [accruedInputWithoutFormatting substringWithRange:NSMakeRange(i, 1)]; + result = [self inputDigitAndRememberPosition:ch]; + } + + return result; } -- (NSString*)removeLastDigit -{ - NSString *accruedInputWithoutFormatting = [self.accruedInput_ copy]; - [self clear]; - - NSString *result = @""; - - NSUInteger length = accruedInputWithoutFormatting.length; - if (length == 0) { - return result; - } - - for (NSUInteger i = 0; i < length - 1; i++) { - NSString *ch = [accruedInputWithoutFormatting substringWithRange:NSMakeRange(i, 1)]; - result = [self inputDigit:ch]; - } - +- (NSString *)removeLastDigit { + NSString *accruedInputWithoutFormatting = [self.accruedInput_ copy]; + [self clear]; + + NSString *result = @""; + + NSUInteger length = accruedInputWithoutFormatting.length; + if (length == 0) { return result; + } + + for (NSUInteger i = 0; i < length - 1; i++) { + NSString *ch = [accruedInputWithoutFormatting substringWithRange:NSMakeRange(i, 1)]; + result = [self inputDigit:ch]; + } + + return result; } -- (NSString *)inputStringAndRememberPosition:(NSString *)string -{ - [self clear]; - - NSString *result = @""; - - NSUInteger length = string.length; - for (NSUInteger i = 0; i < length; i++) { - NSString *ch = [string substringWithRange:NSMakeRange(i, 1)]; - result = [self inputDigitAndRememberPosition:ch]; - } - - return result; +- (NSString *)inputStringAndRememberPosition:(NSString *)string { + [self clear]; + + NSString *result = @""; + + NSUInteger length = string.length; + for (NSUInteger i = 0; i < length; i++) { + NSString *ch = [string substringWithRange:NSMakeRange(i, 1)]; + result = [self inputDigitAndRememberPosition:ch]; + } + + return result; } -- (NSString *)inputString:(NSString *)string -{ - [self clear]; - - NSString *result = @""; - - NSUInteger length = string.length; - for (NSUInteger i = 0; i < length; i++) { - NSString *ch = [string substringWithRange:NSMakeRange(i, 1)]; - result = [self inputDigit:ch]; - } - - return result; +- (NSString *)inputString:(NSString *)string { + [self clear]; + + NSString *result = @""; + + NSUInteger length = string.length; + for (NSUInteger i = 0; i < length; i++) { + NSString *ch = [string substringWithRange:NSMakeRange(i, 1)]; + result = [self inputDigit:ch]; + } + + return result; } /** @@ -617,16 +624,14 @@ static const NSUInteger NBMinLeadingDigitsLength = 3; * as they are. * @return {string} the partially formatted phone number. */ -- (NSString*)inputDigit:(NSString*)nextChar -{ - if (!nextChar || nextChar.length <= 0) { - return self.currentOutput_; - } - self.currentOutput_ = [self inputDigitWithOptionToRememberPosition_:nextChar rememberPosition:NO]; +- (NSString *)inputDigit:(NSString *)nextChar { + if (!nextChar || nextChar.length <= 0) { return self.currentOutput_; + } + self.currentOutput_ = [self inputDigitWithOptionToRememberPosition_:nextChar rememberPosition:NO]; + return self.currentOutput_; } - /** * Same as {@link #inputDigit}, but remembers the position where * {@code nextChar} is inserted, so that it can be retrieved later by using @@ -637,16 +642,15 @@ static const NSUInteger NBMinLeadingDigitsLength = 3; * - param {string} nextChar * @return {string} */ -- (NSString*)inputDigitAndRememberPosition:(NSString*)nextChar -{ - if (!nextChar || nextChar.length <= 0) { - return self.currentOutput_; - } - self.currentOutput_ = [self inputDigitWithOptionToRememberPosition_:nextChar rememberPosition:YES]; +- (NSString *)inputDigitAndRememberPosition:(NSString *)nextChar { + if (!nextChar || nextChar.length <= 0) { return self.currentOutput_; + } + self.currentOutput_ = + [self inputDigitWithOptionToRememberPosition_:nextChar rememberPosition:YES]; + return self.currentOutput_; } - /** * - param {string} nextChar * - param {BOOL} rememberPosition @@ -654,139 +658,133 @@ static const NSUInteger NBMinLeadingDigitsLength = 3; * @private */ -- (NSString*)inputDigitWithOptionToRememberPosition_:(NSString*)nextChar rememberPosition:(BOOL)rememberPosition -{ - if (!nextChar || nextChar.length <= 0) { - _isSuccessfulFormatting = NO; - return self.currentOutput_; - } - - [self.accruedInput_ appendString:nextChar]; - - if (rememberPosition) { - self.originalPosition_ = self.accruedInput_.length; - } - - // We do formatting on-the-fly only when each character entered is either a - // digit, or a plus sign (accepted at the start of the number only). - if (![self isDigitOrLeadingPlusSign_:nextChar]) - { - self.ableToFormat_ = NO; - self.inputHasFormatting_ = YES; - } else { - nextChar = [self normalizeAndAccrueDigitsAndPlusSign_:nextChar rememberPosition:rememberPosition]; - } - - if (!self.ableToFormat_) { - // When we are unable to format because of reasons other than that - // formatting chars have been entered, it can be due to really long IDDs or - // NDDs. If that is the case, we might be able to do formatting again after - // extracting them. - - if (self.inputHasFormatting_) { - _isSuccessfulFormatting = YES; - return [NSString stringWithString:self.accruedInput_]; - } - else if ([self attemptToExtractIdd_]) { - if ([self attemptToExtractCountryCallingCode_]) { - _isSuccessfulFormatting = YES; - return [self attemptToChoosePatternWithPrefixExtracted_]; - } - } - else if ([self ableToExtractLongerNdd_]) { - // Add an additional space to separate long NDD and national significant - // number for readability. We don't set shouldAddSpaceAfterNationalPrefix_ - // to YES, since we don't want this to change later when we choose - // formatting templates. - [self.prefixBeforeNationalNumber_ appendString:NBSeparatorBeforeNationalNumber]; - _isSuccessfulFormatting = YES; - return [self attemptToChoosePatternWithPrefixExtracted_]; - } - - _isSuccessfulFormatting = NO; - return self.accruedInput_; - } - - // We start to attempt to format only when at least MIN_LEADING_DIGITS_LENGTH - // digits (the plus sign is counted as a digit as well for this purpose) have - // been entered. - switch (self.accruedInputWithoutFormatting_.length) - { - case 0: - case 1: - case 2: - _isSuccessfulFormatting = YES; - return self.accruedInput_; - case 3: - if ([self attemptToExtractIdd_]) { - self.isExpectingCountryCallingCode_ = YES; - } else { - // No IDD or plus sign is found, might be entering in national format. - self.nationalPrefixExtracted_ = [self removeNationalPrefixFromNationalNumber_]; - _isSuccessfulFormatting = YES; - return [self attemptToChooseFormattingPattern_]; - } - default: - if (self.isExpectingCountryCallingCode_) { - if ([self attemptToExtractCountryCallingCode_]) { - self.isExpectingCountryCallingCode_ = NO; - } - _isSuccessfulFormatting = YES; - return [NSString stringWithFormat:@"%@%@", self.prefixBeforeNationalNumber_, self.nationalNumber_]; - } - - if (self.possibleFormats_.count > 0) { - // The formatting patterns are already chosen. - /** @type {string} */ - NSString *tempNationalNumber = [self inputDigitHelper_:nextChar]; - // See if the accrued digits can be formatted properly already. If not, - // use the results from inputDigitHelper, which does formatting based on - // the formatting pattern chosen. - /** @type {string} */ - NSString *formattedNumber = [self attemptToFormatAccruedDigits_]; - if (formattedNumber.length > 0) { - _isSuccessfulFormatting = YES; - return formattedNumber; - } - - [self narrowDownPossibleFormats_:self.nationalNumber_]; - - if ([self maybeCreateNewTemplate_]) { - _isSuccessfulFormatting = YES; - return [self inputAccruedNationalNumber_]; - } - - if (self.ableToFormat_) { - _isSuccessfulFormatting = YES; - return [self appendNationalNumber_:tempNationalNumber]; - } else { - _isSuccessfulFormatting = NO; - return self.accruedInput_; - } - } - else { - _isSuccessfulFormatting = NO; - return [self attemptToChooseFormattingPattern_]; - } - } - +- (NSString *)inputDigitWithOptionToRememberPosition_:(NSString *)nextChar + rememberPosition:(BOOL)rememberPosition { + if (!nextChar || nextChar.length <= 0) { _isSuccessfulFormatting = NO; -} + return self.currentOutput_; + } + [self.accruedInput_ appendString:nextChar]; + + if (rememberPosition) { + self.originalPosition_ = self.accruedInput_.length; + } + + // We do formatting on-the-fly only when each character entered is either a + // digit, or a plus sign (accepted at the start of the number only). + if (![self isDigitOrLeadingPlusSign_:nextChar]) { + self.ableToFormat_ = NO; + self.inputHasFormatting_ = YES; + } else { + nextChar = + [self normalizeAndAccrueDigitsAndPlusSign_:nextChar rememberPosition:rememberPosition]; + } + + if (!self.ableToFormat_) { + // When we are unable to format because of reasons other than that + // formatting chars have been entered, it can be due to really long IDDs or + // NDDs. If that is the case, we might be able to do formatting again after + // extracting them. + + if (self.inputHasFormatting_) { + _isSuccessfulFormatting = YES; + return [NSString stringWithString:self.accruedInput_]; + } else if ([self attemptToExtractIdd_]) { + if ([self attemptToExtractCountryCallingCode_]) { + _isSuccessfulFormatting = YES; + return [self attemptToChoosePatternWithPrefixExtracted_]; + } + } else if ([self ableToExtractLongerNdd_]) { + // Add an additional space to separate long NDD and national significant + // number for readability. We don't set shouldAddSpaceAfterNationalPrefix_ + // to YES, since we don't want this to change later when we choose + // formatting templates. + [self.prefixBeforeNationalNumber_ appendString:NBSeparatorBeforeNationalNumber]; + _isSuccessfulFormatting = YES; + return [self attemptToChoosePatternWithPrefixExtracted_]; + } + + _isSuccessfulFormatting = NO; + return self.accruedInput_; + } + + // We start to attempt to format only when at least MIN_LEADING_DIGITS_LENGTH + // digits (the plus sign is counted as a digit as well for this purpose) have + // been entered. + switch (self.accruedInputWithoutFormatting_.length) { + case 0: + case 1: + case 2: + _isSuccessfulFormatting = YES; + return self.accruedInput_; + case 3: + if ([self attemptToExtractIdd_]) { + self.isExpectingCountryCallingCode_ = YES; + } else { + // No IDD or plus sign is found, might be entering in national format. + self.nationalPrefixExtracted_ = [self removeNationalPrefixFromNationalNumber_]; + _isSuccessfulFormatting = YES; + return [self attemptToChooseFormattingPattern_]; + } + default: + if (self.isExpectingCountryCallingCode_) { + if ([self attemptToExtractCountryCallingCode_]) { + self.isExpectingCountryCallingCode_ = NO; + } + _isSuccessfulFormatting = YES; + return [NSString + stringWithFormat:@"%@%@", self.prefixBeforeNationalNumber_, self.nationalNumber_]; + } + + if (self.possibleFormats_.count > 0) { + // The formatting patterns are already chosen. + /** @type {string} */ + NSString *tempNationalNumber = [self inputDigitHelper_:nextChar]; + // See if the accrued digits can be formatted properly already. If not, + // use the results from inputDigitHelper, which does formatting based on + // the formatting pattern chosen. + /** @type {string} */ + NSString *formattedNumber = [self attemptToFormatAccruedDigits_]; + if (formattedNumber.length > 0) { + _isSuccessfulFormatting = YES; + return formattedNumber; + } + + [self narrowDownPossibleFormats_:self.nationalNumber_]; + + if ([self maybeCreateNewTemplate_]) { + _isSuccessfulFormatting = YES; + return [self inputAccruedNationalNumber_]; + } + + if (self.ableToFormat_) { + _isSuccessfulFormatting = YES; + return [self appendNationalNumber_:tempNationalNumber]; + } else { + _isSuccessfulFormatting = NO; + return self.accruedInput_; + } + } else { + _isSuccessfulFormatting = NO; + return [self attemptToChooseFormattingPattern_]; + } + } + + _isSuccessfulFormatting = NO; +} /** * @return {string} * @private */ -- (NSString*)attemptToChoosePatternWithPrefixExtracted_ -{ - self.ableToFormat_ = YES; - self.isExpectingCountryCallingCode_ = NO; - [self.possibleFormats_ removeAllObjects]; - return [self attemptToChooseFormattingPattern_]; +- (NSString *)attemptToChoosePatternWithPrefixExtracted_ { + self.ableToFormat_ = YES; + self.isExpectingCountryCallingCode_ = NO; + [self.possibleFormats_ removeAllObjects]; + return [self attemptToChooseFormattingPattern_]; } - /** * Some national prefixes are a substring of others. If extracting the shorter * NDD doesn't result in a number we can format, we try to see if we can extract @@ -794,47 +792,44 @@ static const NSUInteger NBMinLeadingDigitsLength = 3; * @return {BOOL} * @private */ -- (BOOL)ableToExtractLongerNdd_ -{ - if (self.nationalPrefixExtracted_.length > 0) - { - // Put the extracted NDD back to the national number before attempting to - // extract a new NDD. - /** @type {string} */ - NSString *nationalNumberStr = [NSString stringWithString:self.nationalNumber_]; - self.nationalNumber_ = [self.nationalPrefixExtracted_ mutableCopy]; - [self.nationalNumber_ appendString:nationalNumberStr]; - // Remove the previously extracted NDD from prefixBeforeNationalNumber. We - // cannot simply set it to empty string because people sometimes incorrectly - // enter national prefix after the country code, e.g. +44 (0)20-1234-5678. - /** @type {string} */ - NSString *prefixBeforeNationalNumberStr = [self.prefixBeforeNationalNumber_ copy]; - NSRange lastRange = [prefixBeforeNationalNumberStr rangeOfString:self.nationalPrefixExtracted_ options:NSBackwardsSearch]; - /** @type {number} */ - NSUInteger indexOfPreviousNdd = lastRange.location; - self.prefixBeforeNationalNumber_ = [[prefixBeforeNationalNumberStr substringWithRange:NSMakeRange(0, indexOfPreviousNdd)] mutableCopy]; - } - - return self.nationalPrefixExtracted_ != [self removeNationalPrefixFromNationalNumber_]; -} +- (BOOL)ableToExtractLongerNdd_ { + if (self.nationalPrefixExtracted_.length > 0) { + // Put the extracted NDD back to the national number before attempting to + // extract a new NDD. + /** @type {string} */ + NSString *nationalNumberStr = [NSString stringWithString:self.nationalNumber_]; + self.nationalNumber_ = [self.nationalPrefixExtracted_ mutableCopy]; + [self.nationalNumber_ appendString:nationalNumberStr]; + // Remove the previously extracted NDD from prefixBeforeNationalNumber. We + // cannot simply set it to empty string because people sometimes incorrectly + // enter national prefix after the country code, e.g. +44 (0)20-1234-5678. + /** @type {string} */ + NSString *prefixBeforeNationalNumberStr = [self.prefixBeforeNationalNumber_ copy]; + NSRange lastRange = [prefixBeforeNationalNumberStr rangeOfString:self.nationalPrefixExtracted_ + options:NSBackwardsSearch]; + /** @type {number} */ + NSUInteger indexOfPreviousNdd = lastRange.location; + self.prefixBeforeNationalNumber_ = [[prefixBeforeNationalNumberStr + substringWithRange:NSMakeRange(0, indexOfPreviousNdd)] mutableCopy]; + } + return self.nationalPrefixExtracted_ != [self removeNationalPrefixFromNationalNumber_]; +} /** * - param {string} nextChar * @return {BOOL} * @private */ -- (BOOL)isDigitOrLeadingPlusSign_:(NSString*)nextChar -{ - NSString *digitPattern = [NSString stringWithFormat:@"([%@])", NB_VALID_DIGITS_STRING]; - NSString *plusPattern = [NSString stringWithFormat:@"[%@]+", NB_PLUS_CHARS]; - - BOOL isDigitPattern = [[self.phoneUtil_ matchesByRegex:nextChar regex:digitPattern] count] > 0; - BOOL isPlusPattern = [[self.phoneUtil_ matchesByRegex:nextChar regex:plusPattern] count] > 0; - - return isDigitPattern || (self.accruedInput_.length == 1 && isPlusPattern); -} +- (BOOL)isDigitOrLeadingPlusSign_:(NSString *)nextChar { + NSString *digitPattern = [NSString stringWithFormat:@"([%@])", NB_VALID_DIGITS_STRING]; + NSString *plusPattern = [NSString stringWithFormat:@"[%@]+", NB_PLUS_CHARS]; + BOOL isDigitPattern = [[self.phoneUtil_ matchesByRegex:nextChar regex:digitPattern] count] > 0; + BOOL isPlusPattern = [[self.phoneUtil_ matchesByRegex:nextChar regex:plusPattern] count] > 0; + + return isDigitPattern || (self.accruedInput_.length == 1 && isPlusPattern); +} /** * Check to see if there is an exact pattern match for these digits. If so, we @@ -843,42 +838,41 @@ static const NSUInteger NBMinLeadingDigitsLength = 3; * @return {string} * @private */ -- (NSString*)attemptToFormatAccruedDigits_ -{ - /** @type {string} */ - NSString *nationalNumber = [NSString stringWithString:self.nationalNumber_]; - - /** @type {number} */ - NSUInteger possibleFormatsLength = self.possibleFormats_.count; - for (NSUInteger i = 0; i < possibleFormatsLength; ++i) - { - /** @type {i18n.phonenumbers.NumberFormat} */ - NBNumberFormat *numberFormat = self.possibleFormats_[i]; - /** @type {string} */ - NSString * pattern = numberFormat.pattern; - /** @type {RegExp} */ - NSString *patternRegExp = [NSString stringWithFormat:@"^(?:%@)$", pattern]; - BOOL isPatternRegExp = [[self.phoneUtil_ matchesByRegex:nationalNumber regex:patternRegExp] count] > 0; - if (isPatternRegExp) { - if (numberFormat.nationalPrefixFormattingRule.length > 0) { - NSArray *matches = [self.NATIONAL_PREFIX_SEPARATORS_PATTERN_ matchesInString:numberFormat.nationalPrefixFormattingRule - options:0 - range:NSMakeRange(0, numberFormat.nationalPrefixFormattingRule.length)]; - self.shouldAddSpaceAfterNationalPrefix_ = [matches count] > 0; - } else { - self.shouldAddSpaceAfterNationalPrefix_ = NO; - } - - /** @type {string} */ - NSString *formattedNumber = [self.phoneUtil_ replaceStringByRegex:nationalNumber - regex:pattern - withTemplate:numberFormat.format]; - return [self appendNationalNumber_:formattedNumber]; - } - } - return @""; -} +- (NSString *)attemptToFormatAccruedDigits_ { + /** @type {string} */ + NSString *nationalNumber = [NSString stringWithString:self.nationalNumber_]; + /** @type {number} */ + NSUInteger possibleFormatsLength = self.possibleFormats_.count; + for (NSUInteger i = 0; i < possibleFormatsLength; ++i) { + /** @type {i18n.phonenumbers.NumberFormat} */ + NBNumberFormat *numberFormat = self.possibleFormats_[i]; + /** @type {string} */ + NSString *pattern = numberFormat.pattern; + /** @type {RegExp} */ + NSString *patternRegExp = [NSString stringWithFormat:@"^(?:%@)$", pattern]; + BOOL isPatternRegExp = + [[self.phoneUtil_ matchesByRegex:nationalNumber regex:patternRegExp] count] > 0; + if (isPatternRegExp) { + if (numberFormat.nationalPrefixFormattingRule.length > 0) { + NSArray *matches = [self.NATIONAL_PREFIX_SEPARATORS_PATTERN_ + matchesInString:numberFormat.nationalPrefixFormattingRule + options:0 + range:NSMakeRange(0, numberFormat.nationalPrefixFormattingRule.length)]; + self.shouldAddSpaceAfterNationalPrefix_ = [matches count] > 0; + } else { + self.shouldAddSpaceAfterNationalPrefix_ = NO; + } + + /** @type {string} */ + NSString *formattedNumber = [self.phoneUtil_ replaceStringByRegex:nationalNumber + regex:pattern + withTemplate:numberFormat.format]; + return [self appendNationalNumber_:formattedNumber]; + } + } + return @""; +} /** * Combines the national number with any prefix (IDD/+ and country code or @@ -888,25 +882,24 @@ static const NSUInteger NBMinLeadingDigitsLength = 3; * @return {string} The combined number. * @private */ -- (NSString*)appendNationalNumber_:(NSString*)nationalNumber -{ - /** @type {number} */ - NSUInteger prefixBeforeNationalNumberLength = self.prefixBeforeNationalNumber_.length; - unichar blank_char = [NBSeparatorBeforeNationalNumber characterAtIndex:0]; - if (self.shouldAddSpaceAfterNationalPrefix_ && prefixBeforeNationalNumberLength > 0 && - [self.prefixBeforeNationalNumber_ characterAtIndex:prefixBeforeNationalNumberLength - 1] != blank_char) - { - // We want to add a space after the national prefix if the national prefix - // formatting rule indicates that this would normally be done, with the - // exception of the case where we already appended a space because the NDD - // was surprisingly long. - - return [NSString stringWithFormat:@"%@%@%@", self.prefixBeforeNationalNumber_, NBSeparatorBeforeNationalNumber, nationalNumber]; - } else { - return [NSString stringWithFormat:@"%@%@", self.prefixBeforeNationalNumber_, nationalNumber]; - } -} +- (NSString *)appendNationalNumber_:(NSString *)nationalNumber { + /** @type {number} */ + NSUInteger prefixBeforeNationalNumberLength = self.prefixBeforeNationalNumber_.length; + unichar blank_char = [NBSeparatorBeforeNationalNumber characterAtIndex:0]; + if (self.shouldAddSpaceAfterNationalPrefix_ && prefixBeforeNationalNumberLength > 0 && + [self.prefixBeforeNationalNumber_ characterAtIndex:prefixBeforeNationalNumberLength - 1] != + blank_char) { + // We want to add a space after the national prefix if the national prefix + // formatting rule indicates that this would normally be done, with the + // exception of the case where we already appended a space because the NDD + // was surprisingly long. + return [NSString stringWithFormat:@"%@%@%@", self.prefixBeforeNationalNumber_, + NBSeparatorBeforeNationalNumber, nationalNumber]; + } else { + return [NSString stringWithFormat:@"%@%@", self.prefixBeforeNationalNumber_, nationalNumber]; + } +} /** * Returns the current position in the partially formatted phone number of the @@ -915,31 +908,29 @@ static const NSUInteger NBMinLeadingDigitsLength = 3; * * @return {number} */ -- (NSInteger)getRememberedPosition -{ - if (!self.ableToFormat_) { - return self.originalPosition_; - } - /** @type {number} */ - NSInteger accruedInputIndex = 0; - /** @type {number} */ - NSInteger currentOutputIndex = 0; - /** @type {string} */ - NSString *accruedInputWithoutFormatting = self.accruedInputWithoutFormatting_; - /** @type {string} */ - NSString *currentOutput = self.currentOutput_; - - while (accruedInputIndex < self.positionToRemember_ && currentOutputIndex < currentOutput.length) - { - if ([accruedInputWithoutFormatting characterAtIndex:accruedInputIndex] == [currentOutput characterAtIndex:currentOutputIndex]) - { - accruedInputIndex++; - } - currentOutputIndex++; - } - return currentOutputIndex; -} +- (NSInteger)getRememberedPosition { + if (!self.ableToFormat_) { + return self.originalPosition_; + } + /** @type {number} */ + NSInteger accruedInputIndex = 0; + /** @type {number} */ + NSInteger currentOutputIndex = 0; + /** @type {string} */ + NSString *accruedInputWithoutFormatting = self.accruedInputWithoutFormatting_; + /** @type {string} */ + NSString *currentOutput = self.currentOutput_; + while (accruedInputIndex < self.positionToRemember_ && + currentOutputIndex < currentOutput.length) { + if ([accruedInputWithoutFormatting characterAtIndex:accruedInputIndex] == + [currentOutput characterAtIndex:currentOutputIndex]) { + accruedInputIndex++; + } + currentOutputIndex++; + } + return currentOutputIndex; +} /** * Attempts to set the formatting template and returns a string which contains @@ -948,26 +939,24 @@ static const NSUInteger NBMinLeadingDigitsLength = 3; * @return {string} * @private */ -- (NSString*)attemptToChooseFormattingPattern_ -{ - /** @type {string} */ - NSString *nationalNumber = [self.nationalNumber_ copy]; - // We start to attempt to format only when as least MIN_LEADING_DIGITS_LENGTH - // digits of national number (excluding national prefix) have been entered. - if (nationalNumber.length >= NBMinLeadingDigitsLength) { - [self getAvailableFormats_:nationalNumber]; - // See if the accrued digits can be formatted properly already. - NSString *formattedNumber = [self attemptToFormatAccruedDigits_]; - if (formattedNumber.length > 0) { - return formattedNumber; - } - return [self maybeCreateNewTemplate_] ? [self inputAccruedNationalNumber_] : self.accruedInput_; - } else { - return [self appendNationalNumber_:nationalNumber]; +- (NSString *)attemptToChooseFormattingPattern_ { + /** @type {string} */ + NSString *nationalNumber = [self.nationalNumber_ copy]; + // We start to attempt to format only when as least MIN_LEADING_DIGITS_LENGTH + // digits of national number (excluding national prefix) have been entered. + if (nationalNumber.length >= NBMinLeadingDigitsLength) { + [self getAvailableFormats_:nationalNumber]; + // See if the accrued digits can be formatted properly already. + NSString *formattedNumber = [self attemptToFormatAccruedDigits_]; + if (formattedNumber.length > 0) { + return formattedNumber; } + return [self maybeCreateNewTemplate_] ? [self inputAccruedNationalNumber_] : self.accruedInput_; + } else { + return [self appendNationalNumber_:nationalNumber]; + } } - /** * Invokes inputDigitHelper on each digit of the national number accrued, and * returns a formatted string in the end. @@ -975,47 +964,45 @@ static const NSUInteger NBMinLeadingDigitsLength = 3; * @return {string} * @private */ -- (NSString*)inputAccruedNationalNumber_ -{ +- (NSString *)inputAccruedNationalNumber_ { + /** @type {string} */ + NSString *nationalNumber = [self.nationalNumber_ copy]; + /** @type {number} */ + NSUInteger lengthOfNationalNumber = nationalNumber.length; + if (lengthOfNationalNumber > 0) { /** @type {string} */ - NSString *nationalNumber = [self.nationalNumber_ copy]; - /** @type {number} */ - NSUInteger lengthOfNationalNumber = nationalNumber.length; - if (lengthOfNationalNumber > 0) { - /** @type {string} */ - NSString *tempNationalNumber = @""; - for (NSUInteger i = 0; i < lengthOfNationalNumber; i++) - { - tempNationalNumber = [self inputDigitHelper_:[NSString stringWithFormat: @"%C", [nationalNumber characterAtIndex:i]]]; - } - return self.ableToFormat_ ? [self appendNationalNumber_:tempNationalNumber] : self.accruedInput_; - } else { - return self.prefixBeforeNationalNumber_; + NSString *tempNationalNumber = @""; + for (NSUInteger i = 0; i < lengthOfNationalNumber; i++) { + tempNationalNumber = [self + inputDigitHelper_:[NSString stringWithFormat:@"%C", [nationalNumber characterAtIndex:i]]]; } + return self.ableToFormat_ ? [self appendNationalNumber_:tempNationalNumber] + : self.accruedInput_; + } else { + return self.prefixBeforeNationalNumber_; + } } - /** * @return {BOOL} YES if the current country is a NANPA country and the * national number begins with the national prefix. * @private */ -- (BOOL)isNanpaNumberWithNationalPrefix_ -{ - // For NANPA numbers beginning with 1[2-9], treat the 1 as the national - // prefix. The reason is that national significant numbers in NANPA always - // start with [2-9] after the national prefix. Numbers beginning with 1[01] - // can only be short/emergency numbers, which don't need the national prefix. - if (![self.currentMetaData_.countryCode isEqual:@1]) { - return NO; - } - - /** @type {string} */ - NSString *nationalNumber = [self.nationalNumber_ copy]; - return ([nationalNumber characterAtIndex:0] == '1') && ([nationalNumber characterAtIndex:1] != '0') && - ([nationalNumber characterAtIndex:1] != '1'); -} +- (BOOL)isNanpaNumberWithNationalPrefix_ { + // For NANPA numbers beginning with 1[2-9], treat the 1 as the national + // prefix. The reason is that national significant numbers in NANPA always + // start with [2-9] after the national prefix. Numbers beginning with 1[01] + // can only be short/emergency numbers, which don't need the national prefix. + if (![self.currentMetaData_.countryCode isEqual:@1]) { + return NO; + } + /** @type {string} */ + NSString *nationalNumber = [self.nationalNumber_ copy]; + return ([nationalNumber characterAtIndex:0] == '1') && + ([nationalNumber characterAtIndex:1] != '0') && + ([nationalNumber characterAtIndex:1] != '1'); +} /** * Returns the national prefix extracted, or an empty string if it is not @@ -1023,39 +1010,39 @@ static const NSUInteger NBMinLeadingDigitsLength = 3; * @return {string} * @private */ -- (NSString*)removeNationalPrefixFromNationalNumber_ -{ - /** @type {string} */ - NSString *nationalNumber = [self.nationalNumber_ copy]; - /** @type {number} */ - NSUInteger startOfNationalNumber = 0; - - if ([self isNanpaNumberWithNationalPrefix_]) { - startOfNationalNumber = 1; - [self.prefixBeforeNationalNumber_ appendFormat:@"1%@", NBSeparatorBeforeNationalNumber]; - self.isCompleteNumber_ = YES; - } - else if (self.currentMetaData_.nationalPrefixForParsing != nil && self.currentMetaData_.nationalPrefixForParsing.length > 0) - { - /** @type {RegExp} */ - NSString *nationalPrefixForParsing = [NSString stringWithFormat:@"^(?:%@)", self.currentMetaData_.nationalPrefixForParsing]; - /** @type {Array.} */ - NSArray *m = [self.phoneUtil_ matchedStringByRegex:nationalNumber regex:nationalPrefixForParsing]; - NSString *firstString = [m nb_safeStringAtIndex:0]; - if (m != nil && firstString != nil && firstString.length > 0) { - // When the national prefix is detected, we use international formatting - // rules instead of national ones, because national formatting rules could - // contain local formatting rules for numbers entered without area code. - self.isCompleteNumber_ = YES; - startOfNationalNumber = firstString.length; - [self.prefixBeforeNationalNumber_ appendString:[nationalNumber substringWithRange:NSMakeRange(0, startOfNationalNumber)]]; - } - } - - self.nationalNumber_ = [[nationalNumber substringFromIndex:startOfNationalNumber] mutableCopy]; - return [nationalNumber substringWithRange:NSMakeRange(0, startOfNationalNumber)]; -} +- (NSString *)removeNationalPrefixFromNationalNumber_ { + /** @type {string} */ + NSString *nationalNumber = [self.nationalNumber_ copy]; + /** @type {number} */ + NSUInteger startOfNationalNumber = 0; + if ([self isNanpaNumberWithNationalPrefix_]) { + startOfNationalNumber = 1; + [self.prefixBeforeNationalNumber_ appendFormat:@"1%@", NBSeparatorBeforeNationalNumber]; + self.isCompleteNumber_ = YES; + } else if (self.currentMetaData_.nationalPrefixForParsing != nil && + self.currentMetaData_.nationalPrefixForParsing.length > 0) { + /** @type {RegExp} */ + NSString *nationalPrefixForParsing = + [NSString stringWithFormat:@"^(?:%@)", self.currentMetaData_.nationalPrefixForParsing]; + /** @type {Array.} */ + NSArray *m = + [self.phoneUtil_ matchedStringByRegex:nationalNumber regex:nationalPrefixForParsing]; + NSString *firstString = [m nb_safeStringAtIndex:0]; + if (m != nil && firstString != nil && firstString.length > 0) { + // When the national prefix is detected, we use international formatting + // rules instead of national ones, because national formatting rules could + // contain local formatting rules for numbers entered without area code. + self.isCompleteNumber_ = YES; + startOfNationalNumber = firstString.length; + [self.prefixBeforeNationalNumber_ + appendString:[nationalNumber substringWithRange:NSMakeRange(0, startOfNationalNumber)]]; + } + } + + self.nationalNumber_ = [[nationalNumber substringFromIndex:startOfNationalNumber] mutableCopy]; + return [nationalNumber substringWithRange:NSMakeRange(0, startOfNationalNumber)]; +} /** * Extracts IDD and plus sign to prefixBeforeNationalNumber when they are @@ -1065,33 +1052,34 @@ static const NSUInteger NBMinLeadingDigitsLength = 3; * plus sign or valid IDD for defaultCountry. * @private */ -- (BOOL)attemptToExtractIdd_ -{ - /** @type {string} */ - NSString *accruedInputWithoutFormatting = [self.accruedInputWithoutFormatting_ copy]; - /** @type {RegExp} */ - NSString *internationalPrefix = [NSString stringWithFormat:@"^(?:\\+|%@)", self.currentMetaData_.internationalPrefix]; - /** @type {Array.} */ - NSArray *m = [self.phoneUtil_ matchedStringByRegex:accruedInputWithoutFormatting regex:internationalPrefix]; - - NSString *firstString = [m nb_safeStringAtIndex:0]; - - if (m != nil && firstString != nil && firstString.length > 0) { - self.isCompleteNumber_ = YES; - /** @type {number} */ - NSUInteger startOfCountryCallingCode = firstString.length; - self.nationalNumber_ = [[accruedInputWithoutFormatting substringFromIndex:startOfCountryCallingCode] mutableCopy]; - self.prefixBeforeNationalNumber_ = [[accruedInputWithoutFormatting substringWithRange:NSMakeRange(0, startOfCountryCallingCode)] mutableCopy]; - - if ([accruedInputWithoutFormatting characterAtIndex:0] != '+') - { - [self.prefixBeforeNationalNumber_ appendString:NBSeparatorBeforeNationalNumber]; - } - return YES; - } - return NO; -} +- (BOOL)attemptToExtractIdd_ { + /** @type {string} */ + NSString *accruedInputWithoutFormatting = [self.accruedInputWithoutFormatting_ copy]; + /** @type {RegExp} */ + NSString *internationalPrefix = + [NSString stringWithFormat:@"^(?:\\+|%@)", self.currentMetaData_.internationalPrefix]; + /** @type {Array.} */ + NSArray *m = [self.phoneUtil_ matchedStringByRegex:accruedInputWithoutFormatting + regex:internationalPrefix]; + NSString *firstString = [m nb_safeStringAtIndex:0]; + + if (m != nil && firstString != nil && firstString.length > 0) { + self.isCompleteNumber_ = YES; + /** @type {number} */ + NSUInteger startOfCountryCallingCode = firstString.length; + self.nationalNumber_ = + [[accruedInputWithoutFormatting substringFromIndex:startOfCountryCallingCode] mutableCopy]; + self.prefixBeforeNationalNumber_ = [[accruedInputWithoutFormatting + substringWithRange:NSMakeRange(0, startOfCountryCallingCode)] mutableCopy]; + + if ([accruedInputWithoutFormatting characterAtIndex:0] != '+') { + [self.prefixBeforeNationalNumber_ appendString:NBSeparatorBeforeNationalNumber]; + } + return YES; + } + return NO; +} /** * Extracts the country calling code from the beginning of nationalNumber to @@ -1101,39 +1089,39 @@ static const NSUInteger NBMinLeadingDigitsLength = 3; * @return {BOOL} YES when a valid country calling code can be found. * @private */ -- (BOOL)attemptToExtractCountryCallingCode_ -{ - if (self.nationalNumber_.length == 0) { - return NO; - } - - /** @type {!goog.string.StringBuffer} */ - NSString *numberWithoutCountryCallingCode = @""; - - /** @type {number} */ - NSNumber *countryCode = [self.phoneUtil_ extractCountryCode:self.nationalNumber_ nationalNumber:&numberWithoutCountryCallingCode]; - - if ([countryCode isEqualToNumber:@0]) { - return NO; - } - - self.nationalNumber_ = [numberWithoutCountryCallingCode mutableCopy]; - - /** @type {string} */ - NSString *newRegionCode = [self.phoneUtil_ getRegionCodeForCountryCode:countryCode]; - - if ([NB_REGION_CODE_FOR_NON_GEO_ENTITY isEqualToString:newRegionCode]) { - NBMetadataHelper *helper = [[NBMetadataHelper alloc] init]; - self.currentMetaData_ = [helper getMetadataForNonGeographicalRegion:countryCode]; - } else if (newRegionCode != self.defaultCountry_) { - self.currentMetaData_ = [self getMetadataForRegion_:newRegionCode]; - } - - /** @type {string} */ - [self.prefixBeforeNationalNumber_ appendFormat:@"%@%@", countryCode, NBSeparatorBeforeNationalNumber]; - return YES; -} +- (BOOL)attemptToExtractCountryCallingCode_ { + if (self.nationalNumber_.length == 0) { + return NO; + } + /** @type {!goog.string.StringBuffer} */ + NSString *numberWithoutCountryCallingCode = @""; + + /** @type {number} */ + NSNumber *countryCode = [self.phoneUtil_ extractCountryCode:self.nationalNumber_ + nationalNumber:&numberWithoutCountryCallingCode]; + + if ([countryCode isEqualToNumber:@0]) { + return NO; + } + + self.nationalNumber_ = [numberWithoutCountryCallingCode mutableCopy]; + + /** @type {string} */ + NSString *newRegionCode = [self.phoneUtil_ getRegionCodeForCountryCode:countryCode]; + + if ([NB_REGION_CODE_FOR_NON_GEO_ENTITY isEqualToString:newRegionCode]) { + NBMetadataHelper *helper = [[NBMetadataHelper alloc] init]; + self.currentMetaData_ = [helper getMetadataForNonGeographicalRegion:countryCode]; + } else if (newRegionCode != self.defaultCountry_) { + self.currentMetaData_ = [self getMetadataForRegion_:newRegionCode]; + } + + /** @type {string} */ + [self.prefixBeforeNationalNumber_ + appendFormat:@"%@%@", countryCode, NBSeparatorBeforeNationalNumber]; + return YES; +} /** * Accrues digits and the plus sign to accruedInputWithoutFormatting for later @@ -1148,79 +1136,76 @@ static const NSUInteger NBMinLeadingDigitsLength = 3; * @return {string} * @private */ -- (NSString*)normalizeAndAccrueDigitsAndPlusSign_:(NSString *)nextChar rememberPosition:(BOOL)rememberPosition -{ - /** @type {string} */ - NSString *normalizedChar; - - if ([nextChar isEqualToString:@"+"]) { - normalizedChar = nextChar; - [self.accruedInputWithoutFormatting_ appendString:nextChar]; - } else { - normalizedChar = [[self.phoneUtil_ DIGIT_MAPPINGS] objectForKey:nextChar]; - if (!normalizedChar) return @""; - - [self.accruedInputWithoutFormatting_ appendString:normalizedChar]; - [self.nationalNumber_ appendString:normalizedChar]; - } - - if (rememberPosition) { - self.positionToRemember_ = self.accruedInputWithoutFormatting_.length; - } - - return normalizedChar; -} +- (NSString *)normalizeAndAccrueDigitsAndPlusSign_:(NSString *)nextChar + rememberPosition:(BOOL)rememberPosition { + /** @type {string} */ + NSString *normalizedChar; + if ([nextChar isEqualToString:@"+"]) { + normalizedChar = nextChar; + [self.accruedInputWithoutFormatting_ appendString:nextChar]; + } else { + normalizedChar = [[self.phoneUtil_ DIGIT_MAPPINGS] objectForKey:nextChar]; + if (!normalizedChar) return @""; + + [self.accruedInputWithoutFormatting_ appendString:normalizedChar]; + [self.nationalNumber_ appendString:normalizedChar]; + } + + if (rememberPosition) { + self.positionToRemember_ = self.accruedInputWithoutFormatting_.length; + } + + return normalizedChar; +} /** * - param {string} nextChar * @return {string} * @private */ -- (NSString*)inputDigitHelper_:(NSString *)nextChar -{ - /** @type {string} */ - NSString *formattingTemplate = [self.formattingTemplate_ copy]; - NSString *subedString = @""; - - if (formattingTemplate.length > self.lastMatchPosition_) { - subedString = [formattingTemplate substringFromIndex:self.lastMatchPosition_]; - } - - if ([self.phoneUtil_ stringPositionByRegex:subedString regex:NBDigitPlaceHolder] >= 0) { - /** @type {number} */ - int digitPatternStart = [self.phoneUtil_ stringPositionByRegex:formattingTemplate regex:NBDigitPlaceHolder]; - - /** @type {string} */ - NSRange tempRange = [formattingTemplate rangeOfString:NBDigitPlaceHolder]; - NSString *tempTemplate = [formattingTemplate stringByReplacingOccurrencesOfString:NBDigitPlaceHolder - withString:nextChar - options:NSLiteralSearch - range:tempRange]; - self.formattingTemplate_ = [tempTemplate mutableCopy]; - self.lastMatchPosition_ = digitPatternStart; - return [tempTemplate substringWithRange:NSMakeRange(0, self.lastMatchPosition_ + 1)]; - } else { - if (self.possibleFormats_.count == 1) - { - // More digits are entered than we could handle, and there are no other - // valid patterns to try. - self.ableToFormat_ = NO; - } // else, we just reset the formatting pattern. - self.currentFormattingPattern_ = @""; - return self.accruedInput_; - } -} +- (NSString *)inputDigitHelper_:(NSString *)nextChar { + /** @type {string} */ + NSString *formattingTemplate = [self.formattingTemplate_ copy]; + NSString *subedString = @""; + if (formattingTemplate.length > self.lastMatchPosition_) { + subedString = [formattingTemplate substringFromIndex:self.lastMatchPosition_]; + } + + if ([self.phoneUtil_ stringPositionByRegex:subedString regex:NBDigitPlaceHolder] >= 0) { + /** @type {number} */ + int digitPatternStart = + [self.phoneUtil_ stringPositionByRegex:formattingTemplate regex:NBDigitPlaceHolder]; + + /** @type {string} */ + NSRange tempRange = [formattingTemplate rangeOfString:NBDigitPlaceHolder]; + NSString *tempTemplate = + [formattingTemplate stringByReplacingOccurrencesOfString:NBDigitPlaceHolder + withString:nextChar + options:NSLiteralSearch + range:tempRange]; + self.formattingTemplate_ = [tempTemplate mutableCopy]; + self.lastMatchPosition_ = digitPatternStart; + return [tempTemplate substringWithRange:NSMakeRange(0, self.lastMatchPosition_ + 1)]; + } else { + if (self.possibleFormats_.count == 1) { + // More digits are entered than we could handle, and there are no other + // valid patterns to try. + self.ableToFormat_ = NO; + } // else, we just reset the formatting pattern. + self.currentFormattingPattern_ = @""; + return self.accruedInput_; + } +} /** * Returns the formatted number. * * @return {string} */ -- (NSString *)description -{ - return self.currentOutput_; +- (NSString *)description { + return self.currentOutput_; } @end diff --git a/libPhoneNumber/NBGeneratedPhoneNumberMetaData.h b/libPhoneNumber/NBGeneratedPhoneNumberMetaData.h index cbd0e35..67ae99b 100644 --- a/libPhoneNumber/NBGeneratedPhoneNumberMetaData.h +++ b/libPhoneNumber/NBGeneratedPhoneNumberMetaData.h @@ -8,4065 +8,4065 @@ // z_const is not defined in some versions of zlib, so define it here // in case it has not been defined. #if defined(ZLIB_CONST) && !defined(z_const) -# define z_const const +#define z_const const #else -# define z_const +#define z_const #endif -#if TESTING==1 +#if TESTING == 1 z_const Bytef kPhoneNumberMetaData[] = { - 0x1f, 0x8b, 0x08, 0x08, 0x53, 0x54, 0xf0, 0x59, 0x00, 0x03, 0x50, 0x68, - 0x6f, 0x6e, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4d, 0x65, 0x74, - 0x61, 0x44, 0x61, 0x74, 0x61, 0x46, 0x6f, 0x72, 0x54, 0x65, 0x73, 0x74, - 0x69, 0x6e, 0x67, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x00, 0xed, 0x1d, 0x6b, - 0x6f, 0xdb, 0x38, 0xf2, 0xaf, 0x04, 0x42, 0x3e, 0x44, 0x07, 0xfa, 0x4e, - 0x7c, 0x8a, 0xec, 0x97, 0xa2, 0xc9, 0x76, 0xb3, 0xaf, 0xb4, 0x45, 0xd3, - 0x00, 0xed, 0x6a, 0xf5, 0xa1, 0xb8, 0x16, 0x87, 0x03, 0x16, 0xed, 0xe1, - 0xd0, 0x05, 0xee, 0x50, 0x66, 0x7f, 0xfb, 0xce, 0x90, 0x92, 0x6c, 0x49, - 0x43, 0x59, 0x8e, 0xdb, 0x44, 0xa9, 0x13, 0xb4, 0x36, 0x65, 0x6b, 0x86, - 0xa4, 0x38, 0xef, 0x19, 0xd2, 0x9f, 0xb3, 0x7f, 0x7e, 0xfc, 0xe3, 0xc3, - 0xa7, 0xff, 0xfe, 0xff, 0xec, 0xe3, 0xbb, 0xf7, 0xaf, 0x3e, 0xbe, 0x7c, - 0xff, 0xaf, 0x7f, 0x7f, 0xfc, 0x80, 0xed, 0x8b, 0xb7, 0xff, 0xc9, 0x1e, - 0x7d, 0xce, 0x78, 0xf6, 0xa8, 0xca, 0xae, 0x2e, 0x33, 0x96, 0x9d, 0x9e, - 0xe2, 0x0b, 0xb6, 0xce, 0x9e, 0x64, 0x35, 0xcb, 0xa4, 0xc4, 0xaf, 0xbe, - 0x7f, 0x19, 0xda, 0x06, 0xdb, 0x3f, 0x5c, 0x85, 0xb6, 0xc3, 0xf6, 0x8f, - 0xaf, 0xb0, 0xad, 0x14, 0xb6, 0xcf, 0x11, 0xf2, 0xfc, 0x3c, 0x7c, 0x10, - 0x6e, 0xbc, 0x7c, 0x1a, 0xda, 0x16, 0xdb, 0x2f, 0x7e, 0x09, 0xed, 0x00, - 0xf4, 0x5d, 0xf8, 0x5c, 0x0b, 0x6c, 0x5f, 0xbc, 0x0e, 0xed, 0x80, 0xe0, - 0x49, 0xe8, 0x44, 0x6b, 0x6c, 0x9f, 0x86, 0xb6, 0x09, 0xe3, 0x7a, 0x72, - 0x85, 0xa3, 0x39, 0xc3, 0x97, 0x70, 0xb7, 0x09, 0x77, 0x3f, 0xfb, 0x35, - 0xb4, 0xc3, 0xdd, 0x97, 0xa1, 0x57, 0x1b, 0xee, 0xfe, 0xe9, 0x45, 0x68, - 0x07, 0xec, 0x3f, 0x07, 0x2c, 0x36, 0x8c, 0xe6, 0xec, 0x19, 0xb6, 0x45, - 0x1c, 0xeb, 0x93, 0xe7, 0xe1, 0xc2, 0x84, 0xbb, 0x5e, 0x3e, 0x05, 0xd4, - 0x6f, 0xc2, 0x4c, 0x84, 0x2b, 0xf0, 0x93, 0x57, 0x71, 0xea, 0x65, 0xbc, - 0xf7, 0x22, 0x5e, 0xc4, 0x71, 0xbd, 0x89, 0x17, 0x01, 0xe5, 0x93, 0xef, - 0x02, 0xfa, 0x22, 0xc0, 0x14, 0x05, 0x0f, 0x57, 0xb1, 0xe7, 0xe6, 0xca, - 0x95, 0x71, 0x06, 0x4f, 0xe3, 0x85, 0xeb, 0xbe, 0xba, 0x66, 0xed, 0x8a, - 0xbc, 0xfa, 0x78, 0xf1, 0xfe, 0xd3, 0xdb, 0x77, 0x6f, 0x3f, 0xbd, 0xc5, - 0x85, 0x88, 0xc8, 0x3e, 0xfc, 0xf1, 0xfb, 0xef, 0x2c, 0xbe, 0x86, 0x97, - 0xec, 0xb7, 0xdf, 0xde, 0x7d, 0xb6, 0xd7, 0x19, 0x5b, 0x7f, 0x44, 0xbd, - 0x54, 0xb6, 0xae, 0x37, 0xc1, 0x66, 0xbc, 0x54, 0x2b, 0xbe, 0x3f, 0x4c, - 0x6a, 0x78, 0x19, 0x17, 0x52, 0x69, 0x53, 0xda, 0xec, 0x4e, 0x86, 0xf5, - 0x55, 0x61, 0xc2, 0x32, 0x32, 0x58, 0xae, 0x39, 0x20, 0x9c, 0x55, 0xb1, - 0x8f, 0xec, 0x04, 0x1f, 0x95, 0xba, 0xce, 0xdb, 0x77, 0xa0, 0xbc, 0x63, - 0x7e, 0x74, 0x2c, 0x32, 0x40, 0x39, 0x5c, 0xf5, 0xd9, 0x63, 0xd9, 0xb8, - 0xbe, 0xa5, 0xd9, 0xef, 0xd5, 0x63, 0xc7, 0x25, 0x24, 0x99, 0xbb, 0xed, - 0x64, 0xee, 0xbe, 0x10, 0xc9, 0x12, 0x5d, 0x75, 0x24, 0xeb, 0xbe, 0x41, - 0x9a, 0xdd, 0x83, 0xce, 0xad, 0x98, 0x0f, 0xb7, 0x41, 0xea, 0x79, 0x8a, - 0xde, 0x8f, 0x8e, 0xe5, 0x81, 0x91, 0x7c, 0x94, 0xfe, 0x77, 0x48, 0xf2, - 0xb7, 0x05, 0x73, 0xef, 0x59, 0x2b, 0x92, 0x3c, 0xac, 0xd7, 0x1c, 0x10, - 0xfe, 0x40, 0xef, 0x34, 0xbd, 0x83, 0x71, 0x94, 0x20, 0x77, 0xb3, 0x9d, - 0xdc, 0x0d, 0x41, 0x52, 0x04, 0x58, 0x43, 0x52, 0x0b, 0xa7, 0xa7, 0x25, - 0xc3, 0xe0, 0x32, 0x31, 0x30, 0x67, 0x91, 0xe8, 0xb7, 0xad, 0xca, 0x10, - 0xc1, 0x61, 0x90, 0xf1, 0x53, 0x8a, 0x8c, 0x2b, 0xbe, 0x72, 0xf5, 0x4c, - 0xa3, 0xfc, 0x1e, 0x89, 0xee, 0x6f, 0x02, 0x06, 0x97, 0x0c, 0xa4, 0x37, - 0x9f, 0x43, 0xd2, 0x7c, 0x29, 0xf4, 0x9c, 0x99, 0xa2, 0x48, 0x09, 0x39, - 0xf8, 0xaa, 0x93, 0x73, 0x7b, 0x93, 0xf3, 0xc5, 0x24, 0x39, 0x97, 0x73, - 0x7c, 0x4c, 0x56, 0x69, 0x36, 0x14, 0xd0, 0x53, 0x18, 0x32, 0xde, 0x8e, - 0x7f, 0x84, 0xec, 0xeb, 0x21, 0x5a, 0x1c, 0x59, 0xde, 0x1e, 0xf9, 0x5f, - 0xa0, 0x44, 0x57, 0x91, 0xfc, 0xb3, 0x1e, 0x0b, 0xf4, 0xaf, 0x16, 0x43, - 0xfc, 0xb7, 0xd3, 0x23, 0x3e, 0x9a, 0xe7, 0x24, 0xf5, 0x8b, 0x9b, 0xca, - 0xf2, 0x4c, 0x00, 0xdc, 0xc9, 0xe3, 0x47, 0x95, 0x30, 0x91, 0x6a, 0x3d, - 0xfc, 0x8f, 0x17, 0x39, 0x62, 0xd4, 0x04, 0x0d, 0x0b, 0x21, 0x28, 0xab, - 0x25, 0x73, 0x40, 0xf9, 0x32, 0x49, 0xf9, 0x4e, 0xc8, 0x07, 0x5b, 0xa7, - 0x47, 0xe5, 0xcf, 0x33, 0x26, 0x54, 0x47, 0xe5, 0x7f, 0x0e, 0xe8, 0xfc, - 0xcf, 0xb1, 0xe8, 0xef, 0x85, 0x60, 0x64, 0x63, 0xa2, 0x6f, 0xbc, 0x1f, - 0xb0, 0xa9, 0xfe, 0x32, 0xa1, 0x14, 0xa4, 0xb1, 0x91, 0x35, 0x1c, 0xe3, - 0xc5, 0x0c, 0xab, 0x9d, 0x95, 0xcc, 0x32, 0xbc, 0x97, 0xf1, 0xa1, 0x7e, - 0xeb, 0xa8, 0x5b, 0xb3, 0x49, 0xdf, 0xb0, 0xb7, 0x6e, 0x1b, 0x18, 0x07, - 0xe8, 0x1c, 0xa2, 0x82, 0x31, 0xf9, 0x0e, 0x2f, 0x85, 0xd5, 0xd1, 0x58, - 0xa9, 0xf1, 0xd9, 0x22, 0x15, 0xc4, 0xb4, 0x45, 0x02, 0xc9, 0x50, 0x83, - 0x9f, 0x20, 0x0a, 0xcf, 0x8b, 0x3c, 0xc5, 0xc4, 0x26, 0x35, 0x9c, 0xc5, - 0x33, 0xdb, 0xcb, 0x8c, 0xe9, 0x84, 0x46, 0x01, 0xf1, 0x77, 0xc2, 0xb9, - 0x97, 0x4a, 0x7a, 0x59, 0x72, 0x9d, 0xc3, 0xbf, 0xc7, 0x70, 0x97, 0x3b, - 0xe6, 0xbd, 0x49, 0x6e, 0x32, 0x9f, 0xb8, 0x4e, 0xfa, 0xc9, 0x2b, 0x60, - 0x3e, 0x56, 0x65, 0x3c, 0x44, 0xcf, 0x8b, 0x63, 0xde, 0x89, 0xbb, 0x7e, - 0xe4, 0x54, 0xa4, 0x21, 0xab, 0x42, 0x80, 0xf8, 0xf5, 0x95, 0x90, 0xf5, - 0x18, 0x87, 0xcb, 0x61, 0xac, 0x64, 0xe7, 0xe2, 0x88, 0x6b, 0xe0, 0xfc, - 0xd5, 0xb1, 0x42, 0x2c, 0x8e, 0x1a, 0x80, 0xcb, 0xa7, 0xc6, 0x20, 0x36, - 0xa0, 0xe1, 0x99, 0x6c, 0x8e, 0x23, 0x6f, 0x71, 0x85, 0xd7, 0xa3, 0xe3, - 0xb3, 0xb3, 0xc1, 0xb4, 0x86, 0xd2, 0xa8, 0x9d, 0xd6, 0xaa, 0x9b, 0x56, - 0x65, 0xec, 0x7a, 0x3a, 0xf5, 0xf2, 0x1f, 0x67, 0x23, 0x48, 0x8f, 0x36, - 0x1e, 0xe7, 0xdc, 0x07, 0x39, 0x00, 0x1d, 0x3f, 0xcb, 0x7d, 0x9f, 0xdd, - 0x61, 0xc8, 0xf4, 0xab, 0x84, 0x4c, 0xd7, 0xa5, 0x0d, 0xf2, 0x52, 0x31, - 0xae, 0x66, 0x18, 0x3c, 0x63, 0xd1, 0x0b, 0xab, 0xd0, 0xa0, 0xa0, 0xa4, - 0xa5, 0xe8, 0x72, 0x3e, 0x3d, 0x34, 0x03, 0x1c, 0x2a, 0x05, 0xae, 0x66, - 0x81, 0x73, 0x9b, 0xf6, 0x96, 0xf0, 0xbb, 0xb1, 0x97, 0x30, 0x16, 0xd7, - 0xdc, 0x15, 0x15, 0xdc, 0x68, 0xea, 0x24, 0x22, 0x37, 0x0b, 0xd1, 0x02, - 0xa5, 0xf5, 0x55, 0xc6, 0x4c, 0x70, 0x7f, 0x79, 0xc5, 0x45, 0x9d, 0x74, - 0x02, 0xf0, 0x86, 0x56, 0x48, 0x93, 0xf9, 0xa9, 0x84, 0x71, 0x84, 0x62, - 0x01, 0xf9, 0x69, 0x24, 0x4e, 0x78, 0x5a, 0x10, 0x35, 0x70, 0x95, 0x58, - 0xa9, 0xb2, 0xc7, 0x8d, 0x37, 0x66, 0xaa, 0xfb, 0xc7, 0x92, 0xa7, 0xa7, - 0x14, 0x4b, 0x0a, 0x65, 0x66, 0x7a, 0xde, 0x40, 0x79, 0xac, 0x2a, 0xb7, - 0x0f, 0x1e, 0x51, 0x12, 0x76, 0x46, 0x44, 0x32, 0x03, 0xfe, 0x4e, 0xa9, - 0x77, 0xc9, 0x30, 0xa1, 0x38, 0x02, 0x19, 0x8b, 0xf3, 0x6d, 0x8b, 0x75, - 0x78, 0xbe, 0xf5, 0x29, 0xe9, 0x44, 0x04, 0x39, 0x3f, 0xcb, 0x79, 0x08, - 0xd4, 0x3d, 0x28, 0x60, 0x98, 0x00, 0xcf, 0x28, 0x45, 0x11, 0x31, 0xdd, - 0x51, 0x15, 0xc4, 0x37, 0x01, 0x83, 0xcb, 0xc8, 0xb4, 0x7e, 0x48, 0x07, - 0xa4, 0xa8, 0xfc, 0x92, 0xa2, 0xf2, 0x13, 0xa1, 0x84, 0xb7, 0x27, 0x45, - 0xe1, 0x8d, 0xf1, 0x65, 0xe9, 0xad, 0xcd, 0x3d, 0x58, 0x0f, 0x29, 0x47, - 0x90, 0x24, 0xfd, 0x81, 0x60, 0x06, 0x21, 0x2e, 0xc0, 0xf4, 0x95, 0xf0, - 0xbf, 0x10, 0x68, 0xf9, 0x9a, 0x3a, 0x84, 0x46, 0xbd, 0xaa, 0x8a, 0x95, - 0x50, 0xd8, 0xd2, 0xd0, 0x02, 0xd3, 0xd6, 0x97, 0x95, 0x04, 0xab, 0xae, - 0xf6, 0x0e, 0xb4, 0xab, 0xae, 0x73, 0xaf, 0x00, 0x46, 0xa0, 0x95, 0x06, - 0xb7, 0x70, 0x6f, 0x14, 0x8c, 0x28, 0xf7, 0x1a, 0xb0, 0x18, 0x09, 0xa3, - 0x2b, 0x44, 0x1e, 0x75, 0x33, 0x61, 0xbb, 0x29, 0x01, 0xb7, 0xcd, 0xd2, - 0x1b, 0x61, 0x78, 0x52, 0x97, 0x5e, 0x6a, 0xe7, 0x15, 0xbc, 0x6b, 0x5d, - 0x4e, 0xe1, 0x85, 0x5b, 0x03, 0xde, 0x81, 0xd3, 0xdd, 0x7b, 0x64, 0x29, - 0xb7, 0xb9, 0x33, 0xe8, 0xca, 0x61, 0xc8, 0x2c, 0x5a, 0x81, 0x64, 0xbc, - 0x2c, 0x01, 0xb3, 0x40, 0x86, 0xbb, 0x5c, 0xeb, 0x94, 0xac, 0xa7, 0x57, - 0xb2, 0x29, 0x2d, 0x73, 0x20, 0xec, 0xf6, 0x66, 0x32, 0x5d, 0x41, 0xc4, - 0x57, 0x87, 0x88, 0x92, 0xf9, 0x05, 0x2a, 0x36, 0xcb, 0x03, 0xcd, 0x2c, - 0x9c, 0x62, 0x96, 0x0c, 0x83, 0x0b, 0xc6, 0x64, 0xa9, 0xb1, 0x18, 0x13, - 0x63, 0x45, 0x3d, 0xed, 0x0c, 0x8c, 0xfc, 0xd8, 0x3b, 0xfc, 0x9b, 0x8e, - 0xcd, 0xb6, 0x6e, 0x43, 0x70, 0x18, 0xf8, 0x2a, 0xba, 0x0b, 0xf6, 0x68, - 0xe4, 0x6e, 0x88, 0xb1, 0x7b, 0xd2, 0x07, 0x19, 0x41, 0x10, 0x0e, 0x0d, - 0xd1, 0xc9, 0x41, 0x39, 0x25, 0x67, 0x4f, 0x48, 0xa7, 0x44, 0xec, 0xe3, - 0x94, 0x4c, 0x80, 0xe3, 0x57, 0xad, 0x60, 0x1e, 0xe1, 0x7a, 0xf0, 0x4d, - 0xf6, 0xe0, 0x3c, 0x58, 0xc8, 0x99, 0xbe, 0xc9, 0x10, 0xfe, 0x30, 0xe8, - 0xfc, 0x2c, 0x59, 0x8e, 0x34, 0xdf, 0x3d, 0x21, 0xcb, 0x92, 0x68, 0xf7, - 0x64, 0x8a, 0xce, 0x1f, 0x52, 0xd5, 0xfb, 0xd0, 0xf9, 0x59, 0x1b, 0xdd, - 0x7a, 0xa0, 0x73, 0x8a, 0xce, 0x9f, 0x25, 0x2c, 0xa6, 0xb2, 0x6e, 0xa8, - 0x95, 0x5f, 0x7b, 0x0b, 0x9e, 0x03, 0x58, 0xe4, 0x8d, 0x25, 0x64, 0x98, - 0xbb, 0xf6, 0x21, 0xa1, 0x56, 0xce, 0x63, 0x85, 0x51, 0x6e, 0x4f, 0x34, - 0x98, 0x48, 0x4e, 0x70, 0xb4, 0xf1, 0xce, 0x31, 0x6f, 0x2e, 0x43, 0x20, - 0x19, 0x7c, 0x1a, 0xf4, 0x5f, 0x74, 0x18, 0x15, 0x7a, 0x36, 0x65, 0x55, - 0x70, 0x69, 0x40, 0x29, 0xe7, 0xc9, 0x9d, 0x05, 0xf2, 0xbe, 0x54, 0x93, - 0xde, 0x1e, 0x63, 0x3c, 0xcb, 0x98, 0x35, 0xdb, 0xcb, 0x3e, 0x22, 0x0c, - 0x65, 0x16, 0x69, 0x66, 0x06, 0x86, 0x91, 0x84, 0xd5, 0x80, 0x0f, 0xc2, - 0x7b, 0x34, 0xb9, 0x2a, 0x3e, 0xfc, 0x04, 0x13, 0x34, 0x85, 0x77, 0x7a, - 0x23, 0xcb, 0x75, 0x7c, 0x76, 0x36, 0x36, 0xd7, 0xda, 0x5e, 0x6c, 0xbf, - 0x8f, 0x2e, 0x94, 0x7c, 0x58, 0x66, 0xd7, 0xeb, 0xdb, 0x8d, 0x96, 0x4d, - 0xa9, 0xa3, 0x87, 0x78, 0xd9, 0x3e, 0x5c, 0xf7, 0xfa, 0x41, 0x1d, 0x4d, - 0xd0, 0xf9, 0x77, 0x64, 0xf9, 0xec, 0xfc, 0xfc, 0xa3, 0x62, 0x20, 0x94, - 0xd8, 0x66, 0x59, 0x09, 0xab, 0x04, 0x93, 0x03, 0xc2, 0x0f, 0x25, 0x58, - 0x6a, 0x65, 0x1a, 0x89, 0xe4, 0x65, 0x55, 0x34, 0xf2, 0xc9, 0x57, 0xa0, - 0x21, 0x6a, 0x0c, 0xa2, 0x55, 0x31, 0x85, 0xdc, 0xb8, 0xff, 0x79, 0xd0, - 0x2c, 0x9c, 0x51, 0xba, 0x45, 0x26, 0xab, 0x0c, 0xc7, 0x3d, 0xf3, 0x13, - 0x1d, 0x8b, 0x4f, 0x7c, 0x19, 0x65, 0x9b, 0x37, 0x55, 0x21, 0xea, 0xb6, - 0x2d, 0xa3, 0x1b, 0x94, 0x13, 0x0a, 0x4c, 0xaf, 0x15, 0x58, 0x9f, 0xb1, - 0xa9, 0xda, 0x94, 0x64, 0x9c, 0x6b, 0x23, 0x36, 0x36, 0x10, 0x0f, 0xa3, - 0x50, 0xd9, 0x49, 0xc5, 0xa5, 0x6e, 0xb2, 0x9d, 0x8d, 0xba, 0xa7, 0x06, - 0xe6, 0x52, 0x18, 0x47, 0xe3, 0x5a, 0x1e, 0x33, 0x02, 0xb5, 0x31, 0xe5, - 0xf6, 0x51, 0x81, 0x92, 0x0d, 0xd4, 0x93, 0x00, 0x62, 0x42, 0x5a, 0xf2, - 0xae, 0x30, 0xbe, 0xc2, 0xb8, 0x6b, 0x20, 0xa1, 0x44, 0x41, 0x45, 0x57, - 0xca, 0x80, 0x66, 0x56, 0xc4, 0xf3, 0x8f, 0x56, 0x95, 0xaa, 0xba, 0xf0, - 0x58, 0x8a, 0xe0, 0xc6, 0xa0, 0x01, 0x6f, 0xb7, 0x7d, 0x44, 0x0c, 0x94, - 0xb0, 0x6a, 0x94, 0x30, 0x12, 0x38, 0xd0, 0xf3, 0x2a, 0xd0, 0x33, 0x16, - 0x1a, 0xf2, 0x1e, 0x45, 0xa7, 0xd1, 0x76, 0xb3, 0x13, 0xac, 0xfc, 0x52, - 0xb8, 0x37, 0xd1, 0xb6, 0x79, 0x5f, 0x33, 0xca, 0xf7, 0xe2, 0x76, 0xd6, - 0x49, 0x50, 0xc9, 0xd2, 0xc9, 0x62, 0xb7, 0x01, 0x7c, 0x50, 0xc6, 0xc1, - 0xf7, 0x64, 0x2a, 0x4d, 0xce, 0xdc, 0x3b, 0x33, 0x0c, 0xc6, 0xa4, 0xe0, - 0xb2, 0x87, 0x8a, 0xd2, 0xbd, 0x05, 0x0e, 0xac, 0x14, 0x93, 0xf2, 0x06, - 0x02, 0xa7, 0x5f, 0xf9, 0xb4, 0xf1, 0x3e, 0xae, 0x80, 0x92, 0x87, 0xc9, - 0x04, 0xe7, 0x64, 0xb5, 0x44, 0xca, 0xcb, 0x1c, 0x22, 0x09, 0x75, 0x4b, - 0x4d, 0xfd, 0xe8, 0x38, 0x03, 0x60, 0x92, 0x15, 0xa3, 0x92, 0xd4, 0xca, - 0x11, 0x27, 0x85, 0xac, 0x0c, 0x15, 0x55, 0xe9, 0xcd, 0x40, 0x59, 0x99, - 0x52, 0xf3, 0x23, 0x1d, 0x9f, 0xae, 0x3f, 0x9d, 0x87, 0xc1, 0x81, 0xd3, - 0x9c, 0xae, 0xcb, 0x72, 0x33, 0xb1, 0x58, 0x90, 0xff, 0x0a, 0x13, 0x8a, - 0xc1, 0x0b, 0x5f, 0x89, 0x3a, 0x9d, 0x96, 0x53, 0x72, 0x16, 0xc6, 0x32, - 0x39, 0xb3, 0xb2, 0x98, 0x87, 0x41, 0x9b, 0x14, 0x06, 0x6d, 0xd2, 0x18, - 0xc2, 0x81, 0x14, 0x6a, 0xc6, 0x3e, 0x88, 0x11, 0x73, 0x4e, 0x55, 0x54, - 0xb6, 0x85, 0x4c, 0xb0, 0xec, 0xa8, 0x20, 0x4b, 0x5b, 0x07, 0x25, 0x75, - 0x02, 0x0c, 0x9a, 0xf7, 0x75, 0xdc, 0xa8, 0x86, 0x8a, 0xa8, 0xa5, 0x6a, - 0x58, 0xdc, 0x24, 0x50, 0xcc, 0xa8, 0xc4, 0xea, 0x08, 0x30, 0x85, 0x22, - 0x55, 0x1f, 0xb9, 0xa1, 0xa4, 0x2b, 0x55, 0x6e, 0x82, 0x8f, 0xc5, 0x4c, - 0x56, 0x26, 0x57, 0xa0, 0x34, 0x69, 0xba, 0xba, 0x87, 0x42, 0xe7, 0xfc, - 0x76, 0xa3, 0xc4, 0x34, 0x07, 0x34, 0xe2, 0x66, 0xe1, 0xca, 0x6f, 0xc9, - 0x30, 0xb8, 0x90, 0x1d, 0xef, 0xef, 0x06, 0x7f, 0xdb, 0x54, 0x77, 0x27, - 0x74, 0xfe, 0x03, 0x59, 0x1d, 0x2c, 0x53, 0x6e, 0xe6, 0x10, 0xcb, 0x97, - 0x38, 0x80, 0x23, 0xd9, 0x59, 0xe7, 0x7f, 0x2f, 0xbd, 0x74, 0xe3, 0xd6, - 0x88, 0x19, 0x56, 0x8b, 0xc9, 0x2e, 0xb2, 0x6b, 0xfa, 0x9a, 0x6c, 0x1c, - 0xa6, 0x38, 0x34, 0x62, 0xfe, 0xf1, 0x15, 0x99, 0xf2, 0x28, 0x64, 0xb3, - 0x79, 0x49, 0xcf, 0xdc, 0xbc, 0x44, 0x6f, 0x5c, 0x0a, 0x64, 0x4a, 0xef, - 0x7f, 0xca, 0x8a, 0xf9, 0x31, 0x1c, 0x19, 0x83, 0xb3, 0xf3, 0x6d, 0x4e, - 0xaa, 0xf4, 0xde, 0xe2, 0x6e, 0x9b, 0xa6, 0xf2, 0xdd, 0xcb, 0xce, 0x20, - 0x18, 0x22, 0xa4, 0x2b, 0xe0, 0x61, 0x82, 0x43, 0x74, 0xb8, 0xb9, 0x42, - 0x44, 0x34, 0x31, 0x22, 0x64, 0x48, 0x74, 0x0e, 0x8b, 0xfa, 0xa7, 0x71, - 0x2d, 0x8f, 0x69, 0x80, 0x2a, 0x98, 0x74, 0xb3, 0x35, 0xc0, 0x8e, 0xf6, - 0x5f, 0x51, 0x09, 0x53, 0xa7, 0xb6, 0xa2, 0xa8, 0xcd, 0xe0, 0xc6, 0x08, - 0x90, 0xcb, 0xd6, 0x60, 0x9b, 0x36, 0xd4, 0x28, 0x68, 0x99, 0x04, 0x1a, - 0xa6, 0x6e, 0x6c, 0x56, 0x1f, 0x96, 0xbf, 0xf8, 0xd3, 0x0b, 0x4a, 0x0a, - 0x14, 0x65, 0xac, 0xf5, 0x0a, 0xfb, 0x04, 0x3b, 0x47, 0x4d, 0xce, 0x92, - 0x08, 0xe3, 0xd8, 0x73, 0x7d, 0x63, 0xdc, 0x70, 0xf3, 0x17, 0xaa, 0x2d, - 0x03, 0x4c, 0x25, 0xe6, 0x47, 0x9b, 0x58, 0x37, 0xd5, 0x53, 0x59, 0x02, - 0xff, 0xf7, 0xf8, 0xf5, 0x5b, 0xac, 0xac, 0xc1, 0x15, 0x67, 0x36, 0x94, - 0xbc, 0x7c, 0x0d, 0x07, 0x2f, 0x2c, 0x68, 0x22, 0x7a, 0x39, 0x8c, 0xdb, - 0xd0, 0xbe, 0x55, 0xe3, 0xdc, 0xcd, 0xc2, 0x94, 0xf6, 0xce, 0x38, 0xe7, - 0x5e, 0x08, 0xe1, 0xa5, 0x84, 0x4b, 0xcc, 0x74, 0x6c, 0x7c, 0x90, 0x73, - 0xe2, 0xa3, 0xe9, 0xbd, 0x7e, 0xa9, 0x6e, 0xd6, 0x5d, 0xe0, 0x06, 0x75, - 0x6c, 0x8a, 0xa6, 0x2d, 0x7a, 0x17, 0x45, 0xbc, 0x9a, 0x0c, 0xea, 0xd2, - 0x1b, 0xfa, 0xe2, 0xfe, 0x1f, 0x6a, 0x1b, 0x21, 0xf5, 0x00, 0x56, 0x51, - 0x8c, 0x01, 0x31, 0x27, 0xa7, 0x03, 0xf7, 0xfd, 0xad, 0xa9, 0x12, 0x6c, - 0xd0, 0x7e, 0x8d, 0x20, 0x59, 0x40, 0x1e, 0x47, 0x48, 0xef, 0x76, 0xeb, - 0x31, 0x9a, 0xba, 0x23, 0xe9, 0xf7, 0x73, 0x6a, 0x0b, 0x77, 0xd9, 0x08, - 0x25, 0x77, 0xed, 0x6d, 0xc2, 0x87, 0x9f, 0x96, 0x7b, 0xe3, 0x54, 0x9b, - 0xf0, 0x98, 0xcc, 0x08, 0x1b, 0xaf, 0xbd, 0xc6, 0xf0, 0x43, 0xed, 0x0d, - 0xbc, 0xa9, 0x3a, 0x47, 0x52, 0x8c, 0x79, 0x06, 0x30, 0x28, 0xba, 0xaa, - 0x10, 0xc3, 0xc8, 0x44, 0x53, 0xe2, 0x1c, 0x04, 0x8e, 0x51, 0x27, 0xdd, - 0x1e, 0x02, 0x42, 0x26, 0xe8, 0x38, 0x1d, 0xcb, 0x22, 0x0d, 0xa6, 0x74, - 0xe2, 0x8c, 0xca, 0x72, 0x0d, 0x2d, 0x24, 0x53, 0xac, 0x67, 0x41, 0x9e, - 0xcc, 0x32, 0x63, 0xb7, 0xe2, 0x4d, 0x84, 0x60, 0xa6, 0x93, 0x41, 0x33, - 0x5d, 0x90, 0x5b, 0x24, 0x77, 0x0a, 0xbb, 0xa5, 0x31, 0x20, 0x21, 0x31, - 0x2b, 0xd0, 0x6c, 0xc2, 0xa4, 0x2a, 0xc7, 0xac, 0xaa, 0xad, 0x61, 0xc1, - 0xcb, 0x7a, 0x1d, 0xa0, 0x1e, 0xee, 0x00, 0xb7, 0xb8, 0xfa, 0x58, 0xae, - 0xe3, 0xad, 0x6e, 0xee, 0x7a, 0x7c, 0x33, 0xf9, 0xbb, 0xde, 0xb4, 0x8b, - 0xe5, 0x41, 0x85, 0xe7, 0x58, 0x6e, 0xe2, 0x2b, 0xe3, 0x6a, 0x07, 0xa4, - 0xa6, 0xb4, 0xad, 0x73, 0x8f, 0xb5, 0x42, 0x28, 0xf0, 0x89, 0x3b, 0x30, - 0x76, 0xa9, 0xbc, 0x76, 0xde, 0xe6, 0xed, 0x7d, 0x3b, 0x49, 0xdd, 0x7e, - 0xf7, 0x15, 0x07, 0xac, 0xb0, 0xfe, 0x36, 0xc6, 0xf9, 0x02, 0xad, 0x2b, - 0x1c, 0x00, 0x3c, 0x91, 0x02, 0x1e, 0xc9, 0xaa, 0xd9, 0x92, 0x11, 0x48, - 0xa4, 0x19, 0xd0, 0x08, 0x26, 0x7c, 0x86, 0x9c, 0xa2, 0x2a, 0x6d, 0xea, - 0x3c, 0x05, 0x3d, 0x25, 0x13, 0x93, 0x63, 0x94, 0x61, 0xcb, 0x00, 0xb8, - 0x0f, 0xbb, 0x89, 0x63, 0x02, 0x03, 0x1a, 0xa5, 0x5b, 0x46, 0x31, 0xf5, - 0xb0, 0xe4, 0xc4, 0x24, 0xb6, 0xe9, 0xca, 0x88, 0xa6, 0xd9, 0x39, 0x2f, - 0xe9, 0x05, 0xdb, 0x46, 0x2c, 0x22, 0x9e, 0xc1, 0x52, 0x63, 0xe2, 0x1f, - 0x28, 0xb1, 0xac, 0xf1, 0x86, 0xf5, 0x87, 0x48, 0x28, 0x1c, 0x28, 0x45, - 0x81, 0xa4, 0x12, 0x15, 0x47, 0x75, 0xec, 0xa5, 0xf3, 0x0a, 0xc4, 0x16, - 0xdc, 0x8b, 0x71, 0x6e, 0x58, 0xaa, 0x9c, 0x4e, 0x72, 0x6e, 0x9b, 0x7b, - 0xd8, 0xa4, 0xd3, 0x15, 0xae, 0x41, 0x17, 0x88, 0xbd, 0xed, 0x3e, 0xf4, - 0xdc, 0x6c, 0x5e, 0x47, 0xb9, 0x26, 0xf1, 0x64, 0x18, 0x18, 0x02, 0x7c, - 0xd2, 0x0c, 0xd6, 0xa2, 0xec, 0x2c, 0x56, 0xda, 0x86, 0xaa, 0x37, 0xbe, - 0x32, 0x88, 0x04, 0xaf, 0xf2, 0x35, 0xae, 0xc9, 0x61, 0x6d, 0x2a, 0x4b, - 0xc1, 0xc3, 0xf4, 0x23, 0x35, 0x8a, 0x40, 0x8e, 0xb8, 0x57, 0x28, 0xce, - 0x17, 0x79, 0x39, 0x08, 0x6a, 0x61, 0xa6, 0x91, 0xaa, 0x11, 0x52, 0x69, - 0x3a, 0x84, 0x58, 0x59, 0x11, 0x66, 0x6a, 0xb0, 0xc4, 0x02, 0xf7, 0x92, - 0x27, 0x72, 0xc3, 0xc3, 0xe2, 0xfc, 0x55, 0x57, 0x51, 0x66, 0xda, 0x0c, - 0x3a, 0xdb, 0xbc, 0x8a, 0x83, 0x0d, 0x83, 0xcf, 0xa9, 0x6f, 0x76, 0x98, - 0x06, 0x45, 0xf0, 0x93, 0x7d, 0x37, 0x13, 0xec, 0xf7, 0x39, 0x35, 0xd3, - 0x83, 0x72, 0xac, 0x2e, 0xc8, 0x52, 0xb5, 0x6e, 0x1f, 0xcd, 0xbc, 0xa3, - 0x61, 0xda, 0xda, 0x9d, 0x61, 0x72, 0xba, 0x53, 0xaf, 0x54, 0x60, 0x44, - 0x24, 0x73, 0x67, 0x63, 0x44, 0x3c, 0x95, 0x19, 0x6c, 0x36, 0xf5, 0x10, - 0xc7, 0xae, 0x7c, 0x9d, 0x32, 0x9b, 0x14, 0x8a, 0x64, 0x5d, 0xcd, 0xd2, - 0xdd, 0x2c, 0x58, 0x7f, 0xa6, 0x45, 0x1b, 0x7d, 0xec, 0xef, 0x50, 0x03, - 0xb1, 0x5a, 0x28, 0x94, 0xab, 0x27, 0xcd, 0xe3, 0x47, 0x86, 0xe3, 0x13, - 0x47, 0xbf, 0x6c, 0xcf, 0x46, 0x55, 0x20, 0xfc, 0x9a, 0xc2, 0x0f, 0x7e, - 0xd4, 0x61, 0xe2, 0x49, 0x0e, 0x4f, 0xa0, 0x91, 0xd2, 0x6b, 0xed, 0x2d, - 0xdf, 0x82, 0x68, 0xc6, 0x78, 0x04, 0x2a, 0x94, 0x20, 0xac, 0xd7, 0xdb, - 0x2e, 0x83, 0x9c, 0xf2, 0x36, 0xd6, 0x94, 0xb9, 0xc0, 0x0b, 0x13, 0x1d, - 0xf1, 0x91, 0x1e, 0xde, 0xe8, 0xab, 0x50, 0xba, 0xe7, 0x2e, 0x06, 0xd9, - 0xd3, 0x0c, 0x3e, 0x6f, 0x9c, 0x9a, 0x14, 0x46, 0x7a, 0xf4, 0x14, 0x46, - 0x14, 0x9b, 0xba, 0x74, 0xa9, 0x79, 0x04, 0x15, 0x35, 0xec, 0xad, 0x7e, - 0x58, 0xba, 0xe9, 0xa5, 0x1b, 0x38, 0xfa, 0x83, 0x95, 0x9b, 0xb9, 0x5a, - 0x04, 0x92, 0x99, 0x8b, 0x75, 0x17, 0xfa, 0xe0, 0x4e, 0x34, 0xd0, 0xb3, - 0x5f, 0xe9, 0x63, 0xfb, 0x6c, 0xeb, 0x24, 0x82, 0x73, 0x0b, 0xca, 0xbb, - 0x9c, 0x7b, 0x84, 0x65, 0xc2, 0xb5, 0x15, 0xaa, 0x70, 0xae, 0x89, 0x86, - 0x07, 0x03, 0x40, 0xac, 0xca, 0x60, 0xd3, 0x95, 0xc1, 0x4a, 0xc7, 0xb3, - 0xd0, 0xc0, 0x18, 0x10, 0xc1, 0x2a, 0xc8, 0x53, 0x2e, 0x61, 0x40, 0x32, - 0x8c, 0x0a, 0x8c, 0xeb, 0x46, 0x82, 0x71, 0x5a, 0x88, 0x76, 0xc8, 0x4d, - 0xf4, 0x1d, 0x1c, 0x65, 0xcf, 0xdb, 0x10, 0xbf, 0xc6, 0x2b, 0x3c, 0xc0, - 0x25, 0x5e, 0x98, 0x30, 0xc7, 0x76, 0xef, 0x6a, 0x0e, 0xfe, 0x44, 0xab, - 0x81, 0x4d, 0xe3, 0xda, 0x97, 0xb1, 0x76, 0x71, 0x34, 0x22, 0x52, 0xef, - 0x90, 0x4f, 0xa0, 0x3d, 0x56, 0x87, 0xed, 0xa0, 0x03, 0xa9, 0xc3, 0xd9, - 0xa6, 0xd0, 0x24, 0xf4, 0xe0, 0x18, 0xcd, 0xf2, 0x34, 0x21, 0xd0, 0x21, - 0x33, 0x37, 0x29, 0x28, 0x49, 0x3a, 0x11, 0x6d, 0xf0, 0x4d, 0x61, 0x48, - 0xc5, 0x94, 0x09, 0x1f, 0x6a, 0x98, 0x17, 0xd0, 0x63, 0x04, 0xe0, 0xd5, - 0xcc, 0xf5, 0xdf, 0xa8, 0xbc, 0x02, 0x4a, 0xee, 0xc3, 0xb4, 0x6e, 0x5f, - 0xfc, 0xb2, 0x80, 0xf3, 0x9d, 0x31, 0xaa, 0xa6, 0x31, 0xa6, 0x8f, 0xce, - 0x86, 0x09, 0xae, 0x20, 0x0a, 0xb7, 0xa9, 0x43, 0x11, 0x74, 0xe2, 0x4c, - 0x84, 0x89, 0x93, 0xb1, 0xec, 0xc6, 0x39, 0xc2, 0xe3, 0x48, 0x11, 0xd5, - 0x49, 0x79, 0x4f, 0x32, 0xf1, 0xb8, 0x8a, 0x4c, 0xd9, 0x7d, 0x4a, 0xbd, - 0x86, 0xc1, 0x12, 0xa2, 0x14, 0xb3, 0xc1, 0x77, 0x70, 0x2c, 0xf2, 0x92, - 0x3e, 0x02, 0x5d, 0x98, 0x64, 0xb5, 0xe1, 0x16, 0x16, 0xc1, 0x1f, 0x5e, - 0x4a, 0xea, 0x4f, 0x23, 0x78, 0xd8, 0xaa, 0x34, 0x20, 0x52, 0x03, 0x2c, - 0xe2, 0x30, 0x14, 0xef, 0x55, 0x99, 0x54, 0xbe, 0xc6, 0xd1, 0x31, 0xe5, - 0x39, 0x61, 0xe0, 0x71, 0x19, 0x24, 0x0f, 0x1c, 0x29, 0xe0, 0x55, 0x1b, - 0xe0, 0x45, 0x05, 0xd6, 0x62, 0xb1, 0x92, 0xe5, 0x94, 0xf6, 0xb7, 0x9c, - 0x64, 0xb1, 0xe5, 0x31, 0x0c, 0xfe, 0xe6, 0x15, 0x3c, 0xea, 0x5d, 0x39, - 0xa6, 0x5b, 0x74, 0xa2, 0x72, 0xf9, 0x16, 0xd8, 0x06, 0xa9, 0xc3, 0xf7, - 0x28, 0xc1, 0xdb, 0xec, 0xde, 0xf0, 0xd1, 0x65, 0x72, 0x2f, 0xd4, 0x97, - 0xf9, 0x01, 0x98, 0x7b, 0xf3, 0x03, 0x2b, 0x4b, 0x86, 0xc1, 0x55, 0x62, - 0x6a, 0xd6, 0xef, 0x61, 0x1c, 0xde, 0x19, 0x6f, 0x97, 0x64, 0x79, 0x6c, - 0xc5, 0xbb, 0x73, 0xa2, 0xe7, 0x6d, 0x20, 0xb7, 0xf4, 0x09, 0xd1, 0xd2, - 0x24, 0x8f, 0x3f, 0x97, 0xa4, 0x0b, 0x33, 0x44, 0x60, 0xd3, 0xbf, 0x1c, - 0x60, 0xe7, 0x20, 0xe0, 0x8f, 0x6f, 0x12, 0x02, 0x1c, 0xcf, 0x84, 0x4f, - 0x84, 0x01, 0x79, 0x2a, 0x0e, 0xb8, 0x7c, 0xc6, 0x38, 0x07, 0xef, 0x07, - 0x4f, 0x86, 0x43, 0x2d, 0x58, 0xc3, 0x0b, 0xa6, 0x19, 0x86, 0xd3, 0x2b, - 0xc3, 0xdf, 0xb4, 0xc9, 0x45, 0xfd, 0xfc, 0x5d, 0x08, 0xcf, 0x9b, 0x10, - 0xde, 0xe0, 0x44, 0x6d, 0xd4, 0xb0, 0x0e, 0x9e, 0x28, 0x93, 0x88, 0x2e, - 0xcc, 0xce, 0xb5, 0xef, 0x18, 0xaf, 0x3a, 0x2c, 0x73, 0xee, 0x15, 0x79, - 0xe2, 0x8f, 0x8d, 0xae, 0xe1, 0x8c, 0xe8, 0x89, 0x62, 0x66, 0x14, 0xce, - 0xb0, 0x31, 0x2a, 0x91, 0xe2, 0xbb, 0x7e, 0xed, 0x20, 0x05, 0x4b, 0x15, - 0x57, 0xd8, 0x2d, 0xc5, 0x15, 0x11, 0xf2, 0xa6, 0xdc, 0xbe, 0x38, 0x06, - 0xbb, 0x11, 0x53, 0xc2, 0x62, 0x32, 0xe1, 0x8a, 0x87, 0x42, 0xf7, 0x04, - 0xb1, 0x5f, 0x91, 0xe7, 0x35, 0x62, 0xba, 0xbb, 0xfb, 0x69, 0x83, 0x6b, - 0x34, 0xf1, 0x63, 0xfe, 0x76, 0xa6, 0x3b, 0x43, 0x26, 0xa0, 0x76, 0xc4, - 0x99, 0xf8, 0xc5, 0x83, 0xd8, 0xc1, 0x6d, 0xe2, 0x46, 0x4f, 0x67, 0xe6, - 0x29, 0x8c, 0x2d, 0xce, 0x5d, 0x72, 0x5e, 0x24, 0xcc, 0xf2, 0xf8, 0xe8, - 0x6a, 0x70, 0x0a, 0x63, 0x76, 0xf4, 0xfe, 0x7f, 0x9f, 0x3e, 0xfc, 0xfd, - 0xa8, 0x75, 0x5f, 0x7a, 0x19, 0x2d, 0x4e, 0x27, 0x46, 0x7a, 0xfa, 0x6c, - 0xd0, 0xcd, 0x8e, 0xb9, 0x8b, 0x11, 0xf4, 0x8e, 0xb9, 0x18, 0x0a, 0xfe, - 0x06, 0x8f, 0x85, 0x8f, 0x58, 0x6f, 0x4b, 0x92, 0x74, 0xbf, 0xd5, 0xde, - 0x97, 0xd9, 0xdf, 0xd0, 0x1b, 0x01, 0xf6, 0x0a, 0x54, 0x38, 0x2c, 0xcf, - 0x50, 0xf1, 0xc4, 0x7c, 0x32, 0x5c, 0xe1, 0x4c, 0x41, 0x85, 0x2b, 0xa4, - 0x4b, 0x06, 0x29, 0xa4, 0xfb, 0x32, 0x41, 0x8a, 0xc5, 0x71, 0xd1, 0x8d, - 0x38, 0x0f, 0x16, 0x6d, 0x87, 0x48, 0xc4, 0x5e, 0x24, 0xb2, 0x5e, 0x33, - 0x0f, 0x8b, 0x70, 0x5f, 0x02, 0x07, 0xd7, 0xd7, 0x7f, 0x01, 0x4d, 0xe1, - 0xb6, 0x34, 0xbe, 0x7d, 0x00, 0x00 -}; -z_const size_t kPhoneNumberMetaDataCompressedLength = sizeof(kPhoneNumberMetaData); + 0x1f, 0x8b, 0x08, 0x08, 0x53, 0x54, 0xf0, 0x59, 0x00, 0x03, 0x50, 0x68, + 0x6f, 0x6e, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4d, 0x65, 0x74, + 0x61, 0x44, 0x61, 0x74, 0x61, 0x46, 0x6f, 0x72, 0x54, 0x65, 0x73, 0x74, + 0x69, 0x6e, 0x67, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x00, 0xed, 0x1d, 0x6b, + 0x6f, 0xdb, 0x38, 0xf2, 0xaf, 0x04, 0x42, 0x3e, 0x44, 0x07, 0xfa, 0x4e, + 0x7c, 0x8a, 0xec, 0x97, 0xa2, 0xc9, 0x76, 0xb3, 0xaf, 0xb4, 0x45, 0xd3, + 0x00, 0xed, 0x6a, 0xf5, 0xa1, 0xb8, 0x16, 0x87, 0x03, 0x16, 0xed, 0xe1, + 0xd0, 0x05, 0xee, 0x50, 0x66, 0x7f, 0xfb, 0xce, 0x90, 0x92, 0x6c, 0x49, + 0x43, 0x59, 0x8e, 0xdb, 0x44, 0xa9, 0x13, 0xb4, 0x36, 0x65, 0x6b, 0x86, + 0xa4, 0x38, 0xef, 0x19, 0xd2, 0x9f, 0xb3, 0x7f, 0x7e, 0xfc, 0xe3, 0xc3, + 0xa7, 0xff, 0xfe, 0xff, 0xec, 0xe3, 0xbb, 0xf7, 0xaf, 0x3e, 0xbe, 0x7c, + 0xff, 0xaf, 0x7f, 0x7f, 0xfc, 0x80, 0xed, 0x8b, 0xb7, 0xff, 0xc9, 0x1e, + 0x7d, 0xce, 0x78, 0xf6, 0xa8, 0xca, 0xae, 0x2e, 0x33, 0x96, 0x9d, 0x9e, + 0xe2, 0x0b, 0xb6, 0xce, 0x9e, 0x64, 0x35, 0xcb, 0xa4, 0xc4, 0xaf, 0xbe, + 0x7f, 0x19, 0xda, 0x06, 0xdb, 0x3f, 0x5c, 0x85, 0xb6, 0xc3, 0xf6, 0x8f, + 0xaf, 0xb0, 0xad, 0x14, 0xb6, 0xcf, 0x11, 0xf2, 0xfc, 0x3c, 0x7c, 0x10, + 0x6e, 0xbc, 0x7c, 0x1a, 0xda, 0x16, 0xdb, 0x2f, 0x7e, 0x09, 0xed, 0x00, + 0xf4, 0x5d, 0xf8, 0x5c, 0x0b, 0x6c, 0x5f, 0xbc, 0x0e, 0xed, 0x80, 0xe0, + 0x49, 0xe8, 0x44, 0x6b, 0x6c, 0x9f, 0x86, 0xb6, 0x09, 0xe3, 0x7a, 0x72, + 0x85, 0xa3, 0x39, 0xc3, 0x97, 0x70, 0xb7, 0x09, 0x77, 0x3f, 0xfb, 0x35, + 0xb4, 0xc3, 0xdd, 0x97, 0xa1, 0x57, 0x1b, 0xee, 0xfe, 0xe9, 0x45, 0x68, + 0x07, 0xec, 0x3f, 0x07, 0x2c, 0x36, 0x8c, 0xe6, 0xec, 0x19, 0xb6, 0x45, + 0x1c, 0xeb, 0x93, 0xe7, 0xe1, 0xc2, 0x84, 0xbb, 0x5e, 0x3e, 0x05, 0xd4, + 0x6f, 0xc2, 0x4c, 0x84, 0x2b, 0xf0, 0x93, 0x57, 0x71, 0xea, 0x65, 0xbc, + 0xf7, 0x22, 0x5e, 0xc4, 0x71, 0xbd, 0x89, 0x17, 0x01, 0xe5, 0x93, 0xef, + 0x02, 0xfa, 0x22, 0xc0, 0x14, 0x05, 0x0f, 0x57, 0xb1, 0xe7, 0xe6, 0xca, + 0x95, 0x71, 0x06, 0x4f, 0xe3, 0x85, 0xeb, 0xbe, 0xba, 0x66, 0xed, 0x8a, + 0xbc, 0xfa, 0x78, 0xf1, 0xfe, 0xd3, 0xdb, 0x77, 0x6f, 0x3f, 0xbd, 0xc5, + 0x85, 0x88, 0xc8, 0x3e, 0xfc, 0xf1, 0xfb, 0xef, 0x2c, 0xbe, 0x86, 0x97, + 0xec, 0xb7, 0xdf, 0xde, 0x7d, 0xb6, 0xd7, 0x19, 0x5b, 0x7f, 0x44, 0xbd, + 0x54, 0xb6, 0xae, 0x37, 0xc1, 0x66, 0xbc, 0x54, 0x2b, 0xbe, 0x3f, 0x4c, + 0x6a, 0x78, 0x19, 0x17, 0x52, 0x69, 0x53, 0xda, 0xec, 0x4e, 0x86, 0xf5, + 0x55, 0x61, 0xc2, 0x32, 0x32, 0x58, 0xae, 0x39, 0x20, 0x9c, 0x55, 0xb1, + 0x8f, 0xec, 0x04, 0x1f, 0x95, 0xba, 0xce, 0xdb, 0x77, 0xa0, 0xbc, 0x63, + 0x7e, 0x74, 0x2c, 0x32, 0x40, 0x39, 0x5c, 0xf5, 0xd9, 0x63, 0xd9, 0xb8, + 0xbe, 0xa5, 0xd9, 0xef, 0xd5, 0x63, 0xc7, 0x25, 0x24, 0x99, 0xbb, 0xed, + 0x64, 0xee, 0xbe, 0x10, 0xc9, 0x12, 0x5d, 0x75, 0x24, 0xeb, 0xbe, 0x41, + 0x9a, 0xdd, 0x83, 0xce, 0xad, 0x98, 0x0f, 0xb7, 0x41, 0xea, 0x79, 0x8a, + 0xde, 0x8f, 0x8e, 0xe5, 0x81, 0x91, 0x7c, 0x94, 0xfe, 0x77, 0x48, 0xf2, + 0xb7, 0x05, 0x73, 0xef, 0x59, 0x2b, 0x92, 0x3c, 0xac, 0xd7, 0x1c, 0x10, + 0xfe, 0x40, 0xef, 0x34, 0xbd, 0x83, 0x71, 0x94, 0x20, 0x77, 0xb3, 0x9d, + 0xdc, 0x0d, 0x41, 0x52, 0x04, 0x58, 0x43, 0x52, 0x0b, 0xa7, 0xa7, 0x25, + 0xc3, 0xe0, 0x32, 0x31, 0x30, 0x67, 0x91, 0xe8, 0xb7, 0xad, 0xca, 0x10, + 0xc1, 0x61, 0x90, 0xf1, 0x53, 0x8a, 0x8c, 0x2b, 0xbe, 0x72, 0xf5, 0x4c, + 0xa3, 0xfc, 0x1e, 0x89, 0xee, 0x6f, 0x02, 0x06, 0x97, 0x0c, 0xa4, 0x37, + 0x9f, 0x43, 0xd2, 0x7c, 0x29, 0xf4, 0x9c, 0x99, 0xa2, 0x48, 0x09, 0x39, + 0xf8, 0xaa, 0x93, 0x73, 0x7b, 0x93, 0xf3, 0xc5, 0x24, 0x39, 0x97, 0x73, + 0x7c, 0x4c, 0x56, 0x69, 0x36, 0x14, 0xd0, 0x53, 0x18, 0x32, 0xde, 0x8e, + 0x7f, 0x84, 0xec, 0xeb, 0x21, 0x5a, 0x1c, 0x59, 0xde, 0x1e, 0xf9, 0x5f, + 0xa0, 0x44, 0x57, 0x91, 0xfc, 0xb3, 0x1e, 0x0b, 0xf4, 0xaf, 0x16, 0x43, + 0xfc, 0xb7, 0xd3, 0x23, 0x3e, 0x9a, 0xe7, 0x24, 0xf5, 0x8b, 0x9b, 0xca, + 0xf2, 0x4c, 0x00, 0xdc, 0xc9, 0xe3, 0x47, 0x95, 0x30, 0x91, 0x6a, 0x3d, + 0xfc, 0x8f, 0x17, 0x39, 0x62, 0xd4, 0x04, 0x0d, 0x0b, 0x21, 0x28, 0xab, + 0x25, 0x73, 0x40, 0xf9, 0x32, 0x49, 0xf9, 0x4e, 0xc8, 0x07, 0x5b, 0xa7, + 0x47, 0xe5, 0xcf, 0x33, 0x26, 0x54, 0x47, 0xe5, 0x7f, 0x0e, 0xe8, 0xfc, + 0xcf, 0xb1, 0xe8, 0xef, 0x85, 0x60, 0x64, 0x63, 0xa2, 0x6f, 0xbc, 0x1f, + 0xb0, 0xa9, 0xfe, 0x32, 0xa1, 0x14, 0xa4, 0xb1, 0x91, 0x35, 0x1c, 0xe3, + 0xc5, 0x0c, 0xab, 0x9d, 0x95, 0xcc, 0x32, 0xbc, 0x97, 0xf1, 0xa1, 0x7e, + 0xeb, 0xa8, 0x5b, 0xb3, 0x49, 0xdf, 0xb0, 0xb7, 0x6e, 0x1b, 0x18, 0x07, + 0xe8, 0x1c, 0xa2, 0x82, 0x31, 0xf9, 0x0e, 0x2f, 0x85, 0xd5, 0xd1, 0x58, + 0xa9, 0xf1, 0xd9, 0x22, 0x15, 0xc4, 0xb4, 0x45, 0x02, 0xc9, 0x50, 0x83, + 0x9f, 0x20, 0x0a, 0xcf, 0x8b, 0x3c, 0xc5, 0xc4, 0x26, 0x35, 0x9c, 0xc5, + 0x33, 0xdb, 0xcb, 0x8c, 0xe9, 0x84, 0x46, 0x01, 0xf1, 0x77, 0xc2, 0xb9, + 0x97, 0x4a, 0x7a, 0x59, 0x72, 0x9d, 0xc3, 0xbf, 0xc7, 0x70, 0x97, 0x3b, + 0xe6, 0xbd, 0x49, 0x6e, 0x32, 0x9f, 0xb8, 0x4e, 0xfa, 0xc9, 0x2b, 0x60, + 0x3e, 0x56, 0x65, 0x3c, 0x44, 0xcf, 0x8b, 0x63, 0xde, 0x89, 0xbb, 0x7e, + 0xe4, 0x54, 0xa4, 0x21, 0xab, 0x42, 0x80, 0xf8, 0xf5, 0x95, 0x90, 0xf5, + 0x18, 0x87, 0xcb, 0x61, 0xac, 0x64, 0xe7, 0xe2, 0x88, 0x6b, 0xe0, 0xfc, + 0xd5, 0xb1, 0x42, 0x2c, 0x8e, 0x1a, 0x80, 0xcb, 0xa7, 0xc6, 0x20, 0x36, + 0xa0, 0xe1, 0x99, 0x6c, 0x8e, 0x23, 0x6f, 0x71, 0x85, 0xd7, 0xa3, 0xe3, + 0xb3, 0xb3, 0xc1, 0xb4, 0x86, 0xd2, 0xa8, 0x9d, 0xd6, 0xaa, 0x9b, 0x56, + 0x65, 0xec, 0x7a, 0x3a, 0xf5, 0xf2, 0x1f, 0x67, 0x23, 0x48, 0x8f, 0x36, + 0x1e, 0xe7, 0xdc, 0x07, 0x39, 0x00, 0x1d, 0x3f, 0xcb, 0x7d, 0x9f, 0xdd, + 0x61, 0xc8, 0xf4, 0xab, 0x84, 0x4c, 0xd7, 0xa5, 0x0d, 0xf2, 0x52, 0x31, + 0xae, 0x66, 0x18, 0x3c, 0x63, 0xd1, 0x0b, 0xab, 0xd0, 0xa0, 0xa0, 0xa4, + 0xa5, 0xe8, 0x72, 0x3e, 0x3d, 0x34, 0x03, 0x1c, 0x2a, 0x05, 0xae, 0x66, + 0x81, 0x73, 0x9b, 0xf6, 0x96, 0xf0, 0xbb, 0xb1, 0x97, 0x30, 0x16, 0xd7, + 0xdc, 0x15, 0x15, 0xdc, 0x68, 0xea, 0x24, 0x22, 0x37, 0x0b, 0xd1, 0x02, + 0xa5, 0xf5, 0x55, 0xc6, 0x4c, 0x70, 0x7f, 0x79, 0xc5, 0x45, 0x9d, 0x74, + 0x02, 0xf0, 0x86, 0x56, 0x48, 0x93, 0xf9, 0xa9, 0x84, 0x71, 0x84, 0x62, + 0x01, 0xf9, 0x69, 0x24, 0x4e, 0x78, 0x5a, 0x10, 0x35, 0x70, 0x95, 0x58, + 0xa9, 0xb2, 0xc7, 0x8d, 0x37, 0x66, 0xaa, 0xfb, 0xc7, 0x92, 0xa7, 0xa7, + 0x14, 0x4b, 0x0a, 0x65, 0x66, 0x7a, 0xde, 0x40, 0x79, 0xac, 0x2a, 0xb7, + 0x0f, 0x1e, 0x51, 0x12, 0x76, 0x46, 0x44, 0x32, 0x03, 0xfe, 0x4e, 0xa9, + 0x77, 0xc9, 0x30, 0xa1, 0x38, 0x02, 0x19, 0x8b, 0xf3, 0x6d, 0x8b, 0x75, + 0x78, 0xbe, 0xf5, 0x29, 0xe9, 0x44, 0x04, 0x39, 0x3f, 0xcb, 0x79, 0x08, + 0xd4, 0x3d, 0x28, 0x60, 0x98, 0x00, 0xcf, 0x28, 0x45, 0x11, 0x31, 0xdd, + 0x51, 0x15, 0xc4, 0x37, 0x01, 0x83, 0xcb, 0xc8, 0xb4, 0x7e, 0x48, 0x07, + 0xa4, 0xa8, 0xfc, 0x92, 0xa2, 0xf2, 0x13, 0xa1, 0x84, 0xb7, 0x27, 0x45, + 0xe1, 0x8d, 0xf1, 0x65, 0xe9, 0xad, 0xcd, 0x3d, 0x58, 0x0f, 0x29, 0x47, + 0x90, 0x24, 0xfd, 0x81, 0x60, 0x06, 0x21, 0x2e, 0xc0, 0xf4, 0x95, 0xf0, + 0xbf, 0x10, 0x68, 0xf9, 0x9a, 0x3a, 0x84, 0x46, 0xbd, 0xaa, 0x8a, 0x95, + 0x50, 0xd8, 0xd2, 0xd0, 0x02, 0xd3, 0xd6, 0x97, 0x95, 0x04, 0xab, 0xae, + 0xf6, 0x0e, 0xb4, 0xab, 0xae, 0x73, 0xaf, 0x00, 0x46, 0xa0, 0x95, 0x06, + 0xb7, 0x70, 0x6f, 0x14, 0x8c, 0x28, 0xf7, 0x1a, 0xb0, 0x18, 0x09, 0xa3, + 0x2b, 0x44, 0x1e, 0x75, 0x33, 0x61, 0xbb, 0x29, 0x01, 0xb7, 0xcd, 0xd2, + 0x1b, 0x61, 0x78, 0x52, 0x97, 0x5e, 0x6a, 0xe7, 0x15, 0xbc, 0x6b, 0x5d, + 0x4e, 0xe1, 0x85, 0x5b, 0x03, 0xde, 0x81, 0xd3, 0xdd, 0x7b, 0x64, 0x29, + 0xb7, 0xb9, 0x33, 0xe8, 0xca, 0x61, 0xc8, 0x2c, 0x5a, 0x81, 0x64, 0xbc, + 0x2c, 0x01, 0xb3, 0x40, 0x86, 0xbb, 0x5c, 0xeb, 0x94, 0xac, 0xa7, 0x57, + 0xb2, 0x29, 0x2d, 0x73, 0x20, 0xec, 0xf6, 0x66, 0x32, 0x5d, 0x41, 0xc4, + 0x57, 0x87, 0x88, 0x92, 0xf9, 0x05, 0x2a, 0x36, 0xcb, 0x03, 0xcd, 0x2c, + 0x9c, 0x62, 0x96, 0x0c, 0x83, 0x0b, 0xc6, 0x64, 0xa9, 0xb1, 0x18, 0x13, + 0x63, 0x45, 0x3d, 0xed, 0x0c, 0x8c, 0xfc, 0xd8, 0x3b, 0xfc, 0x9b, 0x8e, + 0xcd, 0xb6, 0x6e, 0x43, 0x70, 0x18, 0xf8, 0x2a, 0xba, 0x0b, 0xf6, 0x68, + 0xe4, 0x6e, 0x88, 0xb1, 0x7b, 0xd2, 0x07, 0x19, 0x41, 0x10, 0x0e, 0x0d, + 0xd1, 0xc9, 0x41, 0x39, 0x25, 0x67, 0x4f, 0x48, 0xa7, 0x44, 0xec, 0xe3, + 0x94, 0x4c, 0x80, 0xe3, 0x57, 0xad, 0x60, 0x1e, 0xe1, 0x7a, 0xf0, 0x4d, + 0xf6, 0xe0, 0x3c, 0x58, 0xc8, 0x99, 0xbe, 0xc9, 0x10, 0xfe, 0x30, 0xe8, + 0xfc, 0x2c, 0x59, 0x8e, 0x34, 0xdf, 0x3d, 0x21, 0xcb, 0x92, 0x68, 0xf7, + 0x64, 0x8a, 0xce, 0x1f, 0x52, 0xd5, 0xfb, 0xd0, 0xf9, 0x59, 0x1b, 0xdd, + 0x7a, 0xa0, 0x73, 0x8a, 0xce, 0x9f, 0x25, 0x2c, 0xa6, 0xb2, 0x6e, 0xa8, + 0x95, 0x5f, 0x7b, 0x0b, 0x9e, 0x03, 0x58, 0xe4, 0x8d, 0x25, 0x64, 0x98, + 0xbb, 0xf6, 0x21, 0xa1, 0x56, 0xce, 0x63, 0x85, 0x51, 0x6e, 0x4f, 0x34, + 0x98, 0x48, 0x4e, 0x70, 0xb4, 0xf1, 0xce, 0x31, 0x6f, 0x2e, 0x43, 0x20, + 0x19, 0x7c, 0x1a, 0xf4, 0x5f, 0x74, 0x18, 0x15, 0x7a, 0x36, 0x65, 0x55, + 0x70, 0x69, 0x40, 0x29, 0xe7, 0xc9, 0x9d, 0x05, 0xf2, 0xbe, 0x54, 0x93, + 0xde, 0x1e, 0x63, 0x3c, 0xcb, 0x98, 0x35, 0xdb, 0xcb, 0x3e, 0x22, 0x0c, + 0x65, 0x16, 0x69, 0x66, 0x06, 0x86, 0x91, 0x84, 0xd5, 0x80, 0x0f, 0xc2, + 0x7b, 0x34, 0xb9, 0x2a, 0x3e, 0xfc, 0x04, 0x13, 0x34, 0x85, 0x77, 0x7a, + 0x23, 0xcb, 0x75, 0x7c, 0x76, 0x36, 0x36, 0xd7, 0xda, 0x5e, 0x6c, 0xbf, + 0x8f, 0x2e, 0x94, 0x7c, 0x58, 0x66, 0xd7, 0xeb, 0xdb, 0x8d, 0x96, 0x4d, + 0xa9, 0xa3, 0x87, 0x78, 0xd9, 0x3e, 0x5c, 0xf7, 0xfa, 0x41, 0x1d, 0x4d, + 0xd0, 0xf9, 0x77, 0x64, 0xf9, 0xec, 0xfc, 0xfc, 0xa3, 0x62, 0x20, 0x94, + 0xd8, 0x66, 0x59, 0x09, 0xab, 0x04, 0x93, 0x03, 0xc2, 0x0f, 0x25, 0x58, + 0x6a, 0x65, 0x1a, 0x89, 0xe4, 0x65, 0x55, 0x34, 0xf2, 0xc9, 0x57, 0xa0, + 0x21, 0x6a, 0x0c, 0xa2, 0x55, 0x31, 0x85, 0xdc, 0xb8, 0xff, 0x79, 0xd0, + 0x2c, 0x9c, 0x51, 0xba, 0x45, 0x26, 0xab, 0x0c, 0xc7, 0x3d, 0xf3, 0x13, + 0x1d, 0x8b, 0x4f, 0x7c, 0x19, 0x65, 0x9b, 0x37, 0x55, 0x21, 0xea, 0xb6, + 0x2d, 0xa3, 0x1b, 0x94, 0x13, 0x0a, 0x4c, 0xaf, 0x15, 0x58, 0x9f, 0xb1, + 0xa9, 0xda, 0x94, 0x64, 0x9c, 0x6b, 0x23, 0x36, 0x36, 0x10, 0x0f, 0xa3, + 0x50, 0xd9, 0x49, 0xc5, 0xa5, 0x6e, 0xb2, 0x9d, 0x8d, 0xba, 0xa7, 0x06, + 0xe6, 0x52, 0x18, 0x47, 0xe3, 0x5a, 0x1e, 0x33, 0x02, 0xb5, 0x31, 0xe5, + 0xf6, 0x51, 0x81, 0x92, 0x0d, 0xd4, 0x93, 0x00, 0x62, 0x42, 0x5a, 0xf2, + 0xae, 0x30, 0xbe, 0xc2, 0xb8, 0x6b, 0x20, 0xa1, 0x44, 0x41, 0x45, 0x57, + 0xca, 0x80, 0x66, 0x56, 0xc4, 0xf3, 0x8f, 0x56, 0x95, 0xaa, 0xba, 0xf0, + 0x58, 0x8a, 0xe0, 0xc6, 0xa0, 0x01, 0x6f, 0xb7, 0x7d, 0x44, 0x0c, 0x94, + 0xb0, 0x6a, 0x94, 0x30, 0x12, 0x38, 0xd0, 0xf3, 0x2a, 0xd0, 0x33, 0x16, + 0x1a, 0xf2, 0x1e, 0x45, 0xa7, 0xd1, 0x76, 0xb3, 0x13, 0xac, 0xfc, 0x52, + 0xb8, 0x37, 0xd1, 0xb6, 0x79, 0x5f, 0x33, 0xca, 0xf7, 0xe2, 0x76, 0xd6, + 0x49, 0x50, 0xc9, 0xd2, 0xc9, 0x62, 0xb7, 0x01, 0x7c, 0x50, 0xc6, 0xc1, + 0xf7, 0x64, 0x2a, 0x4d, 0xce, 0xdc, 0x3b, 0x33, 0x0c, 0xc6, 0xa4, 0xe0, + 0xb2, 0x87, 0x8a, 0xd2, 0xbd, 0x05, 0x0e, 0xac, 0x14, 0x93, 0xf2, 0x06, + 0x02, 0xa7, 0x5f, 0xf9, 0xb4, 0xf1, 0x3e, 0xae, 0x80, 0x92, 0x87, 0xc9, + 0x04, 0xe7, 0x64, 0xb5, 0x44, 0xca, 0xcb, 0x1c, 0x22, 0x09, 0x75, 0x4b, + 0x4d, 0xfd, 0xe8, 0x38, 0x03, 0x60, 0x92, 0x15, 0xa3, 0x92, 0xd4, 0xca, + 0x11, 0x27, 0x85, 0xac, 0x0c, 0x15, 0x55, 0xe9, 0xcd, 0x40, 0x59, 0x99, + 0x52, 0xf3, 0x23, 0x1d, 0x9f, 0xae, 0x3f, 0x9d, 0x87, 0xc1, 0x81, 0xd3, + 0x9c, 0xae, 0xcb, 0x72, 0x33, 0xb1, 0x58, 0x90, 0xff, 0x0a, 0x13, 0x8a, + 0xc1, 0x0b, 0x5f, 0x89, 0x3a, 0x9d, 0x96, 0x53, 0x72, 0x16, 0xc6, 0x32, + 0x39, 0xb3, 0xb2, 0x98, 0x87, 0x41, 0x9b, 0x14, 0x06, 0x6d, 0xd2, 0x18, + 0xc2, 0x81, 0x14, 0x6a, 0xc6, 0x3e, 0x88, 0x11, 0x73, 0x4e, 0x55, 0x54, + 0xb6, 0x85, 0x4c, 0xb0, 0xec, 0xa8, 0x20, 0x4b, 0x5b, 0x07, 0x25, 0x75, + 0x02, 0x0c, 0x9a, 0xf7, 0x75, 0xdc, 0xa8, 0x86, 0x8a, 0xa8, 0xa5, 0x6a, + 0x58, 0xdc, 0x24, 0x50, 0xcc, 0xa8, 0xc4, 0xea, 0x08, 0x30, 0x85, 0x22, + 0x55, 0x1f, 0xb9, 0xa1, 0xa4, 0x2b, 0x55, 0x6e, 0x82, 0x8f, 0xc5, 0x4c, + 0x56, 0x26, 0x57, 0xa0, 0x34, 0x69, 0xba, 0xba, 0x87, 0x42, 0xe7, 0xfc, + 0x76, 0xa3, 0xc4, 0x34, 0x07, 0x34, 0xe2, 0x66, 0xe1, 0xca, 0x6f, 0xc9, + 0x30, 0xb8, 0x90, 0x1d, 0xef, 0xef, 0x06, 0x7f, 0xdb, 0x54, 0x77, 0x27, + 0x74, 0xfe, 0x03, 0x59, 0x1d, 0x2c, 0x53, 0x6e, 0xe6, 0x10, 0xcb, 0x97, + 0x38, 0x80, 0x23, 0xd9, 0x59, 0xe7, 0x7f, 0x2f, 0xbd, 0x74, 0xe3, 0xd6, + 0x88, 0x19, 0x56, 0x8b, 0xc9, 0x2e, 0xb2, 0x6b, 0xfa, 0x9a, 0x6c, 0x1c, + 0xa6, 0x38, 0x34, 0x62, 0xfe, 0xf1, 0x15, 0x99, 0xf2, 0x28, 0x64, 0xb3, + 0x79, 0x49, 0xcf, 0xdc, 0xbc, 0x44, 0x6f, 0x5c, 0x0a, 0x64, 0x4a, 0xef, + 0x7f, 0xca, 0x8a, 0xf9, 0x31, 0x1c, 0x19, 0x83, 0xb3, 0xf3, 0x6d, 0x4e, + 0xaa, 0xf4, 0xde, 0xe2, 0x6e, 0x9b, 0xa6, 0xf2, 0xdd, 0xcb, 0xce, 0x20, + 0x18, 0x22, 0xa4, 0x2b, 0xe0, 0x61, 0x82, 0x43, 0x74, 0xb8, 0xb9, 0x42, + 0x44, 0x34, 0x31, 0x22, 0x64, 0x48, 0x74, 0x0e, 0x8b, 0xfa, 0xa7, 0x71, + 0x2d, 0x8f, 0x69, 0x80, 0x2a, 0x98, 0x74, 0xb3, 0x35, 0xc0, 0x8e, 0xf6, + 0x5f, 0x51, 0x09, 0x53, 0xa7, 0xb6, 0xa2, 0xa8, 0xcd, 0xe0, 0xc6, 0x08, + 0x90, 0xcb, 0xd6, 0x60, 0x9b, 0x36, 0xd4, 0x28, 0x68, 0x99, 0x04, 0x1a, + 0xa6, 0x6e, 0x6c, 0x56, 0x1f, 0x96, 0xbf, 0xf8, 0xd3, 0x0b, 0x4a, 0x0a, + 0x14, 0x65, 0xac, 0xf5, 0x0a, 0xfb, 0x04, 0x3b, 0x47, 0x4d, 0xce, 0x92, + 0x08, 0xe3, 0xd8, 0x73, 0x7d, 0x63, 0xdc, 0x70, 0xf3, 0x17, 0xaa, 0x2d, + 0x03, 0x4c, 0x25, 0xe6, 0x47, 0x9b, 0x58, 0x37, 0xd5, 0x53, 0x59, 0x02, + 0xff, 0xf7, 0xf8, 0xf5, 0x5b, 0xac, 0xac, 0xc1, 0x15, 0x67, 0x36, 0x94, + 0xbc, 0x7c, 0x0d, 0x07, 0x2f, 0x2c, 0x68, 0x22, 0x7a, 0x39, 0x8c, 0xdb, + 0xd0, 0xbe, 0x55, 0xe3, 0xdc, 0xcd, 0xc2, 0x94, 0xf6, 0xce, 0x38, 0xe7, + 0x5e, 0x08, 0xe1, 0xa5, 0x84, 0x4b, 0xcc, 0x74, 0x6c, 0x7c, 0x90, 0x73, + 0xe2, 0xa3, 0xe9, 0xbd, 0x7e, 0xa9, 0x6e, 0xd6, 0x5d, 0xe0, 0x06, 0x75, + 0x6c, 0x8a, 0xa6, 0x2d, 0x7a, 0x17, 0x45, 0xbc, 0x9a, 0x0c, 0xea, 0xd2, + 0x1b, 0xfa, 0xe2, 0xfe, 0x1f, 0x6a, 0x1b, 0x21, 0xf5, 0x00, 0x56, 0x51, + 0x8c, 0x01, 0x31, 0x27, 0xa7, 0x03, 0xf7, 0xfd, 0xad, 0xa9, 0x12, 0x6c, + 0xd0, 0x7e, 0x8d, 0x20, 0x59, 0x40, 0x1e, 0x47, 0x48, 0xef, 0x76, 0xeb, + 0x31, 0x9a, 0xba, 0x23, 0xe9, 0xf7, 0x73, 0x6a, 0x0b, 0x77, 0xd9, 0x08, + 0x25, 0x77, 0xed, 0x6d, 0xc2, 0x87, 0x9f, 0x96, 0x7b, 0xe3, 0x54, 0x9b, + 0xf0, 0x98, 0xcc, 0x08, 0x1b, 0xaf, 0xbd, 0xc6, 0xf0, 0x43, 0xed, 0x0d, + 0xbc, 0xa9, 0x3a, 0x47, 0x52, 0x8c, 0x79, 0x06, 0x30, 0x28, 0xba, 0xaa, + 0x10, 0xc3, 0xc8, 0x44, 0x53, 0xe2, 0x1c, 0x04, 0x8e, 0x51, 0x27, 0xdd, + 0x1e, 0x02, 0x42, 0x26, 0xe8, 0x38, 0x1d, 0xcb, 0x22, 0x0d, 0xa6, 0x74, + 0xe2, 0x8c, 0xca, 0x72, 0x0d, 0x2d, 0x24, 0x53, 0xac, 0x67, 0x41, 0x9e, + 0xcc, 0x32, 0x63, 0xb7, 0xe2, 0x4d, 0x84, 0x60, 0xa6, 0x93, 0x41, 0x33, + 0x5d, 0x90, 0x5b, 0x24, 0x77, 0x0a, 0xbb, 0xa5, 0x31, 0x20, 0x21, 0x31, + 0x2b, 0xd0, 0x6c, 0xc2, 0xa4, 0x2a, 0xc7, 0xac, 0xaa, 0xad, 0x61, 0xc1, + 0xcb, 0x7a, 0x1d, 0xa0, 0x1e, 0xee, 0x00, 0xb7, 0xb8, 0xfa, 0x58, 0xae, + 0xe3, 0xad, 0x6e, 0xee, 0x7a, 0x7c, 0x33, 0xf9, 0xbb, 0xde, 0xb4, 0x8b, + 0xe5, 0x41, 0x85, 0xe7, 0x58, 0x6e, 0xe2, 0x2b, 0xe3, 0x6a, 0x07, 0xa4, + 0xa6, 0xb4, 0xad, 0x73, 0x8f, 0xb5, 0x42, 0x28, 0xf0, 0x89, 0x3b, 0x30, + 0x76, 0xa9, 0xbc, 0x76, 0xde, 0xe6, 0xed, 0x7d, 0x3b, 0x49, 0xdd, 0x7e, + 0xf7, 0x15, 0x07, 0xac, 0xb0, 0xfe, 0x36, 0xc6, 0xf9, 0x02, 0xad, 0x2b, + 0x1c, 0x00, 0x3c, 0x91, 0x02, 0x1e, 0xc9, 0xaa, 0xd9, 0x92, 0x11, 0x48, + 0xa4, 0x19, 0xd0, 0x08, 0x26, 0x7c, 0x86, 0x9c, 0xa2, 0x2a, 0x6d, 0xea, + 0x3c, 0x05, 0x3d, 0x25, 0x13, 0x93, 0x63, 0x94, 0x61, 0xcb, 0x00, 0xb8, + 0x0f, 0xbb, 0x89, 0x63, 0x02, 0x03, 0x1a, 0xa5, 0x5b, 0x46, 0x31, 0xf5, + 0xb0, 0xe4, 0xc4, 0x24, 0xb6, 0xe9, 0xca, 0x88, 0xa6, 0xd9, 0x39, 0x2f, + 0xe9, 0x05, 0xdb, 0x46, 0x2c, 0x22, 0x9e, 0xc1, 0x52, 0x63, 0xe2, 0x1f, + 0x28, 0xb1, 0xac, 0xf1, 0x86, 0xf5, 0x87, 0x48, 0x28, 0x1c, 0x28, 0x45, + 0x81, 0xa4, 0x12, 0x15, 0x47, 0x75, 0xec, 0xa5, 0xf3, 0x0a, 0xc4, 0x16, + 0xdc, 0x8b, 0x71, 0x6e, 0x58, 0xaa, 0x9c, 0x4e, 0x72, 0x6e, 0x9b, 0x7b, + 0xd8, 0xa4, 0xd3, 0x15, 0xae, 0x41, 0x17, 0x88, 0xbd, 0xed, 0x3e, 0xf4, + 0xdc, 0x6c, 0x5e, 0x47, 0xb9, 0x26, 0xf1, 0x64, 0x18, 0x18, 0x02, 0x7c, + 0xd2, 0x0c, 0xd6, 0xa2, 0xec, 0x2c, 0x56, 0xda, 0x86, 0xaa, 0x37, 0xbe, + 0x32, 0x88, 0x04, 0xaf, 0xf2, 0x35, 0xae, 0xc9, 0x61, 0x6d, 0x2a, 0x4b, + 0xc1, 0xc3, 0xf4, 0x23, 0x35, 0x8a, 0x40, 0x8e, 0xb8, 0x57, 0x28, 0xce, + 0x17, 0x79, 0x39, 0x08, 0x6a, 0x61, 0xa6, 0x91, 0xaa, 0x11, 0x52, 0x69, + 0x3a, 0x84, 0x58, 0x59, 0x11, 0x66, 0x6a, 0xb0, 0xc4, 0x02, 0xf7, 0x92, + 0x27, 0x72, 0xc3, 0xc3, 0xe2, 0xfc, 0x55, 0x57, 0x51, 0x66, 0xda, 0x0c, + 0x3a, 0xdb, 0xbc, 0x8a, 0x83, 0x0d, 0x83, 0xcf, 0xa9, 0x6f, 0x76, 0x98, + 0x06, 0x45, 0xf0, 0x93, 0x7d, 0x37, 0x13, 0xec, 0xf7, 0x39, 0x35, 0xd3, + 0x83, 0x72, 0xac, 0x2e, 0xc8, 0x52, 0xb5, 0x6e, 0x1f, 0xcd, 0xbc, 0xa3, + 0x61, 0xda, 0xda, 0x9d, 0x61, 0x72, 0xba, 0x53, 0xaf, 0x54, 0x60, 0x44, + 0x24, 0x73, 0x67, 0x63, 0x44, 0x3c, 0x95, 0x19, 0x6c, 0x36, 0xf5, 0x10, + 0xc7, 0xae, 0x7c, 0x9d, 0x32, 0x9b, 0x14, 0x8a, 0x64, 0x5d, 0xcd, 0xd2, + 0xdd, 0x2c, 0x58, 0x7f, 0xa6, 0x45, 0x1b, 0x7d, 0xec, 0xef, 0x50, 0x03, + 0xb1, 0x5a, 0x28, 0x94, 0xab, 0x27, 0xcd, 0xe3, 0x47, 0x86, 0xe3, 0x13, + 0x47, 0xbf, 0x6c, 0xcf, 0x46, 0x55, 0x20, 0xfc, 0x9a, 0xc2, 0x0f, 0x7e, + 0xd4, 0x61, 0xe2, 0x49, 0x0e, 0x4f, 0xa0, 0x91, 0xd2, 0x6b, 0xed, 0x2d, + 0xdf, 0x82, 0x68, 0xc6, 0x78, 0x04, 0x2a, 0x94, 0x20, 0xac, 0xd7, 0xdb, + 0x2e, 0x83, 0x9c, 0xf2, 0x36, 0xd6, 0x94, 0xb9, 0xc0, 0x0b, 0x13, 0x1d, + 0xf1, 0x91, 0x1e, 0xde, 0xe8, 0xab, 0x50, 0xba, 0xe7, 0x2e, 0x06, 0xd9, + 0xd3, 0x0c, 0x3e, 0x6f, 0x9c, 0x9a, 0x14, 0x46, 0x7a, 0xf4, 0x14, 0x46, + 0x14, 0x9b, 0xba, 0x74, 0xa9, 0x79, 0x04, 0x15, 0x35, 0xec, 0xad, 0x7e, + 0x58, 0xba, 0xe9, 0xa5, 0x1b, 0x38, 0xfa, 0x83, 0x95, 0x9b, 0xb9, 0x5a, + 0x04, 0x92, 0x99, 0x8b, 0x75, 0x17, 0xfa, 0xe0, 0x4e, 0x34, 0xd0, 0xb3, + 0x5f, 0xe9, 0x63, 0xfb, 0x6c, 0xeb, 0x24, 0x82, 0x73, 0x0b, 0xca, 0xbb, + 0x9c, 0x7b, 0x84, 0x65, 0xc2, 0xb5, 0x15, 0xaa, 0x70, 0xae, 0x89, 0x86, + 0x07, 0x03, 0x40, 0xac, 0xca, 0x60, 0xd3, 0x95, 0xc1, 0x4a, 0xc7, 0xb3, + 0xd0, 0xc0, 0x18, 0x10, 0xc1, 0x2a, 0xc8, 0x53, 0x2e, 0x61, 0x40, 0x32, + 0x8c, 0x0a, 0x8c, 0xeb, 0x46, 0x82, 0x71, 0x5a, 0x88, 0x76, 0xc8, 0x4d, + 0xf4, 0x1d, 0x1c, 0x65, 0xcf, 0xdb, 0x10, 0xbf, 0xc6, 0x2b, 0x3c, 0xc0, + 0x25, 0x5e, 0x98, 0x30, 0xc7, 0x76, 0xef, 0x6a, 0x0e, 0xfe, 0x44, 0xab, + 0x81, 0x4d, 0xe3, 0xda, 0x97, 0xb1, 0x76, 0x71, 0x34, 0x22, 0x52, 0xef, + 0x90, 0x4f, 0xa0, 0x3d, 0x56, 0x87, 0xed, 0xa0, 0x03, 0xa9, 0xc3, 0xd9, + 0xa6, 0xd0, 0x24, 0xf4, 0xe0, 0x18, 0xcd, 0xf2, 0x34, 0x21, 0xd0, 0x21, + 0x33, 0x37, 0x29, 0x28, 0x49, 0x3a, 0x11, 0x6d, 0xf0, 0x4d, 0x61, 0x48, + 0xc5, 0x94, 0x09, 0x1f, 0x6a, 0x98, 0x17, 0xd0, 0x63, 0x04, 0xe0, 0xd5, + 0xcc, 0xf5, 0xdf, 0xa8, 0xbc, 0x02, 0x4a, 0xee, 0xc3, 0xb4, 0x6e, 0x5f, + 0xfc, 0xb2, 0x80, 0xf3, 0x9d, 0x31, 0xaa, 0xa6, 0x31, 0xa6, 0x8f, 0xce, + 0x86, 0x09, 0xae, 0x20, 0x0a, 0xb7, 0xa9, 0x43, 0x11, 0x74, 0xe2, 0x4c, + 0x84, 0x89, 0x93, 0xb1, 0xec, 0xc6, 0x39, 0xc2, 0xe3, 0x48, 0x11, 0xd5, + 0x49, 0x79, 0x4f, 0x32, 0xf1, 0xb8, 0x8a, 0x4c, 0xd9, 0x7d, 0x4a, 0xbd, + 0x86, 0xc1, 0x12, 0xa2, 0x14, 0xb3, 0xc1, 0x77, 0x70, 0x2c, 0xf2, 0x92, + 0x3e, 0x02, 0x5d, 0x98, 0x64, 0xb5, 0xe1, 0x16, 0x16, 0xc1, 0x1f, 0x5e, + 0x4a, 0xea, 0x4f, 0x23, 0x78, 0xd8, 0xaa, 0x34, 0x20, 0x52, 0x03, 0x2c, + 0xe2, 0x30, 0x14, 0xef, 0x55, 0x99, 0x54, 0xbe, 0xc6, 0xd1, 0x31, 0xe5, + 0x39, 0x61, 0xe0, 0x71, 0x19, 0x24, 0x0f, 0x1c, 0x29, 0xe0, 0x55, 0x1b, + 0xe0, 0x45, 0x05, 0xd6, 0x62, 0xb1, 0x92, 0xe5, 0x94, 0xf6, 0xb7, 0x9c, + 0x64, 0xb1, 0xe5, 0x31, 0x0c, 0xfe, 0xe6, 0x15, 0x3c, 0xea, 0x5d, 0x39, + 0xa6, 0x5b, 0x74, 0xa2, 0x72, 0xf9, 0x16, 0xd8, 0x06, 0xa9, 0xc3, 0xf7, + 0x28, 0xc1, 0xdb, 0xec, 0xde, 0xf0, 0xd1, 0x65, 0x72, 0x2f, 0xd4, 0x97, + 0xf9, 0x01, 0x98, 0x7b, 0xf3, 0x03, 0x2b, 0x4b, 0x86, 0xc1, 0x55, 0x62, + 0x6a, 0xd6, 0xef, 0x61, 0x1c, 0xde, 0x19, 0x6f, 0x97, 0x64, 0x79, 0x6c, + 0xc5, 0xbb, 0x73, 0xa2, 0xe7, 0x6d, 0x20, 0xb7, 0xf4, 0x09, 0xd1, 0xd2, + 0x24, 0x8f, 0x3f, 0x97, 0xa4, 0x0b, 0x33, 0x44, 0x60, 0xd3, 0xbf, 0x1c, + 0x60, 0xe7, 0x20, 0xe0, 0x8f, 0x6f, 0x12, 0x02, 0x1c, 0xcf, 0x84, 0x4f, + 0x84, 0x01, 0x79, 0x2a, 0x0e, 0xb8, 0x7c, 0xc6, 0x38, 0x07, 0xef, 0x07, + 0x4f, 0x86, 0x43, 0x2d, 0x58, 0xc3, 0x0b, 0xa6, 0x19, 0x86, 0xd3, 0x2b, + 0xc3, 0xdf, 0xb4, 0xc9, 0x45, 0xfd, 0xfc, 0x5d, 0x08, 0xcf, 0x9b, 0x10, + 0xde, 0xe0, 0x44, 0x6d, 0xd4, 0xb0, 0x0e, 0x9e, 0x28, 0x93, 0x88, 0x2e, + 0xcc, 0xce, 0xb5, 0xef, 0x18, 0xaf, 0x3a, 0x2c, 0x73, 0xee, 0x15, 0x79, + 0xe2, 0x8f, 0x8d, 0xae, 0xe1, 0x8c, 0xe8, 0x89, 0x62, 0x66, 0x14, 0xce, + 0xb0, 0x31, 0x2a, 0x91, 0xe2, 0xbb, 0x7e, 0xed, 0x20, 0x05, 0x4b, 0x15, + 0x57, 0xd8, 0x2d, 0xc5, 0x15, 0x11, 0xf2, 0xa6, 0xdc, 0xbe, 0x38, 0x06, + 0xbb, 0x11, 0x53, 0xc2, 0x62, 0x32, 0xe1, 0x8a, 0x87, 0x42, 0xf7, 0x04, + 0xb1, 0x5f, 0x91, 0xe7, 0x35, 0x62, 0xba, 0xbb, 0xfb, 0x69, 0x83, 0x6b, + 0x34, 0xf1, 0x63, 0xfe, 0x76, 0xa6, 0x3b, 0x43, 0x26, 0xa0, 0x76, 0xc4, + 0x99, 0xf8, 0xc5, 0x83, 0xd8, 0xc1, 0x6d, 0xe2, 0x46, 0x4f, 0x67, 0xe6, + 0x29, 0x8c, 0x2d, 0xce, 0x5d, 0x72, 0x5e, 0x24, 0xcc, 0xf2, 0xf8, 0xe8, + 0x6a, 0x70, 0x0a, 0x63, 0x76, 0xf4, 0xfe, 0x7f, 0x9f, 0x3e, 0xfc, 0xfd, + 0xa8, 0x75, 0x5f, 0x7a, 0x19, 0x2d, 0x4e, 0x27, 0x46, 0x7a, 0xfa, 0x6c, + 0xd0, 0xcd, 0x8e, 0xb9, 0x8b, 0x11, 0xf4, 0x8e, 0xb9, 0x18, 0x0a, 0xfe, + 0x06, 0x8f, 0x85, 0x8f, 0x58, 0x6f, 0x4b, 0x92, 0x74, 0xbf, 0xd5, 0xde, + 0x97, 0xd9, 0xdf, 0xd0, 0x1b, 0x01, 0xf6, 0x0a, 0x54, 0x38, 0x2c, 0xcf, + 0x50, 0xf1, 0xc4, 0x7c, 0x32, 0x5c, 0xe1, 0x4c, 0x41, 0x85, 0x2b, 0xa4, + 0x4b, 0x06, 0x29, 0xa4, 0xfb, 0x32, 0x41, 0x8a, 0xc5, 0x71, 0xd1, 0x8d, + 0x38, 0x0f, 0x16, 0x6d, 0x87, 0x48, 0xc4, 0x5e, 0x24, 0xb2, 0x5e, 0x33, + 0x0f, 0x8b, 0x70, 0x5f, 0x02, 0x07, 0xd7, 0xd7, 0x7f, 0x01, 0x4d, 0xe1, + 0xb6, 0x34, 0xbe, 0x7d, 0x00, 0x00}; +z_const size_t kPhoneNumberMetaDataCompressedLength = + sizeof(kPhoneNumberMetaData); z_const size_t kPhoneNumberMetaDataExpandedLength = 32190; -#else // TESTING == 1 +#else // TESTING == 1 z_const Bytef kPhoneNumberMetaData[] = { - 0x1f, 0x8b, 0x08, 0x08, 0x59, 0x5d, 0xf0, 0x59, 0x00, 0x03, 0x50, 0x68, - 0x6f, 0x6e, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4d, 0x65, 0x74, - 0x61, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x00, 0xec, - 0xbd, 0x5b, 0x8f, 0x1c, 0x47, 0x92, 0x2e, 0xf8, 0x57, 0x84, 0x84, 0x1e, - 0x2a, 0x17, 0x99, 0x40, 0xf8, 0xdd, 0x7d, 0x5e, 0x08, 0x89, 0x92, 0x28, - 0x89, 0xa4, 0xa4, 0x16, 0x29, 0x75, 0x4b, 0xc9, 0x7c, 0x18, 0xec, 0x0c, - 0x16, 0x0b, 0x1c, 0x4c, 0x2f, 0x16, 0x73, 0x80, 0x3d, 0xe8, 0xe0, 0xf9, - 0xed, 0xeb, 0x76, 0x71, 0x8f, 0xc8, 0x08, 0xf3, 0xc8, 0xa8, 0xcc, 0xaa, - 0x62, 0x51, 0x55, 0x73, 0x4e, 0x53, 0x95, 0x99, 0xe1, 0x97, 0xf0, 0x8b, - 0xb9, 0xb9, 0xd9, 0x67, 0x9f, 0xfd, 0x6b, 0xf3, 0x7f, 0xfe, 0xf3, 0x7f, - 0xfe, 0xd7, 0x7f, 0xff, 0xbf, 0xff, 0xeb, 0xe5, 0x3f, 0xff, 0xe3, 0x3f, - 0xdf, 0xff, 0xf3, 0xd7, 0xff, 0xfc, 0xbf, 0xfe, 0xef, 0x7f, 0xfe, 0x17, - 0xfc, 0xfd, 0xf6, 0xdf, 0xff, 0x9f, 0xcd, 0xbf, 0xfd, 0x6b, 0xa3, 0x36, - 0xff, 0x76, 0xd8, 0xfc, 0xf6, 0x6e, 0xb3, 0xdb, 0x7c, 0xf5, 0x0a, 0xfe, - 0xf9, 0x01, 0xfe, 0x81, 0x8f, 0x5f, 0x7f, 0x0d, 0xff, 0xbc, 0x85, 0x7f, - 0xe0, 0xe3, 0xcb, 0xaf, 0xf2, 0x3f, 0xdf, 0xc0, 0xc7, 0x6f, 0x7e, 0xce, - 0xff, 0xbc, 0xfa, 0x06, 0xfe, 0xf9, 0x2d, 0xff, 0xf3, 0x23, 0x7c, 0xf7, - 0xfa, 0x27, 0xf8, 0xe7, 0x8f, 0xfc, 0xcf, 0x9b, 0x97, 0xf9, 0x9f, 0xb7, - 0xbf, 0xc0, 0x3f, 0x50, 0xec, 0x97, 0x5f, 0xf3, 0x3f, 0xef, 0xfe, 0x91, - 0xff, 0x79, 0x0f, 0x3f, 0xbc, 0x7f, 0x9f, 0xff, 0xf9, 0x1d, 0xfe, 0xfa, - 0x1d, 0x5a, 0xfb, 0xfd, 0x87, 0xcd, 0x71, 0xb7, 0x09, 0xd0, 0x85, 0x5f, - 0xa1, 0xae, 0xd7, 0x7f, 0xc2, 0x67, 0xdd, 0xc1, 0x17, 0xdf, 0xbe, 0xc2, - 0xbf, 0xf1, 0xc7, 0x3f, 0xbf, 0x82, 0xbf, 0x0d, 0x7e, 0xff, 0xea, 0x57, - 0xfc, 0x1b, 0xfb, 0xfd, 0xd3, 0x1b, 0xfc, 0x5b, 0xc3, 0xdf, 0x5f, 0x7f, - 0x8b, 0x7f, 0x1b, 0xf8, 0xfb, 0x3b, 0x7a, 0xc6, 0x62, 0x3d, 0xef, 0xf0, - 0x6f, 0x0f, 0x7f, 0x7f, 0xff, 0x1b, 0xfe, 0x9d, 0xe0, 0xef, 0x1f, 0xb0, - 0x2b, 0x58, 0xb1, 0xc5, 0x8a, 0x7f, 0xfd, 0x19, 0xff, 0xc6, 0x8a, 0x5f, - 0x7e, 0x8f, 0x7f, 0x63, 0x65, 0x5f, 0xbd, 0xc7, 0xbf, 0xb1, 0xb2, 0x57, - 0x30, 0x28, 0xaf, 0xa0, 0xeb, 0x3f, 0xc0, 0x6b, 0xff, 0x88, 0x6d, 0x5a, - 0x07, 0x3f, 0x7d, 0xf3, 0x1a, 0xff, 0xc6, 0x76, 0xde, 0xd1, 0xf7, 0xd8, - 0xf7, 0x9f, 0x60, 0xb8, 0xde, 0xfd, 0x88, 0x5f, 0x44, 0xf8, 0xe2, 0x17, - 0xec, 0xb4, 0xc5, 0x4e, 0x7c, 0x83, 0x0f, 0x3a, 0x6c, 0xf3, 0x17, 0xfa, - 0x1b, 0x5f, 0xe6, 0xed, 0x3f, 0xf0, 0x6f, 0x6c, 0xff, 0x25, 0x76, 0xda, - 0x61, 0xfb, 0x5f, 0xe1, 0x8b, 0x39, 0x6c, 0xf0, 0x6b, 0xfa, 0x1b, 0x1b, - 0x7c, 0x89, 0x75, 0x3a, 0x6c, 0xf0, 0x25, 0xbe, 0x87, 0xc3, 0xb6, 0x7e, - 0xc7, 0x3a, 0x3d, 0xbe, 0xdf, 0xdb, 0x3f, 0xf0, 0x6f, 0x6c, 0xeb, 0x2b, - 0x18, 0xed, 0x97, 0x30, 0x0f, 0x2f, 0xb1, 0x25, 0x8f, 0xad, 0xfe, 0xf0, - 0x0d, 0xfe, 0x8d, 0xad, 0xfe, 0x82, 0x23, 0xe0, 0xb1, 0xd5, 0x9f, 0x70, - 0x5a, 0x3c, 0xb6, 0xfa, 0x0e, 0xa7, 0xc5, 0x63, 0xab, 0xef, 0xf1, 0x99, - 0x88, 0x35, 0xfe, 0xf8, 0x0b, 0xfe, 0x8d, 0xf5, 0xbc, 0xc6, 0x9e, 0x45, - 0x2c, 0xfb, 0xfb, 0x4f, 0xf8, 0x37, 0xf5, 0x12, 0xff, 0x4e, 0xd8, 0x9b, - 0xf7, 0xf8, 0x4c, 0xc2, 0xb2, 0x3f, 0xd0, 0xf7, 0x58, 0xf6, 0x17, 0x1c, - 0xc6, 0x44, 0x23, 0xff, 0x1d, 0xfe, 0x8d, 0xf5, 0xbc, 0xa1, 0xef, 0xb1, - 0x0f, 0x6f, 0xdf, 0xe2, 0xdf, 0xf8, 0x86, 0x3f, 0x60, 0x3d, 0x5a, 0x61, - 0x45, 0xef, 0xde, 0xd1, 0x07, 0x1a, 0x43, 0x58, 0xb1, 0xdf, 0x7e, 0x4f, - 0xdf, 0x60, 0x7d, 0xdf, 0xd0, 0xf2, 0x52, 0xd4, 0xf9, 0x9f, 0xe8, 0x03, - 0xd6, 0xf2, 0x06, 0xc7, 0x46, 0xd3, 0xca, 0x7b, 0xf5, 0x96, 0x3e, 0x50, - 0x95, 0xf4, 0x98, 0xa6, 0x2a, 0xa9, 0x31, 0x8d, 0xb5, 0xbd, 0x7d, 0x43, - 0x1f, 0x68, 0x61, 0xf0, 0x63, 0xd8, 0xbf, 0x97, 0x3f, 0xd0, 0x07, 0x6c, - 0xe7, 0xeb, 0xef, 0xe8, 0x03, 0x2d, 0x86, 0x6f, 0xe9, 0x03, 0x36, 0xfa, - 0x9e, 0x56, 0xb8, 0xc6, 0x95, 0xf0, 0x35, 0xae, 0x10, 0x4d, 0x6b, 0xfc, - 0xed, 0x6f, 0xf4, 0x01, 0x7b, 0xf0, 0x86, 0x1a, 0xa5, 0x55, 0xfe, 0x8e, - 0x1a, 0xa5, 0x65, 0xfe, 0x8a, 0x5e, 0x8e, 0xd6, 0xf9, 0x4f, 0x54, 0x9b, - 0xc1, 0x1e, 0xbc, 0xff, 0x86, 0x3e, 0xd0, 0xb0, 0x53, 0x0f, 0x0c, 0xad, - 0x0e, 0x7a, 0x39, 0x83, 0x3d, 0x78, 0xf9, 0x3b, 0x7d, 0xc0, 0x1e, 0xbc, - 0xc3, 0x75, 0xae, 0x69, 0x33, 0xbc, 0xfa, 0x1b, 0x7d, 0xc0, 0x1e, 0xbc, - 0xfa, 0x8a, 0x3e, 0x60, 0x0f, 0x5e, 0x52, 0x3b, 0xb4, 0x37, 0x5e, 0x52, - 0x3b, 0xb4, 0x39, 0xbe, 0xfa, 0x99, 0x3e, 0x60, 0x0f, 0x5e, 0xfd, 0x9d, - 0x3e, 0x60, 0x0f, 0x7e, 0xe0, 0x5f, 0xb0, 0x07, 0x5f, 0xbd, 0xa4, 0x0f, - 0xd8, 0x83, 0x77, 0xfc, 0x81, 0x7a, 0x40, 0xb5, 0x39, 0xda, 0x8e, 0x54, - 0x01, 0xed, 0x8d, 0x6f, 0xa9, 0x6f, 0xb4, 0x39, 0xde, 0x51, 0x6d, 0xb4, - 0x3b, 0xbe, 0xa1, 0x71, 0xa3, 0xed, 0xf1, 0x9a, 0x86, 0x97, 0xf6, 0xc7, - 0x7b, 0x9a, 0x6d, 0xda, 0x20, 0xbf, 0x51, 0xaf, 0x69, 0x87, 0x7c, 0x4d, - 0xf3, 0x43, 0x5b, 0xe4, 0x2d, 0x3d, 0x46, 0x7b, 0xe4, 0x4f, 0x1a, 0x1d, - 0xda, 0x24, 0x6f, 0xa9, 0x0c, 0xed, 0x8d, 0x5f, 0xbf, 0xcd, 0xab, 0xe9, - 0x0f, 0xea, 0x06, 0xed, 0x90, 0x3f, 0xa9, 0x83, 0xbc, 0x45, 0x68, 0x88, - 0x68, 0x8f, 0xbc, 0xe5, 0x5f, 0xb0, 0xe5, 0x37, 0xb4, 0x26, 0x3d, 0xb5, - 0xcc, 0xbf, 0xd0, 0xbb, 0x73, 0xcb, 0xf8, 0xee, 0xaf, 0xa9, 0x65, 0xda, - 0x1c, 0xef, 0xbe, 0x07, 0x59, 0x49, 0x55, 0xd2, 0x16, 0xf9, 0x96, 0x16, - 0x41, 0xa2, 0x11, 0xa4, 0x5a, 0x68, 0x03, 0x7c, 0x47, 0xa3, 0x91, 0xb0, - 0x96, 0x57, 0x24, 0x10, 0x69, 0x04, 0x5f, 0xfd, 0x40, 0x1f, 0x48, 0xba, - 0xbc, 0xa7, 0x0f, 0xf8, 0x32, 0x6f, 0x48, 0x0e, 0xd2, 0x08, 0xfe, 0x40, - 0x82, 0x93, 0x46, 0xf0, 0x07, 0x92, 0x96, 0x34, 0x82, 0x5f, 0x71, 0x6d, - 0xf8, 0x1e, 0x6f, 0xb9, 0x02, 0x5a, 0x45, 0x7f, 0xd0, 0x07, 0xea, 0x01, - 0x9e, 0x19, 0xff, 0xa0, 0x6f, 0x68, 0x31, 0xe3, 0xc8, 0x99, 0x80, 0xdd, - 0x78, 0x43, 0x05, 0x03, 0x2d, 0xe6, 0xdf, 0xe9, 0x03, 0x76, 0xe3, 0x5b, - 0x6a, 0x39, 0xd0, 0x76, 0xfa, 0x86, 0x3e, 0xd0, 0x52, 0x7a, 0x4b, 0x1f, - 0x48, 0xd0, 0x51, 0x63, 0x01, 0xbb, 0xf1, 0x15, 0x3f, 0x86, 0xdd, 0x78, - 0xfb, 0x92, 0x3e, 0xd0, 0x70, 0x52, 0x99, 0x88, 0x8d, 0xfe, 0x46, 0x27, - 0x06, 0xc9, 0xa6, 0x5f, 0xe9, 0xa5, 0x48, 0x38, 0xbd, 0xa5, 0x46, 0x23, - 0x56, 0xfd, 0x3d, 0x1d, 0x14, 0x24, 0x9e, 0xde, 0xd1, 0x78, 0x45, 0x9a, - 0x29, 0xae, 0x00, 0xdf, 0xe7, 0x2d, 0xc9, 0x76, 0x12, 0x0f, 0x2f, 0xff, - 0xa4, 0x0f, 0x24, 0x1e, 0xf8, 0x17, 0x7c, 0x85, 0x37, 0x58, 0x81, 0xeb, - 0xf0, 0xb1, 0xef, 0x5e, 0xd3, 0x07, 0x7c, 0xec, 0xeb, 0x3f, 0xe9, 0x03, - 0xf6, 0xe0, 0xd5, 0x7b, 0xfa, 0x80, 0x65, 0xde, 0xfd, 0x4e, 0x1f, 0xf0, - 0xb5, 0xbf, 0xff, 0x89, 0x3e, 0x60, 0xdf, 0x7e, 0xe2, 0xda, 0x68, 0x0f, - 0x93, 0xb0, 0xef, 0xb0, 0x6f, 0xbf, 0x7c, 0x45, 0x1f, 0xe8, 0x38, 0x79, - 0x4b, 0x1f, 0xb0, 0xa3, 0xdf, 0x53, 0xd5, 0xb4, 0x8a, 0x5e, 0xc1, 0x29, - 0xfc, 0xf5, 0x1b, 0x38, 0x8a, 0xbf, 0xa3, 0xaf, 0xa9, 0x2f, 0x74, 0x3e, - 0x90, 0xb8, 0x7d, 0xf5, 0x07, 0x7d, 0xc0, 0xbe, 0x7c, 0xfb, 0x92, 0x3e, - 0x90, 0x44, 0xe3, 0x32, 0xd8, 0x97, 0x5f, 0xf8, 0x31, 0x5a, 0x09, 0x7f, - 0xa3, 0x0f, 0xd8, 0x97, 0x77, 0xd4, 0x31, 0x5a, 0x8b, 0xbf, 0xf1, 0x63, - 0xd8, 0x97, 0x97, 0x7f, 0x87, 0xe6, 0xf1, 0x59, 0x4f, 0x2b, 0xe1, 0xfd, - 0x1b, 0xfa, 0x80, 0x2d, 0xff, 0xf4, 0x1d, 0x7d, 0xc0, 0x96, 0xbf, 0xfe, - 0x89, 0x3e, 0xd0, 0x5e, 0xfa, 0x95, 0x3e, 0x50, 0xcb, 0x74, 0xde, 0xd0, - 0xe4, 0xbf, 0xff, 0x99, 0x3e, 0x50, 0xcb, 0x5f, 0xd3, 0x07, 0x3a, 0xe8, - 0x7e, 0xa3, 0x0f, 0xd8, 0xf2, 0x77, 0x28, 0x13, 0x3c, 0xad, 0x84, 0x5f, - 0xfe, 0x4e, 0x1f, 0xf0, 0xdd, 0xff, 0x4e, 0x8d, 0xd2, 0x4a, 0x78, 0xf9, - 0x9a, 0x3e, 0x60, 0x0f, 0x7e, 0xa2, 0x0a, 0x68, 0x59, 0xfc, 0xfd, 0x1d, - 0x7d, 0xc0, 0x46, 0x5f, 0xff, 0x40, 0x1f, 0x48, 0x80, 0xbf, 0xa4, 0x0f, - 0x24, 0xc0, 0x7f, 0xa7, 0x0f, 0xd8, 0xe8, 0x2f, 0x54, 0x35, 0x9f, 0x6e, - 0x54, 0x35, 0x0d, 0xf8, 0x77, 0x6f, 0xe9, 0x03, 0x2d, 0x3f, 0x3a, 0x33, - 0x69, 0x8d, 0x74, 0x79, 0x75, 0xe0, 0xa7, 0x38, 0xfe, 0x44, 0xbb, 0xf7, - 0x35, 0x1d, 0xa8, 0xb4, 0x61, 0xbf, 0x7f, 0x4d, 0x1f, 0x68, 0xa7, 0xfc, - 0x4c, 0x1f, 0xb0, 0xab, 0xaf, 0xa9, 0x3e, 0xda, 0xa3, 0x6f, 0x70, 0x61, - 0xc4, 0x70, 0x52, 0x79, 0x38, 0xa9, 0x9c, 0x06, 0xe5, 0xeb, 0x6f, 0xe8, - 0x83, 0x3a, 0xf9, 0x49, 0x9f, 0x7c, 0x32, 0x27, 0x9f, 0x68, 0xfc, 0xff, - 0x4e, 0x1f, 0xc6, 0x35, 0x26, 0xd6, 0x2e, 0x7e, 0xa7, 0x0f, 0xb4, 0xcb, - 0xbf, 0xa6, 0x0f, 0x58, 0xe1, 0x8f, 0x3f, 0xd3, 0x07, 0x5a, 0xee, 0x7f, - 0xd0, 0x07, 0x12, 0x36, 0x7f, 0xa3, 0x0f, 0xf4, 0x22, 0x7f, 0xa7, 0x0f, - 0xb4, 0x15, 0xbf, 0xa2, 0x0f, 0x38, 0xe6, 0x7f, 0x7c, 0x4b, 0x1f, 0xb0, - 0xd5, 0x9f, 0xe9, 0xec, 0xa7, 0x57, 0xfc, 0xe5, 0x1d, 0x7d, 0x20, 0x9d, - 0x86, 0x1e, 0xa3, 0xd5, 0xf5, 0xc3, 0x1b, 0xfa, 0x40, 0xab, 0xeb, 0x7b, - 0xfa, 0x80, 0x8d, 0xfe, 0x8d, 0xaa, 0x66, 0xd1, 0xf2, 0x9e, 0x3e, 0xd0, - 0xba, 0x26, 0x35, 0x84, 0x56, 0xd7, 0x4f, 0xbf, 0xd0, 0x87, 0x34, 0x7e, - 0x55, 0x9a, 0xc2, 0xf7, 0x3f, 0xd2, 0x07, 0xac, 0xfb, 0x3d, 0xf5, 0x87, - 0xf6, 0xcc, 0x57, 0x7f, 0xd2, 0x07, 0x3a, 0x01, 0xa9, 0x3f, 0xb4, 0x67, - 0x5e, 0xbf, 0xa2, 0x0f, 0xb4, 0x4d, 0xf2, 0x63, 0x1f, 0x77, 0x45, 0x31, - 0x7f, 0xff, 0xcf, 0xb7, 0xff, 0xf9, 0xdf, 0xff, 0xfe, 0x1f, 0xff, 0xfe, - 0xdf, 0xff, 0x0e, 0xfa, 0x38, 0xad, 0x8c, 0xff, 0xfa, 0x9f, 0xff, 0xe3, - 0x7f, 0xec, 0xe8, 0x5f, 0xfc, 0x67, 0xf3, 0xe1, 0xc3, 0x7f, 0xfc, 0x2b, - 0x7e, 0xdc, 0xec, 0x86, 0xaf, 0xa4, 0x7f, 0x0e, 0xf1, 0x78, 0x1c, 0x17, - 0x5b, 0xf1, 0xcf, 0x61, 0xaf, 0xae, 0x2f, 0xd3, 0xea, 0xde, 0x46, 0x65, - 0xe5, 0xc4, 0xc1, 0x16, 0xfd, 0x24, 0xdd, 0xba, 0xd7, 0x32, 0xb8, 0x28, - 0x76, 0x79, 0xba, 0xd6, 0x14, 0x51, 0xbb, 0x03, 0xb5, 0xb1, 0xb9, 0x81, - 0xa1, 0xb2, 0x1f, 0xb7, 0xe5, 0xbf, 0x59, 0x46, 0x7e, 0xa9, 0xbe, 0xf8, - 0x52, 0x6f, 0x72, 0x95, 0xd3, 0x59, 0x5f, 0xdd, 0x97, 0xd1, 0xe7, 0x07, - 0x7a, 0xfb, 0xab, 0x5a, 0xac, 0x22, 0xef, 0x33, 0x5b, 0xe6, 0x0f, 0x55, - 0xe6, 0x31, 0x6d, 0xa7, 0xb2, 0xcc, 0xe3, 0xf3, 0x32, 0xbf, 0x64, 0x99, - 0x07, 0x51, 0x9a, 0x1f, 0x8c, 0xdb, 0x87, 0xe3, 0xca, 0xc5, 0x9e, 0xee, - 0x60, 0x41, 0xdd, 0xbc, 0xf8, 0xb7, 0xdc, 0xa6, 0x87, 0x26, 0xfb, 0x70, - 0xf0, 0xfb, 0x78, 0xdc, 0x42, 0xeb, 0x41, 0x58, 0x63, 0xa6, 0xe3, 0x55, - 0xf6, 0x17, 0x94, 0xd9, 0x57, 0x6c, 0x80, 0xb0, 0x4a, 0xce, 0x53, 0xb9, - 0xf1, 0x1e, 0x30, 0xbc, 0x07, 0x46, 0xff, 0x2d, 0x7b, 0xe1, 0x8b, 0x2f, - 0xcd, 0x93, 0xdb, 0x0e, 0xa2, 0xd4, 0x57, 0x30, 0x30, 0x4a, 0x9d, 0xdf, - 0x0a, 0x4a, 0x3f, 0xf2, 0xc5, 0xf2, 0x99, 0x94, 0xd9, 0xa8, 0x0e, 0x87, - 0xbc, 0x93, 0xce, 0x98, 0xb2, 0xff, 0x63, 0xbe, 0xca, 0x0c, 0xcb, 0xff, - 0x12, 0xf9, 0xaf, 0x79, 0xcd, 0xbb, 0xe1, 0xbf, 0x4f, 0x78, 0xed, 0xe3, - 0x65, 0x6b, 0xb6, 0xf6, 0x0f, 0xfe, 0x41, 0x0f, 0x82, 0x85, 0xe6, 0x36, - 0xfe, 0x2f, 0xac, 0xad, 0x5f, 0x21, 0xf9, 0xa3, 0x5a, 0x5f, 0x6e, 0xb4, - 0xfa, 0x4f, 0xc5, 0xfe, 0x64, 0xe9, 0xef, 0x0e, 0x38, 0x13, 0x9b, 0xe3, - 0x53, 0xdb, 0x03, 0x5a, 0xdc, 0x03, 0xca, 0xe0, 0xa2, 0xf4, 0xbb, 0x35, - 0x87, 0x40, 0xd8, 0xc5, 0x5d, 0xda, 0xa9, 0x2e, 0x3f, 0xbc, 0xbb, 0x8b, - 0x03, 0x61, 0x63, 0xb2, 0x76, 0xa4, 0x69, 0xb2, 0x7a, 0x13, 0x48, 0x70, - 0xf5, 0x16, 0xbe, 0xec, 0x03, 0xcf, 0xe1, 0x96, 0xd4, 0x58, 0x41, 0x5b, - 0xb2, 0x1a, 0x76, 0xcd, 0xe6, 0xb4, 0x83, 0xd0, 0xbd, 0x47, 0xbe, 0xb8, - 0xaf, 0x3e, 0x41, 0xf2, 0xf8, 0xc0, 0xc0, 0x75, 0x87, 0xce, 0xd8, 0x70, - 0xec, 0x61, 0x0e, 0x0f, 0x9d, 0x32, 0xe9, 0xd8, 0xeb, 0xfc, 0x95, 0x3b, - 0xf6, 0x16, 0x3e, 0x3a, 0x1f, 0x8f, 0xbd, 0x3f, 0x74, 0xd6, 0xe5, 0x1f, - 0xc2, 0xa1, 0xf3, 0xc7, 0x3e, 0x1e, 0x14, 0x08, 0x99, 0x63, 0x9f, 0xf2, - 0xc7, 0x98, 0x8e, 0x3c, 0xb6, 0xbd, 0xc7, 0x7d, 0x92, 0x47, 0xee, 0xe3, - 0xb6, 0x87, 0x9a, 0xad, 0xeb, 0x13, 0x0f, 0x7f, 0x53, 0x57, 0x4d, 0xc3, - 0x61, 0x35, 0x9c, 0x55, 0x51, 0x5f, 0xb4, 0x61, 0xeb, 0x71, 0x65, 0x65, - 0x55, 0x2d, 0xef, 0x59, 0x73, 0xd0, 0x06, 0x36, 0xed, 0xae, 0x71, 0xca, - 0xd5, 0x5b, 0x4e, 0x7e, 0x56, 0xf9, 0x3e, 0x2f, 0x8e, 0xd6, 0xc3, 0xc2, - 0xd5, 0xa8, 0xb4, 0x61, 0x0f, 0x2e, 0xcc, 0x1a, 0x31, 0x2b, 0xca, 0xc5, - 0x56, 0x63, 0xba, 0x59, 0x48, 0xb5, 0x8a, 0x98, 0x5d, 0xbb, 0x25, 0xe5, - 0x9b, 0x6f, 0xb5, 0x6b, 0x1c, 0xf5, 0x3c, 0x1e, 0xe9, 0x2f, 0x21, 0xf0, - 0x60, 0xa8, 0x61, 0x8e, 0x9a, 0xab, 0xd2, 0x46, 0x57, 0xee, 0x50, 0xe3, - 0x1a, 0x54, 0x11, 0x82, 0x46, 0x12, 0x82, 0x4e, 0x51, 0x7d, 0x79, 0xe5, - 0xf3, 0x84, 0xbf, 0x38, 0xaf, 0x11, 0xdc, 0x89, 0x00, 0x7c, 0x2e, 0x83, - 0xc3, 0x0f, 0xc2, 0xac, 0xa3, 0xb5, 0x3b, 0x9a, 0x03, 0x14, 0x6c, 0x1d, - 0xa9, 0x4c, 0xdb, 0xf9, 0x5c, 0x3b, 0xd5, 0x91, 0x08, 0x1a, 0x89, 0x1f, - 0xb3, 0xa6, 0x07, 0xea, 0x56, 0xd7, 0xc4, 0xbc, 0x7f, 0x72, 0x4b, 0x2d, - 0xa1, 0xb0, 0x5c, 0xf8, 0x8b, 0x2f, 0x6d, 0xa3, 0xbc, 0x3d, 0x2b, 0x54, - 0x9c, 0x82, 0xd7, 0xff, 0x4b, 0xec, 0xda, 0xb5, 0xa5, 0xab, 0x83, 0x63, - 0xb6, 0x43, 0x57, 0xdf, 0x52, 0x3f, 0xa3, 0x75, 0xff, 0x97, 0x28, 0x53, - 0x36, 0xde, 0x25, 0x77, 0xd4, 0xe9, 0xde, 0x79, 0x8c, 0x77, 0xd4, 0xe6, - 0xca, 0xdb, 0x0c, 0x57, 0x75, 0x70, 0x50, 0x5d, 0xbb, 0xee, 0xc9, 0xdb, - 0x25, 0xae, 0xfb, 0xf4, 0x20, 0xd7, 0xd3, 0x87, 0x2a, 0xd3, 0x7a, 0xa5, - 0xcd, 0x58, 0x9b, 0x7c, 0xcc, 0xef, 0x42, 0x2b, 0x3e, 0xcf, 0xd7, 0xed, - 0x57, 0xfc, 0xa2, 0xc8, 0x7f, 0x14, 0xcb, 0xfd, 0x61, 0x5a, 0xcc, 0x83, - 0xf8, 0xd5, 0x4b, 0xf1, 0x36, 0x6a, 0xd1, 0x4e, 0x0e, 0x57, 0x92, 0x7c, - 0x83, 0x71, 0xf9, 0x86, 0x42, 0x72, 0xe1, 0xec, 0x06, 0x70, 0x3b, 0x3f, - 0x59, 0x66, 0xfe, 0xa0, 0xf7, 0x96, 0x2d, 0x2e, 0x46, 0xb2, 0xb8, 0xe8, - 0x98, 0x97, 0xda, 0x49, 0x1d, 0x93, 0x1a, 0x6c, 0xeb, 0xe2, 0x69, 0x41, - 0xed, 0x58, 0x2a, 0xfa, 0xe8, 0xd6, 0xec, 0x83, 0xed, 0x8d, 0x3c, 0xad, - 0x3b, 0x6d, 0x03, 0x6c, 0x92, 0x73, 0x73, 0x36, 0xad, 0xe0, 0x53, 0x2e, - 0xfb, 0xcd, 0xf2, 0x6a, 0xdb, 0x38, 0xab, 0x3b, 0xa5, 0x4e, 0xa6, 0xdc, - 0xdf, 0xc5, 0x26, 0xf8, 0x46, 0x36, 0xc9, 0xd0, 0x26, 0x70, 0xbb, 0x98, - 0xb7, 0x81, 0x09, 0xfb, 0xd5, 0xbb, 0xc0, 0x83, 0x79, 0x66, 0xfa, 0x66, - 0xf9, 0xba, 0xdf, 0x7a, 0xad, 0x40, 0xea, 0xf3, 0xf4, 0xb5, 0x26, 0xde, - 0x2b, 0x03, 0x9e, 0x2b, 0x0f, 0x6e, 0xac, 0x6e, 0x0f, 0xa6, 0x83, 0x8e, - 0xaf, 0x9d, 0x6d, 0xc3, 0x8c, 0x50, 0xed, 0xac, 0x5f, 0x2a, 0x76, 0x87, - 0x4e, 0x1f, 0x5b, 0x75, 0xe4, 0x9f, 0xbb, 0x99, 0x75, 0x27, 0x4e, 0xdf, - 0x4d, 0xb5, 0xa7, 0x2c, 0x9d, 0x7d, 0xb7, 0x47, 0xb8, 0x7b, 0xbe, 0xd9, - 0xec, 0x4c, 0xf0, 0xab, 0x77, 0x4f, 0x4b, 0x9b, 0x1a, 0xdb, 0x42, 0xf2, - 0x25, 0x02, 0x56, 0x10, 0x18, 0x82, 0xf2, 0xec, 0x2d, 0x5c, 0x43, 0x4e, - 0x0c, 0x28, 0x31, 0x77, 0xa0, 0x4c, 0xd1, 0x8a, 0xab, 0xcf, 0xe4, 0xea, - 0x02, 0x48, 0xac, 0xbb, 0xbf, 0xb7, 0xe0, 0x9a, 0x58, 0x5a, 0x2f, 0xf0, - 0x7f, 0x4b, 0xeb, 0xe5, 0xba, 0xe6, 0x6f, 0xb3, 0xaf, 0xbf, 0x15, 0xf7, - 0xb5, 0xde, 0x07, 0x5a, 0xaf, 0x01, 0x76, 0x36, 0xbf, 0x8c, 0xde, 0xad, - 0xd0, 0xef, 0xf2, 0xf1, 0xb6, 0x5b, 0xb2, 0xbd, 0x6e, 0xe8, 0xb0, 0x4b, - 0xc7, 0xfc, 0x5f, 0xda, 0xee, 0x5e, 0x18, 0x23, 0x5d, 0x7c, 0x0c, 0xa7, - 0x63, 0xb4, 0x3b, 0x84, 0xe9, 0x85, 0x3c, 0x4f, 0xbb, 0xdd, 0xfb, 0xd8, - 0x34, 0xb3, 0xb8, 0x4e, 0x32, 0xb2, 0x4c, 0xb7, 0xb8, 0xa5, 0x37, 0xf4, - 0xcb, 0xef, 0xba, 0xe1, 0x9d, 0xee, 0xfc, 0xa9, 0xe2, 0xb7, 0x49, 0x5d, - 0x95, 0x10, 0xe2, 0x06, 0xef, 0xba, 0x15, 0x7d, 0x08, 0x50, 0x89, 0x6b, - 0x4b, 0xc0, 0xae, 0xd8, 0x10, 0x16, 0x2a, 0xb9, 0xe7, 0x4d, 0xff, 0x2d, - 0x68, 0x93, 0x8a, 0x36, 0xfd, 0xe6, 0x64, 0x01, 0x6f, 0xe6, 0x62, 0xa0, - 0x6e, 0xf9, 0x32, 0xe3, 0xa7, 0x7b, 0x71, 0x6e, 0x46, 0x38, 0x59, 0x19, - 0x68, 0x29, 0xf9, 0x52, 0x6d, 0x86, 0x0d, 0xed, 0x66, 0xee, 0x12, 0xc1, - 0x12, 0x31, 0x2f, 0x76, 0xb0, 0xb9, 0xca, 0xae, 0xdb, 0x0e, 0x5a, 0xad, - 0xe0, 0x65, 0xc1, 0x67, 0xa0, 0xec, 0x69, 0xd1, 0xbc, 0xae, 0xb8, 0x24, - 0x2e, 0x88, 0x13, 0xc1, 0xe3, 0xbb, 0x3e, 0x96, 0x12, 0x8f, 0x41, 0x1f, - 0xce, 0x1d, 0xea, 0x0e, 0xba, 0xbd, 0x7e, 0xf2, 0xcf, 0x5a, 0x5e, 0x3f, - 0x57, 0xcb, 0x90, 0xef, 0x5a, 0x32, 0x64, 0xbd, 0xcf, 0x72, 0xbe, 0xb3, - 0xe1, 0x14, 0xcf, 0xaf, 0x43, 0x27, 0xf9, 0xc1, 0x58, 0xf8, 0xcb, 0xd2, - 0xe1, 0xe0, 0x8e, 0xdb, 0x5c, 0x7b, 0x6a, 0x4b, 0x8f, 0xea, 0x99, 0x9e, - 0xb5, 0x34, 0x6d, 0x25, 0xa0, 0xb2, 0xa0, 0x2c, 0xd5, 0xd6, 0xeb, 0x43, - 0x56, 0xad, 0x7a, 0xd3, 0x6d, 0x5b, 0x55, 0x87, 0x67, 0xdc, 0xcb, 0x44, - 0x26, 0x7c, 0x97, 0x65, 0x82, 0xb9, 0x40, 0x24, 0xe0, 0xe2, 0x58, 0x21, - 0x12, 0xc2, 0x20, 0x0a, 0x1e, 0xc3, 0x36, 0x7b, 0x98, 0x16, 0x8f, 0x18, - 0x68, 0x27, 0xee, 0xaa, 0xa2, 0xfc, 0xaf, 0x38, 0x8b, 0x55, 0x27, 0xec, - 0x2b, 0xed, 0x23, 0xb8, 0xcd, 0xf2, 0xff, 0x60, 0x2b, 0x99, 0xbc, 0xb9, - 0xa2, 0xdd, 0xf6, 0x0e, 0x3e, 0xe8, 0x63, 0x53, 0x51, 0xce, 0xa5, 0xac, - 0x9f, 0xa9, 0xb9, 0xf2, 0x9e, 0xe2, 0x16, 0xbc, 0xed, 0x61, 0x77, 0xa9, - 0x83, 0x01, 0xa5, 0x0e, 0x5c, 0xa7, 0xbd, 0x39, 0xe8, 0x7c, 0x6d, 0xee, - 0xe1, 0x97, 0xdc, 0x1c, 0xb8, 0xf5, 0xfa, 0x98, 0x0f, 0x4e, 0x38, 0xbf, - 0xdb, 0x3a, 0x3a, 0x36, 0x6d, 0xd7, 0x35, 0x1d, 0xd1, 0x3c, 0xdf, 0x1b, - 0xd3, 0x5b, 0xdb, 0x3b, 0xd7, 0x7b, 0xdf, 0x87, 0xd0, 0xc7, 0xb8, 0x2c, - 0x2f, 0x62, 0x11, 0x8d, 0xd2, 0xb9, 0xbe, 0x54, 0x30, 0x35, 0x0a, 0x5e, - 0xb2, 0xb0, 0x36, 0x8e, 0xfa, 0xae, 0x35, 0x77, 0x7f, 0x5d, 0xdf, 0x5d, - 0xd1, 0x2d, 0x26, 0x78, 0x0c, 0x1c, 0xb6, 0x3c, 0xb8, 0xaa, 0x79, 0x6f, - 0xc1, 0x07, 0x16, 0xa6, 0x14, 0x43, 0x3d, 0xe1, 0xb0, 0x87, 0xeb, 0xe4, - 0xe6, 0xe4, 0x4a, 0x79, 0xfa, 0x69, 0x5a, 0x78, 0xd2, 0x46, 0x77, 0xf0, - 0x69, 0xb1, 0x13, 0x9d, 0x6f, 0x77, 0xa2, 0x3e, 0xb5, 0xf9, 0x7c, 0x36, - 0xee, 0x0f, 0xf7, 0xb5, 0x71, 0x2d, 0xed, 0xda, 0xac, 0x52, 0xf7, 0x09, - 0x2e, 0xcb, 0x0b, 0x5b, 0xc6, 0x5a, 0x3f, 0x3b, 0xec, 0x5b, 0xbb, 0x15, - 0x41, 0x0c, 0xc6, 0xf5, 0x36, 0xf8, 0x1e, 0x16, 0xa1, 0x39, 0xf8, 0x3d, - 0xee, 0x4c, 0x95, 0x0f, 0xdc, 0x2d, 0x6e, 0x62, 0x9d, 0xfa, 0xa0, 0x97, - 0xb6, 0xa8, 0xcd, 0x15, 0x3c, 0x6f, 0xd1, 0xdb, 0x6d, 0xd1, 0xd5, 0x5d, - 0xc0, 0x78, 0xeb, 0xeb, 0x76, 0xe2, 0xed, 0x56, 0x3f, 0xc6, 0x2b, 0x7e, - 0x3e, 0x1b, 0xee, 0x4d, 0x43, 0xff, 0xac, 0xde, 0x77, 0x42, 0x8d, 0xc0, - 0x4d, 0x96, 0xac, 0x55, 0xf9, 0x9b, 0xb4, 0xda, 0x50, 0x85, 0xb7, 0xd9, - 0xe3, 0xdc, 0xe8, 0x8a, 0x0a, 0xaa, 0x71, 0xf1, 0x08, 0x7f, 0x28, 0x4f, - 0x0b, 0x00, 0x17, 0x42, 0x0f, 0x6d, 0x1f, 0xcb, 0x9a, 0xd8, 0x22, 0x4a, - 0x08, 0xbb, 0xb3, 0x4f, 0xf5, 0x5b, 0xea, 0xd2, 0x92, 0x6d, 0xaa, 0x79, - 0x07, 0xc6, 0x2b, 0xf6, 0x54, 0xf9, 0x87, 0x26, 0xe0, 0x40, 0xa5, 0x0e, - 0x84, 0xfc, 0x1f, 0x7f, 0x6c, 0x6a, 0xb1, 0xde, 0x97, 0x3d, 0x31, 0xae, - 0x7b, 0x7a, 0x21, 0x5d, 0xb0, 0x61, 0x48, 0x26, 0xaf, 0x69, 0x97, 0x60, - 0x67, 0x2a, 0xde, 0x16, 0x5a, 0xde, 0x99, 0x53, 0xe3, 0xf4, 0xd4, 0xa4, - 0x17, 0xbb, 0xb8, 0x58, 0x45, 0xfe, 0xfd, 0x5c, 0x15, 0x61, 0x24, 0x1f, - 0xa4, 0x37, 0x09, 0x2c, 0x1f, 0xee, 0xc4, 0x1a, 0x03, 0x4b, 0x71, 0x67, - 0x9c, 0xbb, 0xad, 0x3a, 0x6c, 0xcf, 0xe9, 0xc1, 0x16, 0xd4, 0x25, 0xe1, - 0x4e, 0xec, 0x57, 0xe8, 0xd0, 0x7e, 0x5e, 0xec, 0x04, 0xc3, 0xd3, 0xb4, - 0x8d, 0xd1, 0xea, 0xc6, 0xb5, 0xdc, 0xdb, 0x03, 0x2c, 0x5e, 0xb9, 0xa6, - 0x5a, 0xc3, 0x6e, 0x02, 0x6e, 0x82, 0x0a, 0x8e, 0xb4, 0x35, 0xfa, 0x43, - 0x20, 0x65, 0x0f, 0x3f, 0x3d, 0x51, 0x8d, 0xfe, 0xad, 0x6c, 0x43, 0xe7, - 0xd5, 0x29, 0x58, 0xaf, 0xa6, 0x15, 0xf1, 0xee, 0x9f, 0x0b, 0x22, 0x85, - 0xda, 0x3b, 0xde, 0x60, 0xe1, 0xb4, 0x46, 0x4b, 0x4a, 0xbe, 0xc7, 0xe6, - 0xba, 0x23, 0xcc, 0x5d, 0x16, 0x06, 0x79, 0xf4, 0x1d, 0xde, 0xa6, 0xf2, - 0x0d, 0x5a, 0x95, 0xe3, 0x3d, 0xe4, 0xe3, 0xdd, 0x80, 0x3e, 0xa1, 0xf3, - 0xe1, 0x0f, 0x4b, 0xa9, 0x65, 0x3c, 0x28, 0x70, 0xef, 0xf9, 0x12, 0x16, - 0xbb, 0x63, 0x0f, 0xca, 0x58, 0x68, 0xd1, 0xd1, 0xf9, 0x98, 0xd5, 0x15, - 0x68, 0xb3, 0x7d, 0xab, 0x0e, 0xe2, 0xd9, 0x1e, 0x0b, 0xd2, 0xa6, 0x6d, - 0x89, 0x9b, 0x69, 0x03, 0xb0, 0xc2, 0x96, 0x0c, 0x71, 0x52, 0xa9, 0xd8, - 0xa1, 0xaa, 0xd3, 0x6e, 0x4b, 0x09, 0xa5, 0x2e, 0x59, 0x6a, 0x1b, 0xdf, - 0xe1, 0xf4, 0x74, 0x01, 0x6d, 0x1a, 0x74, 0x07, 0x86, 0x5d, 0x01, 0x26, - 0x8d, 0x96, 0x84, 0xf2, 0x9d, 0xc6, 0xe1, 0xd9, 0xd0, 0x12, 0xda, 0x99, - 0x60, 0x6f, 0x2b, 0x5f, 0xc6, 0xfb, 0xdd, 0x4f, 0xec, 0xe7, 0x79, 0xe6, - 0xa1, 0xe6, 0x9b, 0xbc, 0x1f, 0xb7, 0x0d, 0x11, 0x31, 0x29, 0x52, 0x66, - 0xf7, 0x00, 0xe1, 0x49, 0xc3, 0xec, 0x2e, 0x0b, 0x87, 0xb9, 0x68, 0x38, - 0xb6, 0x9a, 0x35, 0x13, 0x40, 0xe2, 0x5c, 0x32, 0xe5, 0x26, 0x29, 0xea, - 0xe0, 0x8b, 0xa7, 0x27, 0x44, 0x7e, 0x96, 0x95, 0x9d, 0x74, 0x61, 0x7c, - 0xc0, 0x06, 0x2e, 0xe6, 0xa8, 0x9f, 0xb0, 0x06, 0xd3, 0xa3, 0x16, 0xe3, - 0xcb, 0x76, 0x95, 0x36, 0x84, 0xd6, 0x0d, 0x5d, 0x1c, 0xb6, 0x51, 0x53, - 0x98, 0x6d, 0x92, 0x36, 0x77, 0xa5, 0x89, 0xff, 0x25, 0xca, 0xc0, 0x5c, - 0xee, 0xb4, 0xb5, 0x57, 0x3b, 0xd1, 0x9e, 0x43, 0xc6, 0xbe, 0xfa, 0x55, - 0x8c, 0x18, 0x53, 0xac, 0xf6, 0x67, 0x69, 0xc3, 0x2e, 0xa2, 0xc4, 0x9a, - 0xbf, 0x14, 0xd4, 0x34, 0xad, 0x1b, 0x1d, 0x58, 0x47, 0xbe, 0x02, 0x4c, - 0x7d, 0xc2, 0xa5, 0x6a, 0x90, 0xe7, 0xfc, 0x3f, 0x40, 0xb2, 0xb3, 0x15, - 0x59, 0x19, 0x70, 0xa0, 0xe5, 0x93, 0x57, 0x65, 0xb5, 0x0d, 0x0e, 0x5e, - 0xeb, 0xe8, 0xe4, 0xd5, 0x16, 0x4e, 0xe4, 0x80, 0xe7, 0x0d, 0x1c, 0xc1, - 0x06, 0x7e, 0xcf, 0xfb, 0x46, 0x7b, 0x3c, 0x8b, 0xf1, 0x28, 0x07, 0x2c, - 0x08, 0xc2, 0xe3, 0xf7, 0x74, 0x86, 0x1b, 0xb4, 0x80, 0x5b, 0xd4, 0xed, - 0xa9, 0x36, 0xfc, 0xa2, 0x23, 0xc8, 0x08, 0x5d, 0x2f, 0xc2, 0x01, 0x9f, - 0x4a, 0xf8, 0x85, 0xe7, 0xce, 0x10, 0x44, 0x25, 0x57, 0x05, 0x2e, 0x32, - 0x28, 0xa8, 0x1c, 0xc4, 0x74, 0xf6, 0x11, 0x8e, 0xd5, 0x3e, 0xd1, 0x53, - 0xda, 0x06, 0x32, 0x4c, 0xa0, 0xba, 0x40, 0xf5, 0x1b, 0x34, 0xb4, 0xa3, - 0x12, 0xb1, 0xa5, 0x5e, 0x61, 0xf4, 0x03, 0xea, 0x70, 0x9e, 0x8e, 0x2c, - 0xed, 0xc0, 0x00, 0x41, 0x57, 0x1b, 0xf2, 0xdb, 0xf7, 0x1d, 0xd6, 0x86, - 0xca, 0x9e, 0xda, 0x1b, 0xf4, 0x44, 0x80, 0xee, 0x61, 0x49, 0xe9, 0xe8, - 0xf0, 0x62, 0x02, 0xaf, 0x6a, 0x3c, 0x16, 0x75, 0x78, 0x6f, 0x32, 0xb1, - 0x0c, 0x59, 0x1e, 0x23, 0x1a, 0xb1, 0xc4, 0x8d, 0xd3, 0x38, 0xe5, 0x2e, - 0xc0, 0x47, 0x4b, 0x51, 0xa9, 0xd8, 0x67, 0x4b, 0x06, 0xa5, 0x5e, 0x41, - 0x8c, 0x40, 0xc4, 0xb1, 0x52, 0x68, 0x64, 0xcc, 0x6f, 0x00, 0x95, 0xe4, - 0x17, 0xe5, 0x61, 0xc6, 0x3b, 0x20, 0x1e, 0xb0, 0xd8, 0xb1, 0xfc, 0xea, - 0x3c, 0x34, 0x2e, 0xd4, 0x76, 0xf1, 0x14, 0xb3, 0x3c, 0x15, 0x1e, 0xbb, - 0x1e, 0x4a, 0x57, 0x2d, 0xbc, 0xbf, 0x0f, 0x5d, 0xd1, 0x8d, 0x24, 0xe5, - 0x45, 0x0d, 0x70, 0xb0, 0xd3, 0xd5, 0xd3, 0x58, 0x3a, 0x3e, 0x38, 0xbe, - 0x95, 0xc2, 0x0c, 0x28, 0x55, 0xaf, 0x27, 0x61, 0x58, 0x4d, 0xb8, 0x94, - 0xf2, 0xeb, 0xc0, 0x1c, 0xf7, 0x36, 0xc1, 0xf0, 0xe1, 0x74, 0xe6, 0xa9, - 0x83, 0x7e, 0xd9, 0x80, 0x2f, 0x83, 0x13, 0xe3, 0xa1, 0xef, 0xa8, 0xa9, - 0xc3, 0x7b, 0x1b, 0x0c, 0xa4, 0xd0, 0x96, 0xc2, 0x28, 0x58, 0xe5, 0xc6, - 0xb7, 0xdd, 0x8e, 0x8d, 0x14, 0x3d, 0x29, 0x1b, 0xf5, 0x1b, 0x27, 0xa1, - 0x96, 0x93, 0xfc, 0x66, 0xf4, 0x7a, 0xd2, 0x9b, 0xb1, 0xbe, 0x26, 0xc9, - 0xfe, 0xea, 0x39, 0x0d, 0xd3, 0x41, 0x9a, 0x2a, 0x48, 0x10, 0x05, 0x12, - 0xda, 0x87, 0x88, 0x5f, 0x57, 0xd1, 0x23, 0x14, 0xf6, 0xbf, 0x6e, 0x76, - 0xae, 0xa1, 0xb9, 0xbd, 0xc8, 0x13, 0x79, 0xa3, 0x54, 0x5f, 0x24, 0x49, - 0xa7, 0x09, 0x51, 0x7e, 0x9d, 0x24, 0x81, 0x5a, 0x56, 0x4b, 0x13, 0x2c, - 0x55, 0x24, 0x89, 0xc3, 0xc0, 0x9b, 0x41, 0x90, 0xf8, 0x63, 0x15, 0x22, - 0x16, 0xe3, 0xc2, 0x5f, 0x8c, 0x85, 0x09, 0xae, 0x63, 0x50, 0xa1, 0x0d, - 0xec, 0xfc, 0xc1, 0xd6, 0xaf, 0xe8, 0xf9, 0x4e, 0xc3, 0x26, 0x7d, 0x81, - 0x2d, 0x0d, 0x72, 0xa5, 0x0f, 0xb9, 0x77, 0x11, 0xd4, 0xc0, 0x17, 0x73, - 0x11, 0x73, 0x2a, 0x5f, 0xba, 0xb2, 0x7d, 0x7b, 0x34, 0x7d, 0x9a, 0x83, - 0xc3, 0x1e, 0x14, 0xd1, 0xe2, 0x0e, 0x08, 0x00, 0x78, 0x51, 0x65, 0x4c, - 0x80, 0x41, 0x38, 0x62, 0xe5, 0xb9, 0xb6, 0x17, 0xa8, 0x9e, 0x1a, 0x8c, - 0x66, 0x47, 0x99, 0xa3, 0xaa, 0xb0, 0x81, 0x40, 0x9d, 0x80, 0x35, 0xe5, - 0x41, 0xf4, 0x33, 0xb9, 0x03, 0x35, 0x64, 0xc5, 0xfc, 0xc5, 0xb6, 0xec, - 0x28, 0x1c, 0x0d, 0xd8, 0x54, 0x83, 0xe0, 0x51, 0xae, 0x4a, 0x1d, 0x8b, - 0x33, 0x36, 0x97, 0x3d, 0xd0, 0x99, 0x2a, 0x78, 0x8e, 0x55, 0xe2, 0x18, - 0x7a, 0xc5, 0x17, 0x55, 0xf4, 0xc0, 0x7b, 0xd0, 0x6b, 0x54, 0x11, 0x94, - 0xe7, 0x82, 0x46, 0x3b, 0xf2, 0x3b, 0x17, 0x99, 0xb4, 0x7d, 0xa1, 0x1c, - 0x44, 0x7e, 0x6c, 0xd2, 0x97, 0xa7, 0x58, 0xaf, 0xb1, 0xeb, 0x5a, 0xba, - 0xe5, 0x17, 0xf3, 0xc0, 0xfe, 0x4b, 0xbd, 0x2f, 0x11, 0x86, 0x92, 0xb3, - 0x7d, 0x5c, 0x76, 0x54, 0x86, 0x7d, 0x72, 0xa4, 0xec, 0x37, 0x75, 0xfd, - 0xd5, 0x05, 0xa6, 0x98, 0x9e, 0xc5, 0x02, 0x69, 0x9b, 0xb7, 0x88, 0x88, - 0x4b, 0xd5, 0x5f, 0xe4, 0x21, 0xfd, 0xd2, 0xec, 0x29, 0x84, 0x21, 0x8b, - 0xad, 0xf9, 0xfb, 0x24, 0x39, 0x06, 0x42, 0xae, 0xa0, 0x5e, 0xa1, 0xd1, - 0x19, 0x8c, 0x27, 0x2b, 0x3c, 0x96, 0xce, 0x4b, 0x67, 0x51, 0x38, 0xef, - 0x4f, 0x84, 0xb3, 0x20, 0x98, 0xc7, 0x75, 0xd3, 0x7a, 0xa7, 0xe3, 0x0c, - 0x16, 0x14, 0x6f, 0xe5, 0xfa, 0x15, 0xed, 0xd3, 0x34, 0xde, 0x9a, 0x60, - 0x1c, 0x72, 0x78, 0xb8, 0xd1, 0x99, 0x0e, 0x5b, 0xd0, 0xa2, 0x8b, 0x8d, - 0xca, 0xe4, 0x25, 0x68, 0xeb, 0x39, 0xee, 0xe9, 0xc8, 0xa6, 0x8d, 0x84, - 0x3b, 0xfa, 0x90, 0x7b, 0x67, 0xcb, 0xd6, 0x30, 0xb4, 0xd7, 0xd8, 0x35, - 0x67, 0xf1, 0xf0, 0xad, 0x3d, 0x2e, 0x4b, 0xd8, 0xd8, 0x5c, 0x28, 0xf7, - 0xfc, 0x90, 0x97, 0xfd, 0xf6, 0xd3, 0x75, 0x1f, 0x0c, 0x0d, 0x79, 0x58, - 0x3b, 0x65, 0xf9, 0xdc, 0x86, 0x4a, 0xae, 0x7f, 0x9b, 0xd6, 0xda, 0xb1, - 0x93, 0x6b, 0xa9, 0xbc, 0x76, 0xca, 0xc5, 0xf6, 0xb4, 0x8a, 0xc6, 0xc2, - 0x05, 0x65, 0x7d, 0x5f, 0x63, 0xec, 0xa8, 0x10, 0x6d, 0x64, 0xb5, 0x0c, - 0x64, 0x9b, 0x97, 0xbf, 0x8f, 0x85, 0x99, 0x9b, 0xf8, 0x4c, 0xd7, 0xe4, - 0xa7, 0xe8, 0xf9, 0xbd, 0x2c, 0xc7, 0xc5, 0x55, 0xd1, 0x58, 0x91, 0xa3, - 0x55, 0x31, 0x5e, 0x8d, 0xad, 0x85, 0x85, 0x45, 0x70, 0x09, 0xa2, 0x11, - 0xb1, 0x67, 0xf9, 0x49, 0x96, 0x95, 0x3b, 0x3b, 0x50, 0xda, 0xd2, 0x9b, - 0x6f, 0xac, 0x63, 0xe9, 0xbd, 0x56, 0x6e, 0x4f, 0x8a, 0x3e, 0xcb, 0xed, - 0x27, 0x2d, 0xb7, 0xd7, 0x4a, 0xec, 0xc9, 0xaa, 0x99, 0x46, 0x6b, 0x3f, - 0xcb, 0xea, 0x67, 0x59, 0xfd, 0x58, 0x64, 0xf5, 0x1d, 0x5a, 0xd3, 0x36, - 0x51, 0xb5, 0x6f, 0xe7, 0x6a, 0xdd, 0xed, 0xfc, 0xc2, 0x2a, 0xc4, 0xfe, - 0xac, 0x7d, 0x9b, 0x23, 0x32, 0xcd, 0x4b, 0x36, 0x6f, 0xe7, 0xaf, 0x44, - 0xd4, 0x00, 0xb0, 0x0c, 0x56, 0x9e, 0x1e, 0xd0, 0x28, 0xd5, 0x5d, 0x95, - 0x16, 0x1c, 0x32, 0xb9, 0x98, 0x9e, 0x39, 0x8d, 0xa9, 0x1d, 0xa1, 0x09, - 0x5e, 0xdb, 0x70, 0x75, 0x87, 0x3b, 0x63, 0xd0, 0x04, 0xa9, 0x31, 0x78, - 0x5d, 0x0c, 0x5d, 0x1b, 0x00, 0x90, 0xcb, 0x06, 0x63, 0x9e, 0x51, 0x35, - 0xf7, 0x86, 0xaa, 0x79, 0xf7, 0xc0, 0xa8, 0x9a, 0x3c, 0xa1, 0x9f, 0x11, - 0xaa, 0xe6, 0xfd, 0xa2, 0xb7, 0xda, 0xec, 0x94, 0x80, 0xc8, 0x98, 0xd6, - 0x65, 0x77, 0xf3, 0x78, 0x90, 0x5d, 0x5e, 0xf7, 0xbb, 0x83, 0x99, 0x1a, - 0xd4, 0x6b, 0xa5, 0xc5, 0x08, 0x5a, 0x4d, 0x57, 0x64, 0xb2, 0x02, 0xb3, - 0x34, 0x9b, 0xbe, 0xc0, 0x58, 0xc3, 0xb6, 0xaf, 0x48, 0x16, 0x16, 0x34, - 0x04, 0xc1, 0xb1, 0xe9, 0x62, 0x35, 0xa3, 0xe3, 0x8f, 0x60, 0xe2, 0x41, - 0x53, 0x8d, 0x25, 0x6f, 0x25, 0x1c, 0xa0, 0x21, 0xb2, 0xd0, 0xc7, 0xc2, - 0x06, 0xd1, 0xa7, 0xc4, 0xe4, 0xc3, 0x65, 0xf2, 0xf6, 0x31, 0x50, 0x3b, - 0x38, 0x0d, 0xc0, 0x08, 0x04, 0x26, 0x37, 0x3e, 0x17, 0x74, 0x5f, 0x1e, - 0x3a, 0x60, 0x6f, 0x2c, 0x1c, 0xd5, 0x58, 0x2d, 0x5a, 0x73, 0x72, 0xbd, - 0x06, 0x9e, 0x05, 0xb1, 0xa2, 0x0c, 0x3e, 0x6b, 0xe9, 0xa9, 0x7c, 0x7e, - 0xd3, 0x5b, 0xa0, 0x10, 0xf0, 0x2c, 0x04, 0x6a, 0x65, 0x9a, 0x0d, 0x48, - 0x36, 0xe0, 0x43, 0xc4, 0x87, 0xa3, 0xea, 0x6b, 0xa2, 0x69, 0x0f, 0x0f, - 0x19, 0x1e, 0x26, 0x91, 0x93, 0x6d, 0x01, 0xf7, 0x3e, 0x1d, 0x6e, 0x8f, - 0x12, 0xa9, 0x03, 0x43, 0x13, 0x45, 0x5c, 0xf1, 0x21, 0xcb, 0x21, 0x7c, - 0x24, 0x93, 0xe4, 0x66, 0x3c, 0x81, 0x71, 0x27, 0xe0, 0xa1, 0xf9, 0x1c, - 0x8b, 0xb6, 0x61, 0x2f, 0xd7, 0x39, 0x04, 0xd6, 0x8c, 0xeb, 0x5c, 0xaa, - 0x2f, 0xb1, 0x6e, 0x80, 0x2a, 0x54, 0x91, 0xd6, 0x8d, 0xda, 0xd3, 0xad, - 0x6b, 0x07, 0x71, 0x8a, 0x67, 0x5d, 0xcf, 0x8e, 0x1d, 0x72, 0xd4, 0xe7, - 0x7f, 0x5e, 0xd0, 0x14, 0x38, 0x39, 0x3e, 0x48, 0xc2, 0x49, 0x1c, 0x16, - 0x07, 0xe6, 0x22, 0x89, 0x19, 0xe2, 0xd2, 0x60, 0x86, 0xb8, 0xe6, 0x75, - 0x61, 0x83, 0xef, 0xec, 0xad, 0x91, 0xfb, 0x4a, 0xf9, 0xd9, 0xbd, 0x51, - 0xf9, 0x99, 0xb1, 0x4e, 0x15, 0x48, 0x50, 0xde, 0xd0, 0xa7, 0x78, 0x83, - 0xc5, 0xc0, 0x9e, 0x29, 0x82, 0x28, 0x2f, 0xd1, 0x20, 0x21, 0x0b, 0xe6, - 0xb1, 0x40, 0x48, 0x45, 0x34, 0x8d, 0x06, 0x3a, 0x5b, 0xba, 0xea, 0xf8, - 0xbb, 0xb0, 0xba, 0xf4, 0x69, 0xab, 0x40, 0x44, 0x35, 0xee, 0x31, 0x9c, - 0xec, 0xaa, 0xb7, 0x5b, 0xdf, 0x3b, 0xd5, 0x9f, 0xee, 0x32, 0x84, 0xd5, - 0xd2, 0xbe, 0x3f, 0xe8, 0x78, 0xcc, 0xa7, 0x75, 0x96, 0x02, 0x10, 0x70, - 0x22, 0xb7, 0x51, 0x09, 0xa6, 0xa6, 0x91, 0x47, 0xba, 0x0a, 0x38, 0xc7, - 0x38, 0x12, 0x14, 0x60, 0x60, 0xcc, 0x26, 0x39, 0x89, 0x8e, 0xac, 0xa2, - 0xeb, 0xb2, 0x47, 0x8d, 0x04, 0x4f, 0x69, 0xdd, 0x1e, 0xab, 0xa8, 0x03, - 0xb9, 0x98, 0xbb, 0xf5, 0xa8, 0x20, 0x59, 0xa8, 0x12, 0xb0, 0x53, 0x01, - 0xcc, 0xed, 0x01, 0xf7, 0x9c, 0x86, 0xc1, 0x46, 0x20, 0x19, 0x0f, 0xbd, - 0xfa, 0x98, 0xdf, 0x47, 0x2f, 0x6d, 0x05, 0x37, 0x8f, 0x7f, 0x17, 0xcf, - 0xa3, 0x3b, 0x38, 0x2e, 0x7f, 0x6b, 0x72, 0x96, 0xda, 0x3c, 0x81, 0x08, - 0x09, 0xe5, 0xf8, 0xe6, 0x15, 0x20, 0x8d, 0x71, 0x2f, 0x67, 0xf1, 0x93, - 0xa6, 0xc4, 0x55, 0xd1, 0x45, 0xc4, 0x73, 0x1c, 0xa5, 0xf9, 0xc8, 0x2e, - 0xdd, 0xa2, 0x35, 0xe5, 0xa3, 0x54, 0xe1, 0x17, 0x84, 0x3c, 0x05, 0x09, - 0x86, 0x82, 0xde, 0xc1, 0x32, 0x5c, 0xc0, 0x9d, 0x2a, 0x09, 0x78, 0x0a, - 0x08, 0xd8, 0x99, 0x13, 0x1c, 0x0e, 0x4d, 0x87, 0x7e, 0x59, 0xc5, 0x60, - 0x11, 0xba, 0x63, 0xe5, 0x15, 0xcf, 0xde, 0x5f, 0xbc, 0xc7, 0xc2, 0x4d, - 0x6b, 0xaf, 0x1d, 0x39, 0x58, 0x3c, 0x39, 0x36, 0xc8, 0x55, 0x13, 0xf9, - 0xa6, 0x0b, 0x2c, 0x6f, 0x2a, 0x2c, 0x41, 0xc4, 0x6c, 0xa3, 0x57, 0x93, - 0x1e, 0x45, 0x00, 0x58, 0x75, 0x3c, 0x1c, 0x9a, 0x4e, 0xcb, 0x85, 0x98, - 0xed, 0xd9, 0x21, 0x36, 0x1b, 0x6e, 0x55, 0x0e, 0x1a, 0x4d, 0xce, 0xf4, - 0x03, 0x46, 0x32, 0xb6, 0x90, 0x31, 0x4a, 0x3e, 0x6a, 0xa2, 0x50, 0x2f, - 0x5e, 0x6e, 0x4b, 0x4f, 0xad, 0xa3, 0xe8, 0xb6, 0x72, 0xf4, 0x8a, 0x7d, - 0x36, 0x62, 0xdd, 0x10, 0x49, 0x3f, 0xab, 0xdd, 0x95, 0x78, 0x56, 0x51, - 0x6f, 0x5e, 0x81, 0xfd, 0x75, 0xae, 0x5d, 0x81, 0x6b, 0x55, 0x80, 0x09, - 0xa3, 0xbc, 0x22, 0x44, 0xa2, 0x25, 0x19, 0x65, 0xf1, 0x96, 0x9c, 0x85, - 0x10, 0xb0, 0xff, 0x39, 0x7f, 0x84, 0x4b, 0xb4, 0x45, 0xd8, 0xd8, 0x36, - 0x77, 0x44, 0x6d, 0xfb, 0xfc, 0x2f, 0xb8, 0xcc, 0xe0, 0x2e, 0xd7, 0x3c, - 0x87, 0x80, 0xc8, 0xa4, 0xa8, 0xe4, 0xa3, 0x18, 0x32, 0x90, 0x77, 0xe7, - 0xb8, 0xa9, 0xe8, 0xa9, 0x73, 0x50, 0xb3, 0x36, 0x08, 0x56, 0xe5, 0x2b, - 0x7e, 0x56, 0xbc, 0x04, 0x93, 0xbe, 0x17, 0x0e, 0x9e, 0x42, 0x7c, 0xd7, - 0x7c, 0xb8, 0x58, 0x01, 0x84, 0xd3, 0x4a, 0x2c, 0x77, 0x30, 0x31, 0x89, - 0x76, 0x57, 0xa1, 0xa7, 0xf8, 0x2c, 0x46, 0xc3, 0xc3, 0x1e, 0x34, 0x70, - 0xc2, 0xa4, 0xed, 0x3c, 0xaa, 0x35, 0xaf, 0xfd, 0xed, 0x8d, 0x9e, 0xd4, - 0x71, 0x12, 0x4a, 0xaf, 0xe7, 0x65, 0xd2, 0xf8, 0xc0, 0x3d, 0x29, 0x94, - 0x88, 0xfb, 0x4b, 0x2a, 0x20, 0x19, 0x3b, 0xb8, 0x8c, 0x0f, 0x82, 0x87, - 0x4f, 0x99, 0x53, 0x1b, 0x89, 0x9e, 0xbf, 0xa3, 0xa9, 0x50, 0x43, 0xf9, - 0xac, 0xda, 0xb0, 0x7a, 0xb2, 0x93, 0x6c, 0x14, 0x6a, 0x1e, 0x13, 0x33, - 0x48, 0xda, 0x5c, 0x99, 0x12, 0xaa, 0xbb, 0x61, 0x02, 0xcb, 0xf6, 0x4e, - 0xed, 0x07, 0x99, 0xe3, 0x3f, 0xf6, 0x65, 0x60, 0x05, 0x3c, 0x45, 0x73, - 0x03, 0x07, 0x61, 0x0b, 0xaf, 0x3e, 0x36, 0xaf, 0x3e, 0xb8, 0xfe, 0xde, - 0x08, 0x57, 0x6a, 0xdf, 0xbd, 0xa7, 0x35, 0xcd, 0x82, 0xf2, 0x6f, 0x88, - 0x2a, 0xb5, 0x8f, 0x03, 0xec, 0x57, 0x3a, 0x69, 0x9c, 0x96, 0xd0, 0xb8, - 0x70, 0xa6, 0xe4, 0xff, 0x21, 0xce, 0x28, 0x81, 0x39, 0x1f, 0x81, 0x00, - 0x64, 0xf5, 0x33, 0x79, 0x81, 0x83, 0xa1, 0xc0, 0xa2, 0xe6, 0xcf, 0x31, - 0x8b, 0xe0, 0x26, 0x27, 0x78, 0x10, 0xc8, 0x6a, 0x0f, 0xdb, 0x15, 0x6e, - 0x4b, 0xfb, 0xa5, 0xa0, 0x42, 0xc7, 0xc1, 0x8c, 0xb7, 0x8e, 0x78, 0x98, - 0xd9, 0x49, 0x5a, 0x05, 0x92, 0x54, 0x60, 0xf5, 0xac, 0x5e, 0xab, 0x40, - 0xe9, 0xc8, 0xe7, 0x71, 0x16, 0xd6, 0xcd, 0x31, 0x20, 0x5c, 0xf3, 0x86, - 0x16, 0xc1, 0x4e, 0xa7, 0xf5, 0x64, 0x38, 0x22, 0x12, 0xf1, 0xe9, 0x26, - 0x70, 0xf8, 0xea, 0x1f, 0xb2, 0xad, 0xc4, 0x31, 0x61, 0x71, 0x62, 0xb9, - 0x80, 0x9a, 0xa0, 0x29, 0xf7, 0xc7, 0x1e, 0x69, 0x9b, 0x02, 0x69, 0xb5, - 0xcc, 0xff, 0x14, 0xe0, 0xfb, 0x48, 0x7f, 0xdd, 0x52, 0x4f, 0xdc, 0x4d, - 0x19, 0x05, 0xb3, 0x28, 0x47, 0x2d, 0x9f, 0x5a, 0x16, 0xa1, 0x6b, 0x51, - 0xb2, 0xd9, 0x06, 0x81, 0x9b, 0x87, 0xd5, 0x3a, 0x66, 0xec, 0x00, 0x52, - 0x90, 0x44, 0x96, 0xd7, 0x6d, 0xcf, 0x9a, 0x82, 0xd4, 0xdd, 0x86, 0xd6, - 0xd6, 0xea, 0x6f, 0xc1, 0xfb, 0x8b, 0x7d, 0x95, 0x35, 0x36, 0x81, 0x45, - 0x28, 0x8f, 0xe4, 0x52, 0x3d, 0x7e, 0x5d, 0x3d, 0x0f, 0xb5, 0x53, 0x57, - 0x97, 0x81, 0x45, 0xb6, 0x33, 0x2e, 0xc2, 0x1e, 0xed, 0x13, 0x6b, 0xfa, - 0x16, 0xe3, 0x3a, 0x40, 0xd3, 0x52, 0x60, 0x3c, 0x75, 0x07, 0x20, 0x50, - 0x46, 0x03, 0x76, 0x97, 0xc8, 0xb5, 0xd2, 0x54, 0xa8, 0xe6, 0x57, 0xfc, - 0xbb, 0xda, 0x38, 0x1b, 0xc5, 0x52, 0x71, 0x07, 0xe7, 0x61, 0x3d, 0x1c, - 0xe9, 0x63, 0xee, 0xb4, 0xe1, 0x15, 0x99, 0xa5, 0x53, 0x3a, 0xb0, 0x7a, - 0xa3, 0xf2, 0x8f, 0xdb, 0xde, 0xf0, 0x31, 0x0b, 0x01, 0x7a, 0x18, 0x2a, - 0x01, 0x37, 0xd8, 0x32, 0x95, 0x14, 0x31, 0x17, 0x3e, 0xd2, 0x1d, 0x96, - 0x79, 0x70, 0x69, 0x37, 0xe5, 0xe5, 0xe8, 0x00, 0xe1, 0x96, 0xea, 0xc3, - 0xd2, 0xf1, 0x2b, 0xc4, 0xac, 0x2d, 0xdc, 0xb3, 0xd4, 0x69, 0xc7, 0x0b, - 0x44, 0x8c, 0x1a, 0xc8, 0x0d, 0xbb, 0x6a, 0x37, 0x40, 0x1b, 0xd1, 0xf4, - 0x69, 0x63, 0xcb, 0xbd, 0x0c, 0x9f, 0x26, 0x33, 0xd2, 0xf8, 0xd5, 0x0f, - 0x85, 0x74, 0x02, 0x4b, 0x90, 0x79, 0x91, 0x15, 0x8a, 0x52, 0x6a, 0xcb, - 0x17, 0x3a, 0x26, 0xd2, 0xa0, 0x9a, 0xc7, 0x03, 0xb6, 0xe5, 0x30, 0xc6, - 0xbc, 0xf7, 0xd8, 0x5b, 0x56, 0x6f, 0x3f, 0xd0, 0x28, 0x5a, 0x08, 0xc6, - 0x7d, 0xf6, 0x42, 0x1b, 0xdb, 0xde, 0xda, 0x72, 0x7d, 0x34, 0x43, 0xcb, - 0xf7, 0x30, 0xfc, 0x6a, 0x41, 0xfb, 0xda, 0xdd, 0x8d, 0xa3, 0xe8, 0xcf, - 0x45, 0x9b, 0xf5, 0xe5, 0x4c, 0x24, 0x0a, 0x0c, 0x36, 0xe5, 0x56, 0x09, - 0x63, 0xac, 0x7b, 0x85, 0x98, 0x40, 0x4d, 0x80, 0xc1, 0xbc, 0xf7, 0x40, - 0xed, 0xd0, 0x80, 0x14, 0x34, 0xa4, 0xf0, 0xe4, 0xdb, 0xb7, 0xf1, 0x8e, - 0xe6, 0xaf, 0xac, 0x9c, 0x9e, 0x8c, 0x41, 0x78, 0xff, 0x6e, 0x9d, 0xca, - 0xaa, 0x46, 0x49, 0xcc, 0x3a, 0x27, 0x74, 0x2c, 0x37, 0xe1, 0x2c, 0x58, - 0xcc, 0xb3, 0x46, 0x64, 0xf1, 0xa2, 0x0d, 0x88, 0x44, 0xdf, 0xc1, 0x0d, - 0x3b, 0x1c, 0x59, 0x43, 0x6d, 0xb6, 0x65, 0x65, 0x36, 0x93, 0x4d, 0xa4, - 0x13, 0x48, 0x92, 0xc2, 0x51, 0x2e, 0x01, 0x0e, 0xa1, 0xa2, 0x23, 0xcb, - 0xee, 0x22, 0x8a, 0xf6, 0x7c, 0xec, 0x32, 0xf6, 0xcf, 0xcd, 0x2e, 0xa5, - 0xab, 0xe2, 0xab, 0xa6, 0xd1, 0x4b, 0xa7, 0x97, 0x18, 0xa6, 0x59, 0xc6, - 0xf5, 0xc4, 0x42, 0x61, 0x0f, 0x9e, 0x6c, 0x5c, 0x3d, 0x5b, 0x58, 0x31, - 0xe7, 0x82, 0xb1, 0x56, 0xd5, 0x8f, 0xda, 0xef, 0xb2, 0xe9, 0x72, 0x4a, - 0xfb, 0x2e, 0xd6, 0x93, 0x1e, 0x95, 0x59, 0xf0, 0x61, 0x5a, 0xcc, 0x6f, - 0xfc, 0xf5, 0x57, 0x72, 0x3e, 0xae, 0x02, 0xd4, 0x5f, 0xa3, 0x9a, 0x51, - 0xd0, 0xb8, 0x10, 0x1c, 0x79, 0x28, 0xa1, 0x11, 0xa9, 0x69, 0xec, 0x32, - 0xa2, 0x8a, 0x22, 0x54, 0xe7, 0x59, 0xe6, 0x23, 0xf1, 0xa1, 0xed, 0xb6, - 0x14, 0x79, 0x41, 0x96, 0x2a, 0x4b, 0x41, 0xc3, 0x7d, 0x00, 0x76, 0xee, - 0xd0, 0xb6, 0x59, 0x79, 0x25, 0x07, 0x5f, 0x1e, 0xba, 0x36, 0x3f, 0x9b, - 0xe8, 0x61, 0x98, 0x9a, 0x07, 0x13, 0x2a, 0x28, 0x0b, 0x3e, 0xe4, 0x15, - 0x75, 0xc4, 0x72, 0x04, 0x89, 0xbd, 0x90, 0xa2, 0xd8, 0x1f, 0x32, 0xeb, - 0x1f, 0x2c, 0x94, 0x9d, 0x89, 0xe1, 0x2e, 0xe4, 0x85, 0x99, 0x03, 0x42, - 0xcc, 0x5e, 0x32, 0x3c, 0xad, 0xb3, 0x06, 0x79, 0x5e, 0x09, 0xfd, 0x42, - 0xe0, 0xb6, 0x20, 0x02, 0x84, 0xda, 0x58, 0x14, 0x40, 0x7a, 0x8e, 0x47, - 0xc6, 0xc5, 0xb4, 0x09, 0xdd, 0x81, 0x55, 0x2a, 0x99, 0x31, 0x4f, 0xcb, - 0xcb, 0xe3, 0x6a, 0xf1, 0xf0, 0xf5, 0x3d, 0x31, 0xbc, 0x10, 0x1c, 0x05, - 0xfd, 0xc2, 0x01, 0x3d, 0xbf, 0x1d, 0x32, 0xb0, 0x90, 0x29, 0xb5, 0xa3, - 0x00, 0x8c, 0x42, 0xa4, 0x84, 0xbe, 0x24, 0xb4, 0xb4, 0x74, 0x7d, 0xb1, - 0x7f, 0x38, 0x8b, 0xde, 0x62, 0xc3, 0xf6, 0x12, 0x7a, 0x34, 0x32, 0xde, - 0x24, 0xf4, 0x2e, 0x90, 0x46, 0xa9, 0x90, 0xe5, 0xcc, 0x9b, 0x05, 0x1f, - 0x80, 0x95, 0x9c, 0xbc, 0xd4, 0xf5, 0x76, 0xaf, 0x6b, 0xf2, 0x40, 0x5b, - 0x7c, 0x0e, 0x18, 0x7a, 0x05, 0x06, 0xf3, 0xde, 0xa2, 0x9f, 0x00, 0x1d, - 0x16, 0x10, 0x54, 0x81, 0x1f, 0x96, 0x3b, 0xa0, 0xdd, 0x4a, 0xbe, 0xa9, - 0xbb, 0xc7, 0xbe, 0xb0, 0x72, 0x0b, 0xd7, 0xab, 0xe0, 0x17, 0x0c, 0x3c, - 0x82, 0xfc, 0x11, 0xbb, 0x78, 0xd1, 0xe2, 0xbe, 0x6b, 0x3e, 0x28, 0xeb, - 0x8d, 0x6a, 0x6d, 0x15, 0xfc, 0x71, 0x89, 0x0b, 0x2a, 0x2f, 0xf9, 0x07, - 0x66, 0xa0, 0xb1, 0xfe, 0x6a, 0xac, 0x4c, 0x59, 0x9a, 0x29, 0x0f, 0xa1, - 0x0f, 0xbc, 0x8d, 0x02, 0x05, 0x0a, 0x82, 0xfd, 0x10, 0x06, 0x35, 0x6f, - 0x89, 0x60, 0xfc, 0xe2, 0x46, 0x30, 0x0b, 0x03, 0x73, 0xb5, 0x28, 0x91, - 0x79, 0x95, 0x2b, 0xff, 0x2a, 0xda, 0x89, 0x14, 0x09, 0x15, 0xda, 0x4c, - 0x7c, 0x15, 0x5c, 0xa1, 0x81, 0x34, 0xaf, 0xb6, 0xb8, 0x57, 0xad, 0x2b, - 0x17, 0x1a, 0x62, 0x69, 0xeb, 0xf6, 0x9a, 0x23, 0xc5, 0xf6, 0x9a, 0xf0, - 0xd3, 0xf9, 0x8f, 0x74, 0x64, 0x53, 0xab, 0xa3, 0xf0, 0x2e, 0x4f, 0xa8, - 0x55, 0x00, 0x58, 0x62, 0x88, 0x98, 0xa2, 0xc0, 0xa6, 0x0e, 0xe0, 0x2f, - 0x88, 0xda, 0x4c, 0x47, 0x42, 0xab, 0x00, 0xbc, 0x95, 0x24, 0x80, 0x55, - 0x1c, 0xd1, 0x44, 0x48, 0x16, 0x47, 0xcc, 0x13, 0xc8, 0xce, 0xbc, 0xe5, - 0xc8, 0x31, 0x84, 0x9d, 0x2b, 0xb2, 0xab, 0xeb, 0x03, 0xc2, 0x75, 0x00, - 0xbd, 0x8d, 0x31, 0x51, 0x8e, 0xa3, 0x47, 0x15, 0x74, 0x2e, 0x60, 0xbc, - 0x15, 0x80, 0x5e, 0xf1, 0x46, 0x55, 0xc4, 0x07, 0xf9, 0xc3, 0xf5, 0x8b, - 0x43, 0xc9, 0x97, 0x9a, 0xef, 0x5e, 0x5d, 0x91, 0x49, 0x9d, 0x76, 0x3c, - 0x98, 0x20, 0x26, 0x23, 0x5f, 0x9e, 0x35, 0x5f, 0x98, 0xf1, 0xfa, 0x86, - 0xbf, 0x91, 0xe8, 0x82, 0x60, 0x34, 0x5d, 0xee, 0xb7, 0x9a, 0xef, 0xed, - 0xa4, 0x82, 0xf4, 0xac, 0xb8, 0x61, 0x69, 0xb4, 0xdd, 0x95, 0xc8, 0xb5, - 0x93, 0x87, 0x75, 0x15, 0x82, 0xb5, 0x25, 0x96, 0xe0, 0xa3, 0xa7, 0x74, - 0xad, 0x07, 0x9d, 0x61, 0x8e, 0x4f, 0x5f, 0x06, 0x19, 0x95, 0x07, 0xd3, - 0x16, 0xed, 0x82, 0xe5, 0x73, 0x94, 0x2a, 0x81, 0x6b, 0x26, 0x36, 0xc5, - 0x1e, 0x5d, 0x43, 0x2e, 0xd8, 0xe1, 0xf5, 0xe9, 0xd5, 0xf3, 0x32, 0x37, - 0x86, 0x5b, 0xa1, 0xf5, 0xc4, 0x37, 0xd9, 0xd3, 0xbe, 0xe3, 0x0b, 0xbe, - 0xa8, 0x03, 0x55, 0xcd, 0x92, 0xfc, 0x1a, 0xa3, 0x97, 0x65, 0x4b, 0x82, - 0x86, 0xe4, 0x37, 0xd4, 0x10, 0x2d, 0x28, 0x8c, 0xb5, 0xde, 0xa7, 0xf1, - 0x30, 0xeb, 0xd2, 0x2e, 0xe1, 0x6f, 0x4b, 0x1c, 0x01, 0x37, 0xb9, 0x67, - 0x15, 0x11, 0x5e, 0x64, 0x0b, 0xe8, 0x05, 0x57, 0xfc, 0x5d, 0xa7, 0x83, - 0x51, 0xb4, 0x5c, 0xb7, 0x65, 0x67, 0xc0, 0x69, 0x45, 0x66, 0xdc, 0xa1, - 0x42, 0xce, 0x8f, 0x23, 0xcc, 0x83, 0x8b, 0x59, 0xda, 0xa8, 0x4e, 0x83, - 0x2f, 0x69, 0x69, 0xda, 0x87, 0x17, 0x2c, 0x94, 0x4c, 0x7d, 0xcc, 0x4d, - 0x84, 0xf1, 0xa8, 0x8f, 0xdb, 0xe2, 0x51, 0xcc, 0x67, 0x6d, 0xe9, 0x66, - 0x9a, 0x3c, 0x51, 0x0e, 0x38, 0x7c, 0xca, 0x0c, 0xc3, 0xc7, 0xa3, 0x8e, - 0x72, 0x1d, 0x02, 0x32, 0x6d, 0x1c, 0xfc, 0xf4, 0xa3, 0x37, 0x39, 0x99, - 0xe2, 0xd3, 0xb7, 0x72, 0x65, 0x79, 0x4b, 0x0b, 0x2f, 0xeb, 0xf8, 0x27, - 0x4f, 0x3b, 0x9f, 0x86, 0xa7, 0x4f, 0x16, 0xe0, 0xa1, 0x0e, 0xf9, 0x64, - 0x8c, 0xfd, 0x30, 0x6b, 0xd3, 0x21, 0xe6, 0x37, 0xd1, 0xc5, 0xfe, 0x93, - 0x0f, 0xc7, 0xed, 0x68, 0x84, 0xf2, 0x67, 0x5f, 0x3e, 0x27, 0xae, 0xaf, - 0xbc, 0x70, 0xb9, 0xa4, 0x4c, 0xa7, 0xf2, 0x5f, 0xbc, 0x8d, 0xca, 0xea, - 0x2a, 0xd4, 0x35, 0xc3, 0xe0, 0xe1, 0x6b, 0x0d, 0x9f, 0xf3, 0x22, 0x8e, - 0xa5, 0x13, 0x86, 0x1a, 0x3d, 0x20, 0x62, 0xae, 0xb4, 0x6c, 0xeb, 0x97, - 0xf5, 0xab, 0x12, 0xf1, 0x69, 0x43, 0xfd, 0x6a, 0xf2, 0x6a, 0x55, 0xe7, - 0x62, 0x11, 0x71, 0x32, 0x34, 0x1c, 0x78, 0x8e, 0xab, 0x13, 0x57, 0xdf, - 0xd0, 0x5f, 0xc0, 0x9e, 0x8c, 0x7b, 0x7b, 0xb2, 0x3d, 0x47, 0x3f, 0xb0, - 0xce, 0x35, 0xfa, 0xa5, 0x8e, 0x7e, 0x19, 0xa1, 0xc0, 0x70, 0x17, 0x0d, - 0x60, 0x1e, 0xd0, 0x22, 0x51, 0x66, 0xea, 0x23, 0xb6, 0x30, 0xbc, 0x8b, - 0x2e, 0x1b, 0xd7, 0xe8, 0xea, 0x7b, 0xa4, 0x92, 0x16, 0x9f, 0x46, 0xf9, - 0xa7, 0x71, 0x31, 0xbd, 0xd8, 0x82, 0x51, 0xa8, 0x23, 0x76, 0x1f, 0xfa, - 0x21, 0x8f, 0x02, 0x01, 0x69, 0x8a, 0xd4, 0x4c, 0x7c, 0x19, 0x55, 0x3d, - 0x1b, 0x93, 0x73, 0xd9, 0x88, 0x40, 0x8e, 0x1e, 0x07, 0x0d, 0x9a, 0x56, - 0xdb, 0x93, 0xb9, 0x14, 0x0e, 0xc8, 0xa0, 0xd4, 0xcc, 0xac, 0x3a, 0xb8, - 0x54, 0x67, 0x76, 0x34, 0xc5, 0x97, 0x68, 0x68, 0xc2, 0xa0, 0x96, 0x6b, - 0xed, 0x96, 0xd1, 0x20, 0x30, 0x13, 0x70, 0x26, 0xd3, 0xc7, 0x6d, 0x33, - 0xa1, 0x5f, 0x75, 0x5b, 0x9c, 0xba, 0x15, 0xe6, 0x70, 0x75, 0x48, 0x3b, - 0xd8, 0x8c, 0x24, 0x5f, 0x19, 0x92, 0x7e, 0x89, 0xe2, 0xf1, 0x50, 0x65, - 0x36, 0x09, 0xf7, 0x16, 0x44, 0x73, 0x97, 0xf3, 0xd3, 0x03, 0xdb, 0x66, - 0xd3, 0xb0, 0x90, 0x7c, 0x27, 0x81, 0x37, 0xf1, 0x9d, 0x41, 0x17, 0xd9, - 0xc5, 0xd8, 0xdd, 0xf6, 0x32, 0xab, 0xe9, 0xd2, 0x08, 0x46, 0x91, 0x93, - 0x28, 0x5e, 0x7d, 0x26, 0xaa, 0x78, 0xe7, 0x4f, 0x9f, 0x3f, 0x60, 0xa4, - 0xbb, 0x80, 0x0f, 0xa4, 0xe5, 0x5a, 0xd0, 0x16, 0x93, 0x52, 0x8a, 0xec, - 0xde, 0x88, 0xaf, 0x8a, 0x60, 0x42, 0xb3, 0xfc, 0x11, 0xac, 0xb1, 0x98, - 0x89, 0x11, 0x4e, 0x03, 0x24, 0xc6, 0x73, 0x85, 0x74, 0xa2, 0x23, 0x2c, - 0x16, 0x5a, 0x6b, 0xdd, 0xe0, 0x5b, 0x46, 0x24, 0x52, 0xde, 0x82, 0xda, - 0xf3, 0xc3, 0x8c, 0x52, 0xd2, 0x1c, 0xf0, 0x91, 0xeb, 0xe2, 0xfa, 0x60, - 0x9b, 0x15, 0xe3, 0xbc, 0x2e, 0x5f, 0x3a, 0xaa, 0x11, 0xf8, 0xa7, 0x84, - 0x20, 0xd2, 0x0f, 0xe3, 0xdb, 0x7a, 0x45, 0x1b, 0x9e, 0xbc, 0x3a, 0x51, - 0xf7, 0xc5, 0x47, 0x75, 0xc5, 0x7e, 0x98, 0x16, 0x61, 0xf1, 0xc9, 0x89, - 0x08, 0xd4, 0x6d, 0x4d, 0x6e, 0x82, 0xc8, 0xe9, 0x90, 0xfd, 0xec, 0x80, - 0xd3, 0xc7, 0x7c, 0x68, 0x86, 0x74, 0x2e, 0x06, 0x3e, 0x73, 0xb0, 0xbd, - 0x22, 0x4e, 0x34, 0x44, 0xa3, 0x81, 0x5a, 0xc8, 0xbb, 0xa8, 0x8f, 0x5d, - 0xcd, 0x55, 0x20, 0x62, 0xbe, 0x64, 0x9e, 0xc6, 0xb9, 0xff, 0x94, 0xc1, - 0x77, 0xf1, 0x58, 0x30, 0x8c, 0x88, 0x3e, 0x5f, 0xc2, 0xbc, 0x85, 0x35, - 0x50, 0xad, 0x35, 0x2c, 0x69, 0x4b, 0x5d, 0xcb, 0x3d, 0x03, 0x3b, 0x0a, - 0xa6, 0x20, 0xea, 0x81, 0x40, 0x6d, 0xbf, 0x84, 0x70, 0x5b, 0x63, 0xb5, - 0x7b, 0x74, 0x22, 0x13, 0x56, 0xd7, 0xce, 0xe8, 0x4b, 0xcc, 0x74, 0xb7, - 0x32, 0x97, 0xdb, 0x83, 0x6f, 0x19, 0xdb, 0x6e, 0x63, 0xbc, 0x87, 0xe5, - 0x49, 0x8b, 0x94, 0x16, 0xe2, 0xed, 0xac, 0x77, 0x72, 0x9d, 0x0a, 0x6c, - 0x81, 0x70, 0x6f, 0x8b, 0xc7, 0x72, 0x65, 0x63, 0xa6, 0x9e, 0x13, 0xf4, - 0xef, 0xa2, 0xab, 0x60, 0x6e, 0x65, 0xcc, 0x15, 0xc5, 0x8a, 0x32, 0x7b, - 0x34, 0x42, 0x6b, 0x13, 0x62, 0x6b, 0x4b, 0x85, 0xd8, 0x58, 0xbe, 0x57, - 0xcb, 0xaf, 0x46, 0x12, 0x84, 0x72, 0x25, 0x5d, 0xc5, 0xee, 0x38, 0xbf, - 0xa6, 0x83, 0xde, 0x6c, 0x13, 0x06, 0xbf, 0xc0, 0xd9, 0xee, 0x3c, 0x41, - 0x65, 0x09, 0x49, 0x6e, 0x51, 0xf3, 0x73, 0xc4, 0xed, 0x68, 0x89, 0xbe, - 0xa8, 0x4c, 0x73, 0x28, 0xe6, 0xc1, 0x6a, 0x1b, 0xec, 0xe0, 0x57, 0xa0, - 0x7c, 0x6c, 0x1b, 0x3b, 0x3a, 0x9b, 0x04, 0x90, 0xd3, 0x0d, 0x80, 0xd8, - 0x95, 0x2b, 0x34, 0x31, 0x1f, 0x16, 0xb8, 0x90, 0xaa, 0xc0, 0x7a, 0xdc, - 0xf2, 0xe0, 0xe1, 0xe4, 0xce, 0x77, 0x9b, 0x9d, 0xd6, 0x17, 0xa6, 0x49, - 0x5a, 0xbf, 0xc1, 0x1f, 0xc5, 0xae, 0x7b, 0x98, 0x16, 0x61, 0x50, 0x1b, - 0x99, 0x11, 0x8c, 0x63, 0x6b, 0x05, 0x62, 0x1d, 0x0e, 0xe5, 0x7a, 0x2d, - 0x22, 0x93, 0xa6, 0x55, 0x0f, 0x34, 0xcf, 0x76, 0x37, 0x25, 0x7a, 0xd6, - 0xb5, 0x4e, 0xdc, 0x4e, 0x9e, 0x3d, 0xf9, 0x95, 0x45, 0x95, 0x78, 0x97, - 0xf6, 0xc5, 0xc5, 0x06, 0x58, 0x89, 0x1b, 0xca, 0xb0, 0xc0, 0x91, 0x69, - 0x1f, 0x2a, 0x1d, 0x12, 0x5d, 0x9e, 0x07, 0xd9, 0x4b, 0xc1, 0x56, 0x1c, - 0x6d, 0x25, 0x1a, 0x66, 0x5b, 0x80, 0x51, 0xb1, 0xa7, 0x20, 0x8e, 0x4b, - 0x08, 0x17, 0xaa, 0xa7, 0x11, 0xff, 0xc0, 0x2b, 0x41, 0xd1, 0x66, 0x2c, - 0x5e, 0xbc, 0xba, 0x80, 0x81, 0xcd, 0x1f, 0x16, 0x38, 0x5f, 0xad, 0x28, - 0x2a, 0x67, 0x2a, 0xd6, 0xb5, 0xea, 0x47, 0x6a, 0x02, 0xcd, 0xef, 0x4b, - 0xd5, 0x00, 0xce, 0xe7, 0x56, 0x97, 0xc3, 0x8a, 0x2e, 0xdf, 0x62, 0xfb, - 0xbf, 0x02, 0xc8, 0x56, 0xba, 0xec, 0x46, 0xb5, 0xe2, 0x54, 0x17, 0xae, - 0x58, 0xfa, 0x7c, 0x58, 0x54, 0xe3, 0x62, 0x26, 0xc1, 0x38, 0x41, 0xa7, - 0x31, 0x25, 0xbe, 0x32, 0x74, 0x2b, 0x78, 0x5e, 0x8d, 0xd8, 0xdf, 0x0b, - 0x2a, 0x6a, 0x2b, 0x1d, 0x60, 0x35, 0xe8, 0xba, 0x75, 0xdd, 0x98, 0x97, - 0x4e, 0xb8, 0x1d, 0xd6, 0xb9, 0x55, 0xf5, 0x4e, 0x68, 0x1d, 0xbd, 0xaa, - 0xb6, 0xbe, 0x8b, 0x20, 0x07, 0x56, 0xfa, 0x6c, 0x85, 0xa9, 0xb1, 0xb1, - 0xa7, 0x0d, 0x0c, 0xa7, 0x7c, 0x7c, 0x5c, 0xde, 0xd6, 0x87, 0x93, 0xef, - 0xdf, 0xcb, 0x57, 0xc1, 0x6a, 0x57, 0xbe, 0x40, 0x97, 0x82, 0x8b, 0xe0, - 0x0d, 0x05, 0xdd, 0x3b, 0x4f, 0x0e, 0x05, 0xd4, 0x94, 0x58, 0x00, 0x52, - 0xc0, 0x2e, 0xa7, 0xb3, 0xcc, 0xaa, 0x52, 0x47, 0x46, 0x4b, 0x16, 0xdc, - 0x9a, 0x59, 0x25, 0x88, 0x93, 0x03, 0xd7, 0x0f, 0x8a, 0x54, 0xb2, 0x84, - 0xde, 0x20, 0xfa, 0x32, 0x80, 0x9b, 0x75, 0x6c, 0xd6, 0x13, 0xb1, 0x5d, - 0x41, 0x44, 0x91, 0xb3, 0xf9, 0x1a, 0x21, 0x86, 0xa1, 0x02, 0xc5, 0x80, - 0x15, 0x8e, 0x3d, 0xa8, 0xb6, 0x84, 0x46, 0x61, 0xb7, 0x4c, 0xf5, 0x77, - 0x42, 0x88, 0x70, 0xb1, 0x5f, 0xf8, 0x42, 0xe2, 0x89, 0x40, 0x3c, 0x4a, - 0xb0, 0xb3, 0x14, 0xe6, 0x65, 0xbc, 0xd8, 0x97, 0xd8, 0x14, 0xc7, 0x51, - 0xd4, 0xed, 0xf0, 0xcc, 0x09, 0xa8, 0x94, 0x5a, 0x57, 0x4c, 0xb1, 0x8b, - 0xd2, 0x7c, 0xd2, 0x9e, 0x6d, 0xb6, 0x67, 0x1f, 0x5c, 0x97, 0x84, 0xa5, - 0xb7, 0x4b, 0xc1, 0x5c, 0xa6, 0xaf, 0x49, 0x19, 0x2a, 0x9f, 0xd8, 0xce, - 0x6d, 0xa4, 0xbe, 0xf1, 0x97, 0xdf, 0x81, 0x74, 0x6b, 0x79, 0x68, 0xad, - 0x1b, 0x7b, 0x49, 0x03, 0x99, 0x8e, 0x8a, 0xcc, 0x04, 0x69, 0x17, 0x89, - 0xe7, 0x93, 0xf3, 0x9f, 0x2e, 0x4a, 0xe3, 0xd1, 0x95, 0x81, 0x09, 0xdc, - 0x69, 0x77, 0x61, 0x1c, 0xc8, 0xf3, 0x7d, 0xa5, 0xb1, 0x2b, 0x7e, 0x6c, - 0xec, 0x8a, 0x78, 0xf1, 0x71, 0x56, 0x31, 0xc8, 0x9d, 0x41, 0x9f, 0x3d, - 0xb1, 0x99, 0xfa, 0xb8, 0xc0, 0xd9, 0xde, 0x69, 0x25, 0x6f, 0x17, 0xcf, - 0xee, 0x78, 0x3a, 0x38, 0x16, 0xe4, 0x77, 0x27, 0x54, 0xf0, 0xe8, 0x96, - 0xf0, 0xb5, 0x77, 0x83, 0xe8, 0x02, 0xf0, 0x40, 0xb5, 0x4e, 0xcd, 0xfc, - 0xb3, 0x2b, 0x41, 0x53, 0x79, 0x5e, 0xf3, 0xe5, 0x3e, 0xdd, 0xf7, 0x66, - 0x41, 0x8b, 0x20, 0x86, 0xc7, 0xde, 0x7d, 0xa2, 0xe2, 0xcb, 0x86, 0x48, - 0x35, 0x8f, 0xec, 0x01, 0x4a, 0x7a, 0xf5, 0xa6, 0x91, 0x93, 0x3a, 0x11, - 0xb6, 0xe2, 0x92, 0x3c, 0x07, 0x2e, 0x51, 0xee, 0x0d, 0x0e, 0x48, 0x07, - 0xa5, 0x2e, 0x86, 0x76, 0x7c, 0x60, 0x1a, 0xb2, 0x6e, 0x8c, 0x6b, 0xf1, - 0x58, 0x0b, 0x24, 0xea, 0x3d, 0xb9, 0xc1, 0xb7, 0xaa, 0xc9, 0x8f, 0x7f, - 0xca, 0x30, 0xc0, 0x47, 0x57, 0x06, 0xa6, 0x75, 0x97, 0xc7, 0x76, 0xe5, - 0x8d, 0xf8, 0xba, 0x35, 0x7b, 0x67, 0x2b, 0xfe, 0x61, 0x5a, 0x84, 0xd1, - 0x91, 0x33, 0x04, 0xd9, 0x6b, 0x81, 0xa5, 0xd6, 0xaa, 0x9b, 0xc2, 0x2c, - 0xde, 0xeb, 0x7c, 0x6f, 0x50, 0x00, 0x74, 0x08, 0x9c, 0x9e, 0x6c, 0x80, - 0x83, 0xa0, 0xc1, 0x18, 0x71, 0x31, 0x90, 0xdd, 0x38, 0x6d, 0xfb, 0xc8, - 0x28, 0x0f, 0x31, 0x78, 0x44, 0x0c, 0xee, 0xa3, 0x5e, 0xc8, 0x1d, 0x38, - 0x10, 0x73, 0x05, 0x45, 0xc1, 0x2c, 0xf8, 0x98, 0xf2, 0xd3, 0x26, 0x7c, - 0x32, 0xf0, 0xe7, 0x5f, 0x9f, 0xf8, 0x2c, 0x2f, 0xb3, 0x87, 0x05, 0x73, - 0xe6, 0x09, 0xfd, 0x7c, 0x88, 0xcf, 0xbe, 0xfe, 0xa9, 0x99, 0x4e, 0xb0, - 0x19, 0x10, 0x71, 0x6e, 0x95, 0x96, 0xf4, 0x20, 0xfb, 0x92, 0x66, 0xba, - 0x2b, 0xe6, 0x62, 0xfb, 0xb1, 0xaf, 0x10, 0xa7, 0x85, 0x5c, 0xd6, 0x53, - 0x30, 0xaf, 0x2e, 0x71, 0x80, 0x50, 0xbe, 0xdd, 0xaf, 0x8d, 0x98, 0x58, - 0xeb, 0x5e, 0x87, 0xff, 0x31, 0x97, 0x81, 0xb9, 0xdd, 0xf9, 0x4b, 0xee, - 0xf7, 0xa3, 0xe9, 0x97, 0x48, 0x2d, 0x1e, 0x85, 0x62, 0xf6, 0x70, 0x3b, - 0xa4, 0x91, 0x83, 0xca, 0xd8, 0x7a, 0xd1, 0x27, 0xa0, 0xde, 0xea, 0x30, - 0x29, 0x21, 0xb2, 0x71, 0x8c, 0x70, 0xe5, 0x08, 0x67, 0x88, 0xb0, 0x38, - 0xb2, 0x47, 0xa3, 0xb2, 0xec, 0x69, 0x8a, 0x88, 0x48, 0x08, 0xfa, 0x43, - 0xd7, 0x36, 0xe2, 0xff, 0x7a, 0x93, 0x80, 0x65, 0x8f, 0xb9, 0x5f, 0xb9, - 0x1e, 0x44, 0x61, 0x10, 0xf0, 0x42, 0xd7, 0xa7, 0x5d, 0x6f, 0x35, 0xe2, - 0x4e, 0x81, 0x95, 0xc6, 0x83, 0xcb, 0x1d, 0xb0, 0x3f, 0xa9, 0x20, 0x02, - 0x0d, 0xa5, 0xc3, 0x81, 0x6c, 0x13, 0xc4, 0xae, 0xc5, 0x39, 0x2c, 0x8a, - 0xf5, 0x90, 0xdd, 0xb0, 0xdc, 0x82, 0x2f, 0x3d, 0xb5, 0x7c, 0xbb, 0xc3, - 0xbc, 0xb9, 0x0b, 0x39, 0x3e, 0x1b, 0x81, 0x5e, 0xd3, 0x01, 0x39, 0xb4, - 0x4d, 0x28, 0x65, 0x8f, 0x87, 0x49, 0x25, 0x33, 0x37, 0x8d, 0x0a, 0xcd, - 0x5b, 0x0d, 0xfc, 0x38, 0x43, 0xf1, 0x3d, 0xf6, 0x88, 0xf8, 0xcb, 0x24, - 0xc0, 0xcf, 0xa0, 0x80, 0xc2, 0xe9, 0xd7, 0xdd, 0xc0, 0x3d, 0x06, 0xb3, - 0x68, 0x4c, 0xf4, 0xd0, 0xfa, 0x43, 0x5b, 0x1a, 0xc0, 0x62, 0x23, 0xd8, - 0xdb, 0x34, 0xaf, 0x1d, 0xe1, 0x35, 0xb8, 0xa6, 0x2f, 0x5f, 0xbe, 0xfc, - 0xe2, 0xc4, 0x11, 0x30, 0xcc, 0xe3, 0xc0, 0x9f, 0x07, 0xdf, 0x2d, 0x14, - 0xc9, 0x93, 0xb3, 0x44, 0x63, 0x8d, 0xf9, 0xf0, 0xd0, 0x1d, 0x32, 0xa9, - 0xe0, 0x69, 0x89, 0xa4, 0xbf, 0xc9, 0x11, 0x9b, 0x36, 0x5c, 0x7a, 0x64, - 0x83, 0xd8, 0x50, 0x11, 0x51, 0x7f, 0x3d, 0x6a, 0xaf, 0x9e, 0xfe, 0x0e, - 0x1d, 0xdb, 0xfd, 0x91, 0xf9, 0xb9, 0x77, 0x5d, 0x85, 0xd4, 0x4a, 0xf0, - 0xd8, 0xa0, 0x5c, 0xc3, 0xe0, 0xaf, 0xd0, 0x59, 0x4b, 0xc9, 0x62, 0x90, - 0xb9, 0x94, 0xf2, 0xdd, 0x28, 0x0f, 0x7f, 0xa3, 0x05, 0xff, 0xa6, 0x30, - 0x5c, 0x62, 0x2c, 0x77, 0xcf, 0xbe, 0xdc, 0xce, 0x51, 0x62, 0xdf, 0x66, - 0x93, 0x86, 0xe0, 0xb1, 0xcf, 0x47, 0x3e, 0x6f, 0xf8, 0xbf, 0xc1, 0x86, - 0x5f, 0x6f, 0xa5, 0xb9, 0x6e, 0xed, 0x7f, 0x86, 0x3b, 0x47, 0x4c, 0x9d, - 0x37, 0xa6, 0xbb, 0x20, 0x86, 0x9a, 0x42, 0x65, 0x30, 0xd0, 0xd4, 0x10, - 0x3e, 0x9e, 0x91, 0x91, 0x25, 0xa5, 0x36, 0xc2, 0x80, 0xe7, 0xf4, 0x0f, - 0xd3, 0xc6, 0x5b, 0x14, 0x30, 0xe8, 0x06, 0x23, 0xbc, 0x2e, 0xfa, 0x55, - 0x31, 0x55, 0x53, 0x88, 0x94, 0xcb, 0x96, 0x36, 0x1c, 0x40, 0xc8, 0x29, - 0x98, 0x08, 0x90, 0x9b, 0xf9, 0x1a, 0x59, 0xb1, 0xf6, 0x22, 0x56, 0x7c, - 0x21, 0x3b, 0x9b, 0xe0, 0x24, 0x44, 0xbf, 0xc1, 0x69, 0xd3, 0x5b, 0x00, - 0x48, 0x52, 0x66, 0x3d, 0x7e, 0x51, 0x72, 0x24, 0x32, 0xfb, 0x66, 0xbe, - 0x3c, 0x17, 0x86, 0xcd, 0x69, 0xc7, 0x6e, 0x98, 0x9d, 0x11, 0x0b, 0xbf, - 0x68, 0xc3, 0xd9, 0x55, 0xf2, 0x32, 0x12, 0x9d, 0xf2, 0x0f, 0x36, 0xd2, - 0xac, 0x79, 0x91, 0xe3, 0xac, 0xcd, 0xa4, 0x2b, 0xc8, 0xb7, 0x7c, 0xf9, - 0x04, 0xc6, 0x18, 0xac, 0xef, 0xc5, 0x42, 0x34, 0xfa, 0xad, 0xaa, 0xfc, - 0x80, 0xf9, 0x44, 0xf9, 0xc0, 0x7a, 0xd1, 0xdb, 0xc2, 0x49, 0xd2, 0xeb, - 0x05, 0xae, 0x73, 0xdb, 0x11, 0x30, 0x7d, 0x02, 0x36, 0x79, 0x50, 0x30, - 0x3e, 0x6c, 0x85, 0x1d, 0x25, 0xef, 0x46, 0xf9, 0x8e, 0x39, 0xc2, 0x34, - 0xc7, 0xae, 0x01, 0xa9, 0x2b, 0x32, 0xb6, 0x83, 0x09, 0xd2, 0xf5, 0x29, - 0x09, 0xe4, 0x3a, 0x10, 0x8b, 0x71, 0xb6, 0x18, 0x1e, 0xe1, 0x38, 0xb5, - 0x79, 0x9f, 0xbc, 0xc0, 0x0c, 0x42, 0x27, 0x2f, 0xbd, 0xe4, 0x51, 0x64, - 0xb8, 0x38, 0xcc, 0x9b, 0xed, 0x00, 0x7a, 0xbe, 0xd9, 0xf1, 0x07, 0x04, - 0xbd, 0xe7, 0x01, 0x1e, 0x27, 0xb2, 0x38, 0x18, 0xb0, 0x1b, 0x55, 0xed, - 0x61, 0xd7, 0x4e, 0x11, 0x5e, 0x9e, 0x6c, 0x60, 0x2a, 0x2a, 0x2b, 0x2f, - 0x51, 0x57, 0x28, 0xed, 0x7c, 0xbc, 0x20, 0xa3, 0xd7, 0x04, 0xf9, 0xb4, - 0x15, 0x2b, 0x70, 0x72, 0x05, 0x69, 0x55, 0xe1, 0x91, 0x86, 0xd4, 0x4a, - 0xb2, 0x00, 0x85, 0x2b, 0xfa, 0xe4, 0x06, 0x68, 0x36, 0x30, 0x8d, 0x70, - 0xd6, 0x99, 0x6e, 0xda, 0x9c, 0x1b, 0xd3, 0x4e, 0x49, 0xf5, 0xa5, 0x46, - 0x85, 0xc7, 0xc7, 0x38, 0xa5, 0x8f, 0x74, 0xa0, 0xee, 0xea, 0xf8, 0x1b, - 0x24, 0xd1, 0x55, 0xe2, 0xe7, 0x53, 0x9d, 0xc8, 0x72, 0xba, 0x8b, 0x3b, - 0xa0, 0x17, 0x28, 0x81, 0x92, 0x10, 0x68, 0xa6, 0x4d, 0x39, 0xb8, 0x6c, - 0xcd, 0xaf, 0x08, 0x86, 0x59, 0xcc, 0x51, 0x81, 0x8a, 0x33, 0x41, 0x4f, - 0x18, 0x84, 0x4e, 0xd9, 0x57, 0xbc, 0xca, 0x0a, 0xaf, 0x26, 0x70, 0x0c, - 0x65, 0x9e, 0x44, 0x46, 0x7c, 0x0c, 0x0a, 0x06, 0x27, 0x24, 0xf0, 0x0e, - 0x79, 0x2c, 0x89, 0xe1, 0xc1, 0x60, 0xa4, 0x62, 0xc8, 0xa3, 0x06, 0xbb, - 0xe6, 0x42, 0x98, 0x75, 0x3b, 0xd3, 0x68, 0xfb, 0x35, 0x1c, 0x66, 0x8b, - 0x0c, 0x84, 0x8a, 0x76, 0x1c, 0x5f, 0x0a, 0x61, 0x1e, 0xfc, 0x5a, 0x8a, - 0xb8, 0x96, 0x10, 0xab, 0x49, 0x79, 0x51, 0x91, 0x4f, 0x1f, 0x0d, 0x00, - 0x8a, 0xc9, 0x13, 0xd8, 0x75, 0x0a, 0xb2, 0x1a, 0x0c, 0xc8, 0x43, 0x26, - 0x48, 0xc8, 0x05, 0x02, 0x99, 0x1f, 0xf3, 0x4d, 0xcf, 0x13, 0x57, 0x7f, - 0x40, 0x2e, 0x85, 0x11, 0x78, 0x5e, 0x71, 0xdc, 0x1a, 0x45, 0x0e, 0xe6, - 0x77, 0x4d, 0xcb, 0x6f, 0xe8, 0xd2, 0x3a, 0x9b, 0x36, 0x3c, 0x5b, 0x88, - 0x25, 0xfb, 0xab, 0x0d, 0xdc, 0x67, 0x9b, 0x7b, 0x1a, 0x36, 0xef, 0x9a, - 0xec, 0xe3, 0x45, 0xd3, 0xe8, 0xbd, 0x19, 0x58, 0x86, 0xaf, 0xda, 0xc3, - 0xc3, 0x34, 0xde, 0x05, 0x85, 0x81, 0xd6, 0xda, 0x8d, 0x38, 0xc4, 0xe4, - 0x28, 0x4c, 0x7c, 0x8a, 0x19, 0xb6, 0xae, 0x96, 0x3f, 0xad, 0xcc, 0x1f, - 0x85, 0xfd, 0x71, 0x05, 0x60, 0x81, 0x10, 0xca, 0x02, 0xfb, 0x91, 0xa6, - 0xc0, 0x7e, 0xd8, 0x56, 0x25, 0x23, 0x07, 0x48, 0xa2, 0x21, 0x2d, 0x2c, - 0x98, 0xce, 0x28, 0xf5, 0xaa, 0x5d, 0x40, 0x33, 0x08, 0x21, 0x57, 0x41, - 0x6e, 0x50, 0xa1, 0x40, 0x0a, 0xa1, 0x9d, 0xbf, 0x39, 0x88, 0x36, 0xb8, - 0xc7, 0x7d, 0xad, 0x7d, 0x38, 0x9d, 0xf8, 0x3d, 0x20, 0xe2, 0xdc, 0x03, - 0x80, 0x1c, 0x54, 0x9e, 0xa4, 0x13, 0x5d, 0x07, 0xa4, 0xf5, 0x39, 0x34, - 0x2f, 0x18, 0x62, 0x63, 0x59, 0x35, 0x8f, 0x04, 0x20, 0xf1, 0x30, 0x2d, - 0xc2, 0xdc, 0x34, 0xa8, 0x9b, 0x0b, 0x79, 0xc8, 0xea, 0x9d, 0x2a, 0x1a, - 0xdf, 0x41, 0x2d, 0xb0, 0x91, 0x59, 0x96, 0x51, 0x0d, 0xe8, 0xc8, 0x46, - 0x65, 0x38, 0xaa, 0x92, 0x0f, 0x57, 0xd7, 0x17, 0xec, 0x29, 0xc4, 0x1d, - 0x71, 0x58, 0x92, 0x87, 0xc8, 0x6b, 0xca, 0xc4, 0x8c, 0x99, 0x79, 0xba, - 0x7d, 0x89, 0xbe, 0x05, 0x80, 0x6a, 0x24, 0xad, 0xc3, 0x32, 0x46, 0x6f, - 0x4f, 0x84, 0xf0, 0xf8, 0x98, 0x4d, 0x85, 0xbc, 0x88, 0x6f, 0x50, 0x90, - 0x50, 0x99, 0x60, 0xb0, 0x7e, 0x31, 0x76, 0xc9, 0xce, 0xd9, 0x3d, 0xa7, - 0x07, 0x5d, 0x20, 0x90, 0xad, 0xaf, 0x9d, 0x45, 0x8e, 0xe8, 0x96, 0x8c, - 0x09, 0xea, 0x7e, 0xe4, 0x02, 0x47, 0x3c, 0x2c, 0x04, 0x57, 0x2e, 0xbd, - 0xc4, 0x43, 0x49, 0x88, 0x4d, 0x80, 0x5c, 0xd3, 0x47, 0x4e, 0x7d, 0x23, - 0x0e, 0x79, 0x48, 0x73, 0xca, 0x20, 0x1c, 0x20, 0x58, 0x98, 0xbb, 0x3c, - 0xf1, 0x77, 0x47, 0x27, 0xcd, 0x3b, 0xfd, 0x24, 0x4f, 0x23, 0x7a, 0x5f, - 0xce, 0x88, 0x87, 0x13, 0x81, 0x92, 0xba, 0x7a, 0x49, 0x19, 0x57, 0x9c, - 0x9e, 0x9c, 0xd8, 0xf8, 0xa3, 0x65, 0xf1, 0x63, 0x6c, 0x55, 0x1f, 0x47, - 0x3c, 0xbc, 0xc5, 0xd1, 0x9c, 0xc4, 0x0c, 0x2b, 0xd3, 0x26, 0x4e, 0xe9, - 0xa8, 0x77, 0x07, 0x21, 0x42, 0x09, 0x0c, 0xdf, 0xee, 0x86, 0x13, 0xd8, - 0x1c, 0x7b, 0x66, 0xd8, 0x28, 0xa9, 0xd7, 0x39, 0x92, 0x8a, 0x30, 0xed, - 0xba, 0x50, 0x25, 0xf2, 0x97, 0x05, 0x60, 0x4f, 0x3c, 0x29, 0x44, 0xcf, - 0xe1, 0x0b, 0xec, 0x7d, 0xa4, 0xec, 0x83, 0x0c, 0xd1, 0xa7, 0x15, 0x74, - 0xfb, 0x22, 0xba, 0x0e, 0xba, 0x16, 0x41, 0x49, 0x89, 0x29, 0xea, 0x39, - 0x93, 0x7c, 0x67, 0x30, 0x40, 0xb2, 0x9d, 0xdf, 0xc3, 0x69, 0xeb, 0xba, - 0x74, 0xaa, 0x26, 0x22, 0x69, 0x2c, 0x32, 0xd9, 0xca, 0x82, 0xd4, 0xe5, - 0x0b, 0x0a, 0x45, 0x95, 0x53, 0xcf, 0x0c, 0xb1, 0x35, 0xda, 0x0f, 0x0b, - 0x81, 0x94, 0x3a, 0xd9, 0xdc, 0xca, 0xbc, 0x21, 0x01, 0xfc, 0x82, 0xe6, - 0x25, 0xcc, 0x82, 0x53, 0xec, 0x93, 0xa3, 0xe9, 0x13, 0x61, 0xfc, 0x32, - 0x85, 0x2b, 0xf8, 0x23, 0x54, 0xd7, 0xa7, 0x4e, 0x37, 0x2d, 0x95, 0xa9, - 0x5c, 0x04, 0x1e, 0x07, 0x65, 0x46, 0x16, 0xfa, 0xa9, 0x39, 0x80, 0x14, - 0xca, 0x2a, 0x65, 0x29, 0xc9, 0xeb, 0x7f, 0x67, 0x40, 0xa5, 0xc9, 0xaf, - 0x9b, 0x05, 0xc1, 0x89, 0x16, 0xb9, 0x89, 0x2f, 0xba, 0xe2, 0xf8, 0xdb, - 0xc4, 0xff, 0xad, 0x8a, 0xfc, 0xba, 0x2d, 0xd5, 0xeb, 0x90, 0x11, 0x5c, - 0x05, 0x5c, 0x9a, 0x11, 0x2d, 0xca, 0x78, 0xcb, 0x06, 0xdd, 0x17, 0xee, - 0x20, 0x81, 0x59, 0x25, 0x20, 0xb1, 0x6b, 0xc9, 0xbd, 0x0c, 0x01, 0xda, - 0xb8, 0x7a, 0x47, 0x8f, 0xe6, 0x2e, 0xc7, 0x2f, 0x2e, 0x22, 0x72, 0x1d, - 0xf5, 0xe2, 0x86, 0x32, 0x50, 0xa2, 0xa2, 0x4d, 0x5c, 0x5c, 0x74, 0xa5, - 0xd7, 0x6c, 0xea, 0x44, 0xce, 0x2e, 0x8d, 0x77, 0x61, 0xed, 0x31, 0x9d, - 0xec, 0xa8, 0x08, 0x2c, 0x64, 0xd8, 0x2f, 0xc5, 0x48, 0x60, 0xec, 0x28, - 0x95, 0x15, 0x69, 0xed, 0x06, 0x43, 0x54, 0xda, 0xf5, 0x35, 0x5e, 0x62, - 0x9a, 0x16, 0x75, 0xce, 0x82, 0x49, 0xdd, 0x50, 0x1e, 0x93, 0x07, 0x15, - 0x03, 0x7b, 0x48, 0xb5, 0xeb, 0x06, 0xad, 0xad, 0xe8, 0xf1, 0xc7, 0x9f, - 0x87, 0xae, 0x53, 0x19, 0x36, 0xd6, 0x83, 0x17, 0x8f, 0xd2, 0xf4, 0x95, - 0xb8, 0x9d, 0x43, 0x8d, 0x93, 0x21, 0x62, 0x45, 0x30, 0x73, 0x84, 0xe1, - 0x15, 0xe6, 0xf5, 0x0a, 0xaf, 0x70, 0xa8, 0x14, 0x4e, 0xdb, 0xd6, 0xd9, - 0x55, 0x5c, 0xb4, 0xe8, 0xc9, 0x4b, 0x54, 0xc9, 0xa9, 0x7f, 0x57, 0x7f, - 0x98, 0xa5, 0x23, 0x9b, 0x17, 0xd7, 0x52, 0xc9, 0x62, 0x08, 0x9c, 0xe4, - 0x64, 0x21, 0x77, 0x70, 0xf3, 0xe9, 0xba, 0x50, 0x84, 0x00, 0xb4, 0x93, - 0xa2, 0x77, 0x7d, 0x2a, 0x8e, 0xe4, 0x95, 0xea, 0x9a, 0x22, 0x0b, 0x24, - 0x50, 0x4b, 0x00, 0x45, 0xdd, 0xa9, 0xeb, 0x0c, 0x01, 0x57, 0x1f, 0x9e, - 0x32, 0xc5, 0x78, 0x71, 0x83, 0xf9, 0x8f, 0x7d, 0x47, 0x06, 0xfe, 0x35, - 0x9a, 0xb7, 0xe4, 0xfe, 0x62, 0xd2, 0x3a, 0x3a, 0xa2, 0xfc, 0x96, 0x18, - 0xa1, 0x8e, 0xe5, 0x9b, 0x30, 0xfe, 0x55, 0x2f, 0x01, 0x4b, 0x66, 0x09, - 0x6a, 0xe7, 0xb9, 0x69, 0xe9, 0xcc, 0x0c, 0x4d, 0x66, 0x13, 0x21, 0xcb, - 0xed, 0xac, 0x92, 0x2e, 0x16, 0xba, 0xcc, 0x79, 0xf9, 0x8e, 0x9d, 0x51, - 0xd3, 0x1c, 0x6c, 0xd3, 0xd7, 0x7e, 0xa8, 0xf3, 0xe2, 0x5e, 0xcb, 0xc0, - 0xca, 0xd8, 0xb9, 0x4e, 0xdd, 0x8d, 0xd2, 0x3b, 0xf8, 0x4d, 0xe2, 0x89, - 0xd2, 0x9b, 0xb7, 0x70, 0xdd, 0xc7, 0x76, 0x22, 0x33, 0xf7, 0x63, 0x81, - 0xdf, 0x3d, 0x35, 0xad, 0xf6, 0xa5, 0xcc, 0xd9, 0x5d, 0xac, 0x8a, 0x25, - 0xf1, 0xca, 0x1a, 0x24, 0x88, 0xe8, 0xd9, 0x44, 0xf4, 0xb4, 0x45, 0x1a, - 0x21, 0x0f, 0xe4, 0x02, 0xc7, 0x04, 0xd8, 0x0f, 0x62, 0x9f, 0xf2, 0xbd, - 0x35, 0xbd, 0x67, 0x0b, 0x74, 0x67, 0xf2, 0x69, 0x4e, 0x1c, 0x96, 0x8a, - 0x11, 0x22, 0xc4, 0xf9, 0xe7, 0xf3, 0xf7, 0x70, 0x95, 0xb5, 0xb1, 0x0f, - 0x09, 0x22, 0x86, 0x8b, 0x9e, 0xdb, 0x21, 0x77, 0x3f, 0xe4, 0x8b, 0xd5, - 0x00, 0x5b, 0xb3, 0xa1, 0xd0, 0x04, 0x40, 0x36, 0x8f, 0x00, 0x21, 0xc1, - 0x9d, 0x66, 0xb4, 0x5a, 0xbe, 0x05, 0x1f, 0x43, 0xaf, 0x52, 0xaf, 0x5d, - 0x1f, 0xcc, 0x16, 0xf8, 0x7a, 0xe0, 0x44, 0x5b, 0x34, 0x9e, 0xea, 0xce, - 0x4a, 0xf6, 0x32, 0xd1, 0x47, 0xf0, 0x64, 0x5e, 0x74, 0x8d, 0x59, 0xbd, - 0x37, 0x6a, 0x29, 0x1f, 0xd4, 0xd5, 0x08, 0xf2, 0x49, 0x27, 0x1f, 0x81, - 0x71, 0xfd, 0x4e, 0x7a, 0x04, 0x5b, 0x71, 0x15, 0xbe, 0x5c, 0x5d, 0x29, - 0x66, 0x3e, 0x43, 0x21, 0xf5, 0x52, 0xbe, 0x7a, 0x5b, 0x57, 0x72, 0xc5, - 0xac, 0x70, 0xee, 0xc1, 0x1d, 0x1b, 0xd1, 0x17, 0x02, 0x34, 0x24, 0x29, - 0xaf, 0x9b, 0x4b, 0x16, 0x7e, 0x14, 0x50, 0x9e, 0xb7, 0x4a, 0xec, 0xa9, - 0xeb, 0x75, 0x9b, 0xe9, 0x7d, 0xff, 0x0a, 0x29, 0x3e, 0x87, 0xfc, 0x9e, - 0xb2, 0x87, 0x40, 0xce, 0xea, 0xb9, 0x94, 0xd3, 0x13, 0xa0, 0x2f, 0xad, - 0x79, 0x68, 0xe6, 0x01, 0x7c, 0x2c, 0x69, 0x3c, 0xf3, 0x2a, 0xbd, 0x45, - 0x1a, 0xcf, 0xed, 0x8b, 0xdb, 0xa6, 0xf0, 0x7c, 0x72, 0xbb, 0xbe, 0x45, - 0xf2, 0x5d, 0x96, 0x5c, 0x5f, 0xe8, 0x68, 0x87, 0xcc, 0x6a, 0x2b, 0xa0, - 0xf3, 0x61, 0xc6, 0xc5, 0xa3, 0x0a, 0x66, 0x3e, 0x50, 0x82, 0x27, 0xc8, - 0x2b, 0x35, 0x6a, 0x46, 0x58, 0x8a, 0x72, 0xfa, 0x1f, 0xde, 0xea, 0xd6, - 0x55, 0x82, 0xe2, 0x58, 0xc4, 0x40, 0xd9, 0xc5, 0x4d, 0x13, 0x51, 0x12, - 0xeb, 0xbc, 0xd7, 0xf9, 0x79, 0xcc, 0x65, 0x60, 0xf2, 0x77, 0xfa, 0xf6, - 0x79, 0xd6, 0xd7, 0x59, 0x15, 0x94, 0xc0, 0xe5, 0xd3, 0xb2, 0x49, 0xcc, - 0xad, 0xe3, 0xb1, 0x4c, 0x72, 0x9f, 0x96, 0x61, 0x42, 0x6d, 0x2e, 0x9e, - 0x18, 0x97, 0x4b, 0x4e, 0x6c, 0xed, 0xe8, 0x7d, 0x79, 0x9a, 0xac, 0x36, - 0x2f, 0x1b, 0x04, 0x81, 0x21, 0xb6, 0xf6, 0xd2, 0xb4, 0xa2, 0x19, 0x09, - 0xc0, 0x52, 0x6e, 0x1c, 0x5d, 0x92, 0xdd, 0x4e, 0xbc, 0x3a, 0xc0, 0x87, - 0xdf, 0xc4, 0xc4, 0x0f, 0xf4, 0x57, 0xd7, 0xeb, 0xa2, 0x31, 0xb4, 0x53, - 0x67, 0xc0, 0x6f, 0x9f, 0x01, 0x46, 0x1d, 0xe6, 0x6c, 0xa7, 0xcd, 0x33, - 0x7d, 0xdf, 0xdd, 0x6e, 0x04, 0x99, 0xbe, 0xaf, 0xe3, 0x0c, 0x7b, 0x17, - 0x84, 0xf6, 0x6b, 0x0d, 0xce, 0xe2, 0x02, 0x8f, 0x13, 0xf1, 0x22, 0x5a, - 0xbe, 0xac, 0x75, 0xa8, 0xb7, 0x34, 0x0f, 0xb3, 0xce, 0xdf, 0xd9, 0x61, - 0xb6, 0x19, 0xd4, 0x56, 0xe0, 0xfb, 0x57, 0xe8, 0x2a, 0x5f, 0xb8, 0x5c, - 0x7e, 0x16, 0x71, 0x9b, 0x30, 0x97, 0xf9, 0x70, 0xd3, 0xd7, 0xd9, 0xbc, - 0x56, 0xa1, 0x43, 0x62, 0xa7, 0xc6, 0x76, 0xb0, 0x75, 0xc7, 0x23, 0xe2, - 0x69, 0x4f, 0x4b, 0x9d, 0x35, 0xb4, 0x77, 0x4f, 0xcf, 0x72, 0x26, 0xf3, - 0xad, 0x15, 0x93, 0x01, 0xf8, 0x83, 0x7d, 0x47, 0x36, 0xb4, 0xf3, 0x5b, - 0x73, 0x97, 0xcf, 0x24, 0x01, 0xf4, 0xa5, 0x34, 0xd2, 0x4b, 0x1b, 0x02, - 0x8d, 0x02, 0x24, 0x1e, 0xb3, 0x55, 0x6a, 0x22, 0x63, 0xc3, 0x1c, 0x05, - 0xa0, 0x55, 0xaa, 0xa6, 0xeb, 0x51, 0xaf, 0xba, 0x1c, 0x86, 0x83, 0x5b, - 0xd0, 0x4d, 0x83, 0x98, 0xee, 0xb8, 0x41, 0x68, 0xb9, 0x3e, 0x07, 0xf1, - 0xb4, 0x02, 0xbc, 0x4e, 0x2e, 0xe5, 0xbd, 0x5b, 0xc5, 0xea, 0x8d, 0x5e, - 0xe9, 0x85, 0x0c, 0x7c, 0x76, 0x55, 0x2d, 0x6d, 0x26, 0xe4, 0x28, 0x52, - 0x21, 0x5f, 0x1a, 0xf3, 0x09, 0x8b, 0x68, 0x67, 0xd5, 0x6d, 0xb5, 0xdc, - 0xb2, 0xc8, 0x6e, 0xc5, 0x8e, 0x0d, 0xae, 0x7a, 0x50, 0x72, 0x85, 0x54, - 0x01, 0xb7, 0xd2, 0x7d, 0x2d, 0xf2, 0x9d, 0xaf, 0x66, 0xa1, 0x5c, 0xee, - 0xda, 0x17, 0x5f, 0x3a, 0xac, 0xd6, 0x2f, 0x51, 0x61, 0x6f, 0xc2, 0x99, - 0x59, 0x0d, 0xcd, 0x59, 0xbd, 0x33, 0xb1, 0xb2, 0x71, 0xe5, 0xb2, 0x29, - 0x6d, 0x11, 0xd7, 0xdc, 0x22, 0x62, 0x07, 0x36, 0x6d, 0xc9, 0x00, 0x3f, - 0x35, 0x62, 0xaf, 0x34, 0x89, 0x1d, 0x99, 0x2c, 0xae, 0x1b, 0x22, 0xca, - 0x6e, 0xad, 0x11, 0x17, 0xeb, 0x35, 0x45, 0x6a, 0x2a, 0x74, 0xae, 0x07, - 0xa6, 0xfe, 0x87, 0xfc, 0x44, 0x00, 0xf5, 0x40, 0x5f, 0x2e, 0x59, 0xb3, - 0xc1, 0xc6, 0x0c, 0x4f, 0x51, 0x7a, 0x80, 0x2c, 0x98, 0x30, 0xce, 0xd2, - 0x41, 0xce, 0x24, 0x40, 0xbd, 0xc5, 0x63, 0x1b, 0x08, 0xa2, 0xe5, 0x9b, - 0xf3, 0x80, 0x0d, 0x47, 0x16, 0x15, 0x47, 0x49, 0x9e, 0x89, 0x6e, 0x12, - 0xb1, 0x26, 0x80, 0x8b, 0x3f, 0x2c, 0x52, 0xd2, 0xc9, 0x29, 0x79, 0x2f, - 0x99, 0xe9, 0xbf, 0x44, 0x19, 0x58, 0x26, 0x3b, 0xad, 0xef, 0x1d, 0x80, - 0xfa, 0xc4, 0x8e, 0xfc, 0xd7, 0x8b, 0x5e, 0x6c, 0x41, 0x27, 0x9d, 0x56, - 0x24, 0x00, 0xbb, 0x98, 0x2e, 0x41, 0x01, 0x86, 0x0a, 0x21, 0x5b, 0xee, - 0xd8, 0xb4, 0xce, 0x6a, 0x21, 0x2a, 0xfa, 0xe0, 0xda, 0xcd, 0x6f, 0x04, - 0x32, 0xae, 0x47, 0xb7, 0x56, 0x1f, 0x6e, 0x4f, 0xbc, 0xde, 0xec, 0x7c, - 0xbc, 0x50, 0xed, 0x16, 0x8c, 0x39, 0x4f, 0x6d, 0xf5, 0x8b, 0xdc, 0x72, - 0x14, 0xcd, 0x0c, 0xd2, 0xba, 0xeb, 0xfa, 0xbc, 0xda, 0x48, 0x15, 0x5d, - 0x43, 0x1e, 0x3f, 0xc0, 0x1d, 0xe7, 0x60, 0x6a, 0x04, 0x13, 0xa5, 0xe2, - 0x94, 0xe9, 0x8b, 0x75, 0xd6, 0x68, 0x0c, 0xe9, 0x28, 0xd8, 0x8b, 0x2d, - 0xc5, 0x14, 0x6b, 0x04, 0x44, 0x66, 0xbd, 0x64, 0xc0, 0x3e, 0xe7, 0xff, - 0x06, 0x04, 0x61, 0x63, 0x50, 0x31, 0x78, 0x51, 0x2a, 0x4b, 0xa3, 0xa8, - 0x26, 0x8b, 0x00, 0xbd, 0xf4, 0x18, 0xba, 0x26, 0x07, 0x39, 0x4b, 0xee, - 0xa7, 0xaa, 0x81, 0xc3, 0x34, 0x34, 0xd1, 0x25, 0xcd, 0x48, 0xe7, 0xbb, - 0x40, 0x16, 0x7a, 0x46, 0xb5, 0x48, 0xd3, 0xbf, 0xf1, 0xad, 0xcc, 0x61, - 0x77, 0xd3, 0x36, 0x22, 0x43, 0xc5, 0x57, 0xae, 0x94, 0x6b, 0x82, 0xcf, - 0x06, 0x88, 0xf5, 0x3c, 0x69, 0x20, 0xbd, 0xba, 0x19, 0xf2, 0x1e, 0x69, - 0x74, 0xd5, 0x95, 0xf0, 0x74, 0x98, 0xaf, 0x84, 0xd8, 0x77, 0x0a, 0xd3, - 0x83, 0x7c, 0x30, 0xdb, 0xad, 0xa0, 0xb3, 0xf7, 0x37, 0xb7, 0xad, 0xe4, - 0xd4, 0xb3, 0x3b, 0x16, 0x39, 0xe7, 0xee, 0xdc, 0x1a, 0x14, 0xb4, 0x51, - 0x54, 0xe8, 0x99, 0x20, 0xd3, 0xc5, 0xa0, 0xd7, 0x50, 0x02, 0xff, 0x86, - 0x85, 0xb9, 0x5c, 0x73, 0x3a, 0xd7, 0x3b, 0xc1, 0x36, 0x6e, 0xed, 0xb9, - 0x9e, 0x58, 0x2b, 0x5c, 0x4e, 0x7c, 0x3c, 0x8e, 0x10, 0x7b, 0x4d, 0x12, - 0x78, 0xe0, 0xde, 0x9b, 0x85, 0x37, 0xfb, 0x69, 0xc9, 0xe5, 0x64, 0xdd, - 0xdd, 0xac, 0x02, 0xd8, 0x4a, 0x67, 0xdd, 0x09, 0xab, 0x42, 0xb2, 0xd9, - 0x96, 0xaf, 0x55, 0x3a, 0x3f, 0x67, 0xf6, 0x24, 0x76, 0xbc, 0xc6, 0x13, - 0xd3, 0xf5, 0xe8, 0x79, 0x8d, 0x3c, 0xd5, 0x35, 0x72, 0x87, 0xe7, 0xfe, - 0x83, 0x8b, 0xea, 0xab, 0xb5, 0x0f, 0x99, 0xe4, 0x53, 0x1b, 0x1f, 0xaf, - 0x49, 0x75, 0x87, 0x7c, 0x69, 0x04, 0xfc, 0x81, 0xad, 0xd2, 0x8e, 0x2c, - 0x10, 0x39, 0xc7, 0xa6, 0xb5, 0xf9, 0x45, 0x43, 0x9a, 0x17, 0x29, 0xc7, - 0x66, 0xc6, 0xa7, 0xb6, 0xed, 0x29, 0xde, 0x61, 0x96, 0x95, 0xc7, 0x5c, - 0x06, 0x26, 0x7b, 0xa7, 0xcd, 0x05, 0x91, 0x50, 0x88, 0x9a, 0xbf, 0xdd, - 0x1d, 0x96, 0x4d, 0x50, 0x50, 0xb2, 0x65, 0x2a, 0x5f, 0xc9, 0x36, 0x6d, - 0x00, 0xd8, 0xf1, 0xe4, 0xcc, 0xe0, 0x32, 0xef, 0xa7, 0x62, 0x80, 0xb4, - 0x07, 0xc6, 0x16, 0xa4, 0x44, 0x30, 0xae, 0x00, 0x20, 0x3c, 0xd0, 0x20, - 0x31, 0xed, 0xd1, 0x3a, 0xc4, 0x77, 0x8d, 0x8d, 0x02, 0x3b, 0x39, 0x46, - 0x0d, 0x4d, 0xb7, 0x31, 0xaa, 0x5d, 0x05, 0x44, 0xd4, 0x27, 0x57, 0x4e, - 0x00, 0x04, 0x74, 0x00, 0x23, 0x0e, 0x69, 0xe4, 0x00, 0xa0, 0xa7, 0x44, - 0xa6, 0x98, 0xcf, 0x9e, 0x68, 0x07, 0x4b, 0x64, 0x04, 0xe5, 0x9e, 0x82, - 0xcc, 0xbe, 0x86, 0xce, 0xb9, 0x21, 0xcf, 0x33, 0xc4, 0x34, 0x90, 0x21, - 0x5e, 0x67, 0x75, 0x4e, 0x11, 0x5b, 0x11, 0x47, 0x27, 0x95, 0xd0, 0x08, - 0xa3, 0x20, 0x9f, 0x9c, 0xa3, 0xc4, 0xeb, 0x69, 0x48, 0xf3, 0x0e, 0xc9, - 0xb2, 0x55, 0x9f, 0xe2, 0x76, 0xbb, 0xd8, 0x47, 0xbe, 0x32, 0x90, 0xfa, - 0x88, 0x37, 0x2a, 0xe3, 0x7a, 0x48, 0x62, 0xf7, 0x81, 0xc2, 0x2e, 0x29, - 0x64, 0x17, 0xa2, 0xa1, 0x7c, 0xe4, 0xce, 0x56, 0x26, 0x05, 0x7c, 0x01, - 0x8c, 0xb8, 0x40, 0x4c, 0x19, 0xdd, 0xc7, 0xf2, 0xb5, 0x03, 0x23, 0x45, - 0x3f, 0x10, 0x73, 0xa3, 0x19, 0x45, 0x92, 0x12, 0x04, 0xcd, 0x60, 0xaa, - 0x78, 0x4e, 0x22, 0x8c, 0x14, 0x0e, 0x84, 0x3f, 0x83, 0x5c, 0x87, 0x1d, - 0xf3, 0x57, 0xec, 0x4b, 0x60, 0xa9, 0xa1, 0xb8, 0x33, 0xa4, 0x73, 0xa3, - 0x7e, 0xe8, 0x42, 0x52, 0xa1, 0x7a, 0x00, 0x38, 0xd1, 0x28, 0x21, 0xdd, - 0x63, 0x89, 0x79, 0xb1, 0x25, 0x1d, 0x3d, 0xdc, 0x8c, 0x62, 0xa2, 0x28, - 0x1a, 0x7a, 0x0b, 0xca, 0x55, 0x4c, 0x34, 0x0d, 0x21, 0xf6, 0x0a, 0xf3, - 0x9f, 0x47, 0x4c, 0x64, 0x0f, 0x76, 0x10, 0xf3, 0x61, 0x48, 0x16, 0x36, - 0x40, 0xe2, 0x8c, 0x0f, 0x71, 0x88, 0x75, 0x2b, 0xe4, 0x36, 0x06, 0xab, - 0x56, 0x9c, 0x84, 0x34, 0xcf, 0x53, 0x2a, 0xd1, 0x6f, 0x86, 0x2e, 0x5c, - 0x79, 0x82, 0x16, 0x87, 0x3e, 0xe4, 0xa1, 0x47, 0x3f, 0x23, 0xa6, 0xc0, - 0xe8, 0xe8, 0x7e, 0x56, 0x92, 0x3e, 0xaa, 0x76, 0x5a, 0x9a, 0x4e, 0x72, - 0xae, 0xd0, 0x92, 0x9d, 0xaf, 0x50, 0x62, 0x72, 0x8e, 0xdc, 0x35, 0xba, - 0x15, 0x94, 0xe0, 0x3b, 0x8a, 0x75, 0x2a, 0x51, 0xb5, 0xd2, 0x81, 0xac, - 0x4c, 0xc3, 0x28, 0x2c, 0x84, 0x42, 0xa8, 0x6e, 0xfb, 0x62, 0x21, 0xbc, - 0xa0, 0x99, 0xc0, 0x79, 0xee, 0x83, 0x52, 0x68, 0xce, 0x6d, 0x19, 0x73, - 0x95, 0x8f, 0xe7, 0xf3, 0x94, 0xd9, 0xd2, 0x91, 0x3c, 0xe8, 0x55, 0xe1, - 0x18, 0x76, 0xe2, 0x68, 0x23, 0xe6, 0x8d, 0xc4, 0x39, 0xdf, 0x70, 0xd9, - 0x9f, 0x2c, 0xf4, 0x61, 0x7d, 0x29, 0x9a, 0x63, 0xc7, 0x6c, 0x25, 0x65, - 0x91, 0x8f, 0xd6, 0x37, 0xe4, 0x2a, 0x2a, 0x4f, 0x9b, 0x50, 0xd6, 0x79, - 0x59, 0xdf, 0xb8, 0xb0, 0xd5, 0xda, 0x55, 0xed, 0x42, 0x9a, 0xac, 0x6b, - 0x35, 0x5e, 0xd8, 0x58, 0xcc, 0xc7, 0xb2, 0x90, 0xa7, 0x8b, 0x78, 0x20, - 0xee, 0xa6, 0x52, 0xe3, 0x05, 0x1c, 0x6f, 0xbb, 0x80, 0x93, 0x2f, 0x6b, - 0x56, 0xb8, 0xe0, 0xca, 0x53, 0x3a, 0x89, 0x29, 0x9d, 0x2e, 0xc9, 0x7b, - 0x3e, 0xc2, 0x7f, 0xda, 0xec, 0x22, 0xdc, 0xac, 0x71, 0xe1, 0x2b, 0x5d, - 0x58, 0x38, 0xfa, 0x90, 0xf8, 0x08, 0x05, 0x04, 0xe4, 0xec, 0x06, 0xbd, - 0xf0, 0x78, 0x3f, 0x02, 0x45, 0x4e, 0xe3, 0x0b, 0x63, 0x81, 0x8f, 0x4a, - 0xea, 0x34, 0x64, 0x22, 0xf6, 0xfb, 0x21, 0x2f, 0x18, 0xa9, 0xd4, 0xf0, - 0x87, 0x1a, 0x5d, 0x21, 0xec, 0xfc, 0x0a, 0x21, 0x5c, 0x83, 0x2c, 0x25, - 0x51, 0x9b, 0xa8, 0xf1, 0x35, 0xbd, 0x36, 0xaa, 0xfa, 0x5d, 0x5e, 0x63, - 0xae, 0xa5, 0x4b, 0x0c, 0xcf, 0x72, 0xef, 0x78, 0x2f, 0xc0, 0x65, 0xee, - 0xa0, 0x10, 0x0a, 0x3a, 0xfa, 0x86, 0xfe, 0x4c, 0x80, 0x1d, 0xdd, 0x0a, - 0xbf, 0xd4, 0x9f, 0xa6, 0x6f, 0x26, 0xbb, 0xe5, 0x66, 0x6d, 0xe3, 0x81, - 0xb1, 0xd9, 0xd1, 0x7f, 0xf3, 0x13, 0xf9, 0xff, 0x73, 0x1f, 0x46, 0xdf, - 0x9c, 0xf4, 0xe1, 0x4c, 0x43, 0x3b, 0x29, 0x9b, 0x53, 0x61, 0x32, 0x1b, - 0x0f, 0x89, 0x56, 0x93, 0xcb, 0xe1, 0xb8, 0x6b, 0xe5, 0xf2, 0xaa, 0x96, - 0x67, 0x8c, 0x70, 0x5c, 0xe7, 0x2e, 0x99, 0xaa, 0x2b, 0xc4, 0x84, 0x78, - 0x8c, 0x00, 0xb6, 0x5e, 0xf8, 0x86, 0x38, 0x0e, 0x60, 0xff, 0x9d, 0xa6, - 0xf9, 0xa5, 0xe8, 0x4c, 0x7e, 0x70, 0xa9, 0x37, 0x27, 0x57, 0xcf, 0x66, - 0x67, 0x84, 0xe3, 0x7d, 0xdd, 0xd9, 0x8e, 0x22, 0xaf, 0x9e, 0xeb, 0x78, - 0x68, 0xdc, 0xff, 0xa1, 0x0e, 0xe2, 0xaf, 0x71, 0xa6, 0xf3, 0x49, 0x2e, - 0x0b, 0x3e, 0x23, 0x1d, 0xdd, 0xfb, 0x75, 0x47, 0xf7, 0xa9, 0xd8, 0x5b, - 0x3d, 0xe4, 0xed, 0xf9, 0x5f, 0xa9, 0xe4, 0xad, 0xd1, 0xf0, 0x0e, 0x26, - 0x1d, 0x4f, 0x95, 0xbc, 0x89, 0x86, 0x77, 0xb6, 0xbb, 0xf6, 0xec, 0x0a, - 0x89, 0x5d, 0x80, 0xe8, 0xea, 0x2e, 0xc4, 0x3b, 0x78, 0x77, 0x88, 0xd6, - 0x05, 0x6d, 0xa6, 0xd2, 0x1c, 0xcf, 0x76, 0xad, 0xea, 0xe2, 0x79, 0xa9, - 0x97, 0x1f, 0xc2, 0x4d, 0x12, 0x3b, 0xfe, 0xcf, 0x4c, 0x02, 0x96, 0xb2, - 0xc8, 0x63, 0x7a, 0x42, 0x13, 0xe1, 0x08, 0x18, 0xf4, 0x48, 0x24, 0xf5, - 0x5f, 0x5e, 0x0a, 0x3f, 0xcb, 0xd5, 0x67, 0xb9, 0xfa, 0x2c, 0x57, 0x9f, - 0x90, 0x5c, 0xbd, 0x2b, 0x93, 0x0f, 0x48, 0x35, 0xdb, 0x97, 0xeb, 0xe3, - 0x56, 0xba, 0xb6, 0xad, 0xbe, 0x78, 0x54, 0x53, 0xcd, 0x27, 0x32, 0x49, - 0x89, 0x89, 0x36, 0xe8, 0x6a, 0x88, 0xd7, 0x8a, 0x6e, 0x97, 0x2f, 0x16, - 0x79, 0xfb, 0x95, 0x1b, 0xf7, 0x1a, 0xcc, 0xd4, 0xe0, 0xac, 0x9e, 0xdc, - 0x70, 0x31, 0x59, 0x66, 0x3c, 0x2e, 0xc6, 0x8a, 0x8a, 0x28, 0x4c, 0x29, - 0x61, 0x05, 0x03, 0xac, 0x40, 0x78, 0xb0, 0xd9, 0xa9, 0xdb, 0xe3, 0xae, - 0x2d, 0xb8, 0x67, 0xe9, 0x46, 0x6f, 0xb4, 0x92, 0x67, 0x61, 0x1e, 0x03, - 0xd8, 0xb4, 0x0a, 0xa8, 0x96, 0x59, 0x60, 0x6a, 0x60, 0x50, 0x24, 0x63, - 0x80, 0x96, 0xc3, 0x1e, 0x42, 0x7b, 0x00, 0x47, 0xe1, 0x7f, 0xcb, 0x35, - 0xde, 0xeb, 0x35, 0xf4, 0xb2, 0xab, 0x2b, 0x24, 0xbb, 0x08, 0x4c, 0x68, - 0x4d, 0x72, 0xcd, 0x1e, 0x6d, 0xef, 0x80, 0x56, 0x02, 0x19, 0xca, 0xe7, - 0x7e, 0x5f, 0xa0, 0x18, 0x46, 0x21, 0x0b, 0x25, 0xf0, 0xd1, 0xa5, 0x44, - 0x18, 0xf5, 0x74, 0x9d, 0xa4, 0xc1, 0x20, 0x6e, 0xa6, 0x7d, 0x20, 0x22, - 0x47, 0x0a, 0xfe, 0xdc, 0xc3, 0x51, 0x44, 0x6b, 0x95, 0x29, 0x5a, 0x4e, - 0x9f, 0x80, 0xd9, 0x48, 0x3d, 0x52, 0xb5, 0x6c, 0xeb, 0x83, 0x23, 0xaa, - 0xe0, 0x45, 0x55, 0x64, 0xd2, 0x7e, 0xa5, 0xc1, 0x14, 0x8a, 0xa9, 0xad, - 0x58, 0x72, 0x7f, 0xc2, 0x38, 0x83, 0x27, 0x61, 0x67, 0x2b, 0x9b, 0x4c, - 0x04, 0xdd, 0x68, 0xb2, 0x5e, 0xaa, 0x30, 0x17, 0x5d, 0x99, 0x9f, 0xff, - 0x88, 0x8c, 0xc4, 0xfb, 0xfa, 0x11, 0xf9, 0x14, 0x92, 0xf2, 0xd3, 0xc8, - 0x66, 0x39, 0x6f, 0x02, 0x12, 0x29, 0xd3, 0x39, 0xb3, 0x02, 0x2e, 0x3f, - 0x67, 0xb8, 0xe7, 0x54, 0x61, 0x48, 0x48, 0xc6, 0x46, 0x5e, 0x85, 0xa3, - 0x1c, 0xaa, 0xbe, 0x09, 0x4b, 0xec, 0xb6, 0x19, 0x85, 0x26, 0x10, 0xe0, - 0x3a, 0x6f, 0x81, 0x56, 0x21, 0x59, 0x46, 0x89, 0x74, 0xad, 0xe4, 0x78, - 0xc8, 0x27, 0x8b, 0xeb, 0xba, 0x2a, 0xaf, 0x0d, 0x1a, 0x3b, 0xe9, 0x79, - 0x50, 0xd7, 0x96, 0x30, 0xac, 0xd1, 0xac, 0xe8, 0xc4, 0x25, 0x96, 0x5d, - 0x01, 0x69, 0xef, 0x16, 0x62, 0x51, 0xd7, 0x55, 0xf3, 0x50, 0x72, 0x3b, - 0x5f, 0x57, 0x3a, 0xcc, 0xca, 0x4e, 0x73, 0xd7, 0x33, 0xcc, 0x27, 0xeb, - 0x92, 0x5d, 0x93, 0x66, 0xc2, 0x96, 0xfc, 0xa1, 0xd3, 0x91, 0x84, 0xf5, - 0xb7, 0x73, 0x9d, 0x1c, 0x9b, 0x96, 0xb7, 0x74, 0xd9, 0x9a, 0x90, 0x88, - 0x0a, 0x41, 0xce, 0xa0, 0xa8, 0x77, 0xcc, 0x08, 0x91, 0x92, 0x90, 0xa2, - 0xe3, 0x6c, 0x2e, 0x73, 0xb4, 0x7e, 0x59, 0x12, 0x50, 0x86, 0x6e, 0x3b, - 0x54, 0x62, 0x51, 0x0e, 0x09, 0xcc, 0x36, 0x85, 0x12, 0x1e, 0x08, 0xea, - 0x67, 0x95, 0x3c, 0x2d, 0x9f, 0xe3, 0x6f, 0xcd, 0x5c, 0x83, 0xcc, 0x07, - 0xb1, 0x42, 0xa3, 0x43, 0xce, 0xc5, 0xdc, 0x7f, 0xbb, 0x9b, 0x82, 0x72, - 0x75, 0x25, 0x75, 0x84, 0xab, 0x3a, 0x79, 0x09, 0x69, 0xcf, 0x22, 0x26, - 0xbe, 0x5e, 0xab, 0xf9, 0xce, 0xa3, 0xdd, 0xf0, 0x2c, 0x5c, 0x13, 0xcb, - 0xa3, 0x1c, 0xa2, 0x4a, 0x8f, 0x22, 0x07, 0xa3, 0x9c, 0x7b, 0x44, 0x42, - 0x05, 0x50, 0x17, 0xe7, 0x5d, 0x73, 0xad, 0x4d, 0xeb, 0x56, 0x64, 0x33, - 0x7b, 0xa8, 0x1d, 0xfb, 0xe8, 0xca, 0xc0, 0x82, 0xd9, 0x39, 0x83, 0x39, - 0x63, 0x6e, 0x19, 0x4d, 0x4e, 0xbb, 0x10, 0x26, 0xee, 0x64, 0x47, 0x07, - 0x54, 0x28, 0xba, 0x36, 0x92, 0xca, 0xce, 0x8c, 0x3c, 0x9c, 0xe2, 0x4c, - 0x2a, 0x25, 0xaa, 0x1e, 0xee, 0x89, 0x06, 0x7c, 0xff, 0xde, 0x48, 0xe3, - 0xd0, 0xbc, 0x5d, 0x4d, 0x2b, 0x92, 0xb2, 0x88, 0x6a, 0x34, 0x90, 0x20, - 0x01, 0x4b, 0x44, 0x53, 0x88, 0xa6, 0x6c, 0xd6, 0x18, 0x48, 0xf7, 0x01, - 0x1d, 0xec, 0x8a, 0x4e, 0xe8, 0x8a, 0xbf, 0x6f, 0xa8, 0x09, 0x72, 0x5e, - 0x32, 0x70, 0x52, 0xf5, 0x2e, 0x35, 0x03, 0x5f, 0x52, 0x7a, 0x02, 0x59, - 0xe0, 0x6f, 0xb1, 0x1f, 0x7f, 0x07, 0x7c, 0x4f, 0x5c, 0x4e, 0x5e, 0x2d, - 0x6f, 0xc8, 0x33, 0x31, 0x65, 0x4f, 0x6d, 0xb7, 0xc8, 0x5c, 0xe6, 0xca, - 0x5f, 0x45, 0x65, 0x0e, 0x5a, 0xd0, 0xc1, 0x96, 0xbc, 0xad, 0x3d, 0x5a, - 0x80, 0x28, 0x99, 0x07, 0x93, 0x9a, 0x03, 0xc1, 0xe7, 0x07, 0x64, 0x1f, - 0x46, 0x26, 0x44, 0xa4, 0xcb, 0x3a, 0x10, 0x95, 0x69, 0x6b, 0xeb, 0x24, - 0xcb, 0x39, 0xfd, 0xc6, 0x4d, 0x4b, 0x0d, 0x93, 0x0f, 0x5f, 0x33, 0x94, - 0x1e, 0x7d, 0xee, 0x85, 0xd8, 0x58, 0x31, 0xba, 0x8e, 0xbf, 0x6c, 0xb7, - 0xe5, 0x38, 0x99, 0xdf, 0x42, 0x5b, 0x0f, 0xb5, 0x29, 0x36, 0xbe, 0x2b, - 0xfc, 0x4f, 0x72, 0xae, 0x7b, 0x41, 0x53, 0x7d, 0x48, 0xf2, 0x72, 0x58, - 0x42, 0xb7, 0xca, 0xf4, 0xb7, 0x8a, 0x75, 0x1c, 0xa3, 0x99, 0x4e, 0x58, - 0xc4, 0xcf, 0xd9, 0x42, 0x65, 0x3e, 0xf1, 0x3c, 0x95, 0xae, 0x29, 0x53, - 0x9d, 0x93, 0x67, 0x59, 0x7d, 0x66, 0x7b, 0xf8, 0x1f, 0x77, 0xc4, 0x6e, - 0x46, 0x68, 0x8f, 0xe9, 0x7d, 0x31, 0x29, 0x6f, 0x5b, 0x8b, 0x0f, 0x7f, - 0x7c, 0xe6, 0x36, 0x7b, 0xbc, 0xdc, 0x66, 0x82, 0xa5, 0xe3, 0x53, 0xb1, - 0x9b, 0xfd, 0xe3, 0x99, 0xdd, 0xec, 0x4e, 0x77, 0xbd, 0x9c, 0x4e, 0x40, - 0xbb, 0x05, 0x9a, 0xb0, 0x69, 0x55, 0x73, 0x6a, 0xa3, 0x25, 0xd6, 0x32, - 0x2d, 0x52, 0x40, 0x6f, 0xd2, 0xc1, 0xd6, 0xcc, 0x27, 0x0b, 0xf1, 0x67, - 0x53, 0xb2, 0xb3, 0xae, 0x99, 0x8e, 0x23, 0x16, 0xe3, 0xcb, 0xdc, 0xea, - 0xd4, 0xa6, 0x9a, 0x49, 0x22, 0x85, 0x12, 0x00, 0x02, 0xd8, 0x76, 0xd7, - 0x68, 0x4a, 0x89, 0x74, 0x4d, 0xed, 0xce, 0x5d, 0x49, 0xd5, 0x04, 0xd3, - 0xb6, 0x33, 0xee, 0xc2, 0x1c, 0x1d, 0x45, 0x65, 0x1d, 0x5f, 0x0d, 0x1f, - 0x85, 0xbe, 0x0a, 0xbb, 0xda, 0x75, 0x4b, 0xe9, 0x9e, 0x42, 0xa8, 0xcb, - 0xe0, 0xea, 0x95, 0xbf, 0xcc, 0x05, 0x5e, 0xa9, 0xfc, 0x00, 0x39, 0xbe, - 0x36, 0x88, 0x74, 0x8e, 0x5d, 0xd5, 0x5c, 0x17, 0x79, 0xe3, 0x75, 0x39, - 0x9a, 0x94, 0xe7, 0x6c, 0x17, 0xcb, 0xf1, 0xa0, 0xab, 0xce, 0x9d, 0x5c, - 0xb5, 0xef, 0x28, 0x49, 0x1e, 0xf1, 0xf1, 0x52, 0xb4, 0xa7, 0x66, 0x00, - 0xe7, 0xb6, 0x39, 0x98, 0xbe, 0x93, 0x92, 0xe4, 0xdc, 0x3d, 0xa3, 0x0a, - 0x19, 0x33, 0x31, 0xed, 0x68, 0x1f, 0x7c, 0xb3, 0x3b, 0x2b, 0xa9, 0x55, - 0x90, 0x7d, 0xa6, 0x69, 0x7b, 0x16, 0x5d, 0x90, 0x33, 0xa2, 0x99, 0xae, - 0x64, 0xc6, 0x59, 0xa2, 0x51, 0x3b, 0xf3, 0x56, 0x70, 0xde, 0x34, 0x47, - 0x26, 0xa9, 0xf6, 0x09, 0xf6, 0xe7, 0x66, 0x67, 0x75, 0x77, 0x49, 0x50, - 0xc9, 0x7e, 0x2d, 0x3f, 0x0a, 0xe5, 0x4a, 0x4c, 0x44, 0x5c, 0x71, 0xaa, - 0x00, 0xfb, 0x0f, 0x42, 0xe2, 0x9d, 0x76, 0x9c, 0x59, 0xf2, 0x27, 0xa5, - 0x6f, 0x59, 0x18, 0xec, 0x90, 0x8f, 0x24, 0x12, 0x85, 0x2e, 0x75, 0x64, - 0x63, 0xc9, 0x33, 0xd3, 0x56, 0xf6, 0x52, 0x68, 0x85, 0x58, 0x89, 0x7d, - 0xc1, 0x7a, 0x91, 0x9c, 0x3c, 0x7d, 0x44, 0x1b, 0x0e, 0x45, 0x93, 0xcc, - 0x2d, 0xf4, 0x9b, 0x34, 0x02, 0xcf, 0xc3, 0x42, 0xf8, 0xe6, 0xdb, 0x46, - 0xc8, 0x8a, 0x29, 0xd1, 0x5b, 0x66, 0xa7, 0x6c, 0xd5, 0x6f, 0x63, 0xf9, - 0x0a, 0x22, 0x07, 0xe8, 0x2b, 0x06, 0x76, 0x93, 0xfd, 0x97, 0xa0, 0xfb, - 0xe8, 0x97, 0x78, 0xb1, 0xc5, 0x70, 0x8d, 0x7f, 0xa9, 0x5d, 0x7e, 0xd6, - 0x97, 0xdc, 0x7f, 0x94, 0x23, 0x5a, 0x13, 0x84, 0xe3, 0xcc, 0xe8, 0xd9, - 0x1d, 0xa6, 0xc4, 0x39, 0x89, 0x78, 0xd9, 0x29, 0xe8, 0xcf, 0x4e, 0xb9, - 0x3c, 0xae, 0x46, 0x12, 0x73, 0x2e, 0x3f, 0x41, 0x76, 0x6a, 0x4e, 0x07, - 0x01, 0x1f, 0x35, 0x0f, 0x4d, 0xc1, 0x90, 0xfd, 0xcb, 0xc2, 0xd7, 0xcc, - 0x41, 0x3e, 0xbc, 0x51, 0x2d, 0xcf, 0x2c, 0xe4, 0xb4, 0x82, 0xc9, 0x34, - 0x06, 0xef, 0x08, 0x31, 0x0b, 0x6c, 0x35, 0xfb, 0x80, 0xd0, 0x09, 0x0d, - 0xa6, 0xed, 0x04, 0xdf, 0x05, 0x76, 0x71, 0x61, 0x88, 0x0f, 0x5c, 0xd0, - 0x87, 0xbe, 0xa4, 0xda, 0xc0, 0xb6, 0xca, 0xc6, 0x38, 0x72, 0xc4, 0xf1, - 0xcf, 0x1d, 0x27, 0xea, 0x24, 0xcf, 0x6d, 0x19, 0xaf, 0x51, 0xe2, 0x6f, - 0x7a, 0x86, 0x04, 0x99, 0x1f, 0x26, 0x27, 0x7f, 0xa7, 0xf8, 0x95, 0xa0, - 0x3b, 0x7a, 0x78, 0x43, 0x25, 0x2d, 0x00, 0x23, 0xc9, 0x84, 0x33, 0xe3, - 0xbc, 0xb3, 0x42, 0x00, 0x47, 0xbd, 0xd2, 0xf0, 0xe1, 0x82, 0x00, 0xaf, - 0x1a, 0x7e, 0x48, 0x46, 0xfe, 0x5c, 0xa3, 0xd4, 0x07, 0xe5, 0x86, 0x45, - 0x38, 0xee, 0x86, 0x94, 0xce, 0xbd, 0xf8, 0xf8, 0xe0, 0xed, 0x96, 0xdc, - 0x7c, 0x31, 0x75, 0xf3, 0xba, 0x4e, 0x5e, 0x64, 0x7a, 0x1b, 0x09, 0x87, - 0x1a, 0x84, 0x05, 0x19, 0x43, 0x3a, 0x8e, 0x97, 0xa8, 0xdf, 0x54, 0x3b, - 0x74, 0xf3, 0x8c, 0x38, 0x1b, 0x11, 0x8a, 0x03, 0x65, 0xd0, 0xe9, 0xa9, - 0x06, 0xaa, 0xde, 0xc8, 0xb7, 0xfe, 0x9e, 0xf0, 0x9f, 0xae, 0x31, 0x53, - 0x4a, 0x0a, 0x71, 0x94, 0x66, 0x69, 0x76, 0xb0, 0x74, 0x34, 0x25, 0x0b, - 0xa7, 0xca, 0x94, 0xa8, 0xfd, 0x62, 0x8b, 0x49, 0x96, 0x1f, 0x3b, 0x9b, - 0x6e, 0x4b, 0xda, 0xa5, 0xc6, 0x27, 0xc8, 0x0c, 0xcf, 0x85, 0xf9, 0x36, - 0xe7, 0x81, 0xcd, 0xca, 0x8d, 0x65, 0xfd, 0xc4, 0xa5, 0xa0, 0x1c, 0x1e, - 0xee, 0x52, 0xb1, 0x71, 0xa9, 0x29, 0xa4, 0xc2, 0xcd, 0x9f, 0x3f, 0x39, - 0xdc, 0x78, 0x6a, 0x46, 0x20, 0x08, 0x20, 0x04, 0xec, 0x6d, 0xd7, 0x43, - 0x98, 0x75, 0x83, 0xf3, 0xd6, 0x34, 0x4b, 0xeb, 0x82, 0x49, 0x64, 0x48, - 0x22, 0xd8, 0x0f, 0x35, 0x90, 0x69, 0x01, 0x26, 0x10, 0x6c, 0x89, 0x16, - 0x19, 0xec, 0x28, 0x06, 0x08, 0x25, 0x30, 0x00, 0x03, 0x81, 0x73, 0x0a, - 0xf1, 0x81, 0x07, 0x04, 0x57, 0x81, 0xdc, 0x50, 0x24, 0x07, 0x3c, 0x49, - 0x11, 0xb5, 0x95, 0x3b, 0x52, 0x53, 0x23, 0xcd, 0x3a, 0x72, 0xa0, 0x84, - 0x45, 0xdc, 0x8e, 0x07, 0x11, 0xc6, 0xa0, 0x4d, 0x88, 0xfd, 0x05, 0xee, - 0x0e, 0xb4, 0x51, 0x50, 0xd6, 0x66, 0x4a, 0xa5, 0xea, 0x31, 0x4e, 0x07, - 0xf7, 0xcc, 0x14, 0xbd, 0xba, 0xd9, 0x8d, 0x2b, 0x34, 0xfc, 0x33, 0x16, - 0x05, 0xde, 0x3e, 0x0a, 0x6b, 0x82, 0xb7, 0xc5, 0x68, 0x32, 0x48, 0xf7, - 0x84, 0x46, 0x4d, 0xca, 0xee, 0x48, 0xda, 0x68, 0x64, 0x07, 0x44, 0x02, - 0x5b, 0x0f, 0x43, 0x28, 0x35, 0x6e, 0x47, 0xe4, 0x03, 0xe2, 0x80, 0xfb, - 0x4a, 0x17, 0x52, 0x4a, 0x1b, 0x2e, 0x63, 0xf2, 0xe7, 0x22, 0xb4, 0x15, - 0x0d, 0x2a, 0x67, 0xcc, 0x2a, 0xa5, 0x21, 0x9d, 0x04, 0x97, 0xf3, 0x44, - 0x21, 0x18, 0xa8, 0x18, 0x34, 0x6d, 0x1c, 0xe2, 0x4c, 0x29, 0xc1, 0x04, - 0xd6, 0x89, 0x7e, 0xcf, 0x58, 0xfa, 0x0d, 0xaf, 0x86, 0x8c, 0x83, 0x81, - 0xe2, 0xfd, 0x4b, 0xcf, 0xa9, 0xe3, 0xfb, 0xda, 0x8b, 0x02, 0xe2, 0xac, - 0x2e, 0x96, 0xda, 0x73, 0x4b, 0x4c, 0x01, 0x9c, 0x7c, 0x0a, 0x12, 0xd3, - 0xa2, 0xb4, 0xd7, 0x08, 0x11, 0x45, 0x07, 0xfb, 0x50, 0x7f, 0xa7, 0x4a, - 0x28, 0x9c, 0xe2, 0xe1, 0x57, 0xc6, 0x0f, 0x88, 0x56, 0x6d, 0x09, 0x32, - 0xab, 0x30, 0xed, 0xd7, 0x78, 0x74, 0x68, 0xda, 0x7c, 0xc1, 0xc5, 0x42, - 0x29, 0x32, 0x30, 0xd1, 0xb8, 0xc2, 0x3b, 0xb6, 0x66, 0x70, 0xb6, 0x7e, - 0xcc, 0x78, 0x01, 0x29, 0xd6, 0x26, 0x4e, 0xc1, 0x40, 0x93, 0x12, 0x15, - 0xe4, 0x89, 0xb2, 0x5a, 0x4a, 0x27, 0xd5, 0xdc, 0x2a, 0xc5, 0x4f, 0x38, - 0x6e, 0x65, 0x04, 0x1c, 0x32, 0x21, 0x8b, 0x4a, 0x48, 0xe0, 0xd1, 0x31, - 0x72, 0x68, 0xf8, 0x02, 0xde, 0x3e, 0xb5, 0x76, 0xfd, 0x80, 0x70, 0x9f, - 0xae, 0x7f, 0x15, 0x05, 0xea, 0x3f, 0x15, 0x97, 0x04, 0x4c, 0x74, 0xd0, - 0x78, 0x74, 0x1d, 0xff, 0x47, 0x78, 0x23, 0xaa, 0x40, 0x37, 0x64, 0x4d, - 0x3c, 0xc8, 0xf2, 0x29, 0xd6, 0x01, 0x98, 0xca, 0xc1, 0x88, 0x6e, 0x7c, - 0xe9, 0xf5, 0xc2, 0x34, 0x83, 0xcf, 0xdc, 0x88, 0x1c, 0xc4, 0x1e, 0x9a, - 0x28, 0x1a, 0xa9, 0xf3, 0xf7, 0x92, 0xc0, 0x85, 0xa5, 0x88, 0x70, 0xf1, - 0x13, 0xa9, 0x18, 0xe7, 0x93, 0x54, 0x9f, 0x14, 0x6b, 0xd1, 0x61, 0x44, - 0xd1, 0x28, 0x0c, 0xcf, 0x50, 0x8b, 0x16, 0xdf, 0x16, 0x0f, 0x84, 0x79, - 0x05, 0x3b, 0xa1, 0x23, 0x37, 0x98, 0x38, 0x16, 0xc2, 0xcf, 0xc3, 0x18, - 0x5c, 0x37, 0xd3, 0x70, 0x15, 0xec, 0x75, 0x5b, 0xd7, 0x76, 0xcd, 0x51, - 0xa9, 0x5a, 0x87, 0x31, 0xd9, 0x86, 0x4f, 0x0f, 0xe3, 0xb6, 0x82, 0x7a, - 0xa7, 0x97, 0x06, 0x15, 0x0b, 0xea, 0x02, 0x17, 0xf2, 0xa0, 0xe3, 0x49, - 0x4a, 0x34, 0xad, 0x4d, 0x09, 0x3c, 0xb5, 0xba, 0x93, 0x9b, 0x92, 0x5f, - 0xf3, 0x86, 0x18, 0xd9, 0x9c, 0x43, 0x6d, 0x2e, 0x25, 0xd4, 0x89, 0x8c, - 0x29, 0x19, 0xd7, 0x50, 0xff, 0x87, 0x76, 0x20, 0xba, 0xa4, 0x57, 0xca, - 0x70, 0xc8, 0x2e, 0x0b, 0x52, 0x48, 0xd2, 0x93, 0x8b, 0x9a, 0x94, 0x2a, - 0x0f, 0x16, 0x27, 0x1f, 0x03, 0x68, 0xbc, 0xe9, 0xf1, 0x06, 0xc4, 0xb9, - 0x7f, 0x8d, 0x41, 0x8c, 0xc8, 0xe8, 0x51, 0xe9, 0xcd, 0x42, 0x18, 0x72, - 0x03, 0x9c, 0xa8, 0x2f, 0xf0, 0x42, 0x68, 0x4f, 0xf9, 0xe6, 0xc7, 0x06, - 0x45, 0xfa, 0xc5, 0x66, 0x44, 0x0a, 0x3d, 0x20, 0xb9, 0x6d, 0xdd, 0x42, - 0x3e, 0xf1, 0x2c, 0x6d, 0xbb, 0xae, 0x33, 0x53, 0xf3, 0x5b, 0x68, 0x5b, - 0x91, 0xa2, 0x51, 0x5d, 0xa7, 0x36, 0x97, 0x69, 0x5e, 0x7f, 0xb5, 0x32, - 0x30, 0x75, 0x3b, 0xed, 0xcc, 0x33, 0x4b, 0xe3, 0x9d, 0xb5, 0x08, 0x83, - 0xda, 0x62, 0x69, 0xbc, 0xd8, 0xae, 0x5e, 0x20, 0xc6, 0x1f, 0x90, 0x49, - 0x41, 0x69, 0x4f, 0xce, 0x2b, 0x88, 0xb3, 0x59, 0xf2, 0x5e, 0x19, 0x99, - 0x3d, 0xfd, 0xc2, 0xda, 0x4a, 0x0e, 0xc7, 0x99, 0x85, 0xbc, 0x6d, 0x24, - 0x6c, 0x64, 0xda, 0x6a, 0xdb, 0x01, 0x3f, 0x0f, 0xfa, 0xf4, 0x3c, 0xc1, - 0x3b, 0xbb, 0x8a, 0xda, 0x54, 0x3d, 0xef, 0x98, 0x55, 0x3b, 0x46, 0xe6, - 0x56, 0xaa, 0xae, 0xa8, 0x15, 0xfe, 0x67, 0x31, 0x5b, 0x5c, 0xf0, 0x78, - 0x31, 0x80, 0x93, 0x15, 0x52, 0xc5, 0x95, 0x1b, 0x0e, 0x21, 0xdf, 0xd9, - 0x92, 0x92, 0x6f, 0x30, 0x1d, 0x82, 0xa7, 0xfb, 0xd0, 0x11, 0x66, 0xff, - 0x43, 0xc3, 0x49, 0x9a, 0x6b, 0xb3, 0x7a, 0x06, 0x96, 0xa0, 0xe6, 0xdb, - 0x2d, 0xc3, 0x89, 0x0b, 0x06, 0x70, 0x88, 0x07, 0x74, 0x18, 0x24, 0x67, - 0x14, 0x45, 0xd3, 0x79, 0x45, 0x51, 0x73, 0x0b, 0xed, 0x69, 0x3d, 0xc3, - 0xac, 0xc8, 0xed, 0xad, 0xc9, 0x8b, 0x27, 0x5a, 0x72, 0xae, 0xce, 0x86, - 0x77, 0x3d, 0x40, 0xe5, 0xea, 0xf4, 0x77, 0x97, 0x6e, 0xe3, 0xb7, 0xeb, - 0xf2, 0xdd, 0x4d, 0x4b, 0x5f, 0xba, 0x41, 0x60, 0x42, 0x37, 0x9f, 0xcf, - 0x9e, 0x14, 0x83, 0xd8, 0x0e, 0x25, 0x5d, 0xc7, 0xa5, 0x5b, 0x92, 0x92, - 0x54, 0xd9, 0x63, 0x1a, 0x27, 0x6c, 0xd4, 0xa9, 0x6c, 0x96, 0x6e, 0x4f, - 0x38, 0x4b, 0xb8, 0x91, 0xdb, 0x42, 0x4d, 0xa3, 0x89, 0xae, 0x52, 0x53, - 0xb2, 0x6a, 0x32, 0xa0, 0x74, 0xd5, 0x58, 0x0e, 0x41, 0x2c, 0xf8, 0x3d, - 0xa8, 0x8a, 0x24, 0x4d, 0x4b, 0x44, 0x84, 0x66, 0x01, 0x82, 0xd9, 0x78, - 0x2b, 0x63, 0x0b, 0x5e, 0xf5, 0x63, 0x89, 0x87, 0xc5, 0x4b, 0x14, 0xdd, - 0xc9, 0x8b, 0x55, 0x9d, 0xac, 0x0b, 0x91, 0xfc, 0x74, 0x95, 0x39, 0x48, - 0xed, 0xab, 0xd5, 0xa4, 0xc4, 0x8f, 0xee, 0x4b, 0xa0, 0x2c, 0x18, 0x40, - 0xf0, 0x18, 0x05, 0xe6, 0x4d, 0x88, 0xaa, 0x3d, 0x30, 0x5d, 0x3c, 0x06, - 0xa3, 0x06, 0x02, 0xa3, 0x28, 0x17, 0x4b, 0xfb, 0x18, 0x16, 0x1c, 0x38, - 0x72, 0x0f, 0x63, 0x8a, 0x0a, 0x1f, 0x0b, 0x01, 0xdc, 0x3e, 0x94, 0x44, - 0xf7, 0xd6, 0x17, 0x24, 0x0b, 0x5a, 0x19, 0x3a, 0xa2, 0xef, 0xc4, 0x5e, - 0xb8, 0x02, 0x61, 0xd1, 0x23, 0xdc, 0x9b, 0xa0, 0xc1, 0xc7, 0x2e, 0x35, - 0x69, 0x82, 0x66, 0xb3, 0x03, 0x21, 0x2c, 0x27, 0x73, 0x73, 0x65, 0x7d, - 0xcf, 0x62, 0xe9, 0xf6, 0x62, 0xe9, 0xe7, 0x07, 0x16, 0x4b, 0x3c, 0xe9, - 0x9f, 0x91, 0x68, 0x12, 0x1d, 0xf8, 0xe4, 0x0b, 0x03, 0x83, 0xae, 0x1b, - 0x39, 0x79, 0x56, 0x85, 0xd6, 0x0a, 0x8e, 0xf5, 0x12, 0xfd, 0xca, 0xc1, - 0xe2, 0x15, 0xb8, 0xdd, 0x29, 0x12, 0x0d, 0xdb, 0xe2, 0xb1, 0xf0, 0x2a, - 0xb5, 0xae, 0xa7, 0x72, 0xce, 0x73, 0xc4, 0x3a, 0x1c, 0xd0, 0xbc, 0x49, - 0xde, 0x90, 0x72, 0xb5, 0x47, 0xa1, 0xe5, 0x08, 0x39, 0x8b, 0x72, 0xcf, - 0xb7, 0x95, 0x71, 0x27, 0xc6, 0x5b, 0xdc, 0xb9, 0x07, 0x3f, 0x76, 0xc0, - 0x0a, 0x00, 0x49, 0x3b, 0x5a, 0xef, 0x18, 0xbb, 0x15, 0xf9, 0x48, 0x10, - 0x46, 0xa3, 0x97, 0x2a, 0x59, 0x81, 0x47, 0xb8, 0x68, 0x13, 0xa7, 0x58, - 0x22, 0x66, 0x44, 0x79, 0x21, 0x46, 0xbc, 0x25, 0x5e, 0x63, 0x3b, 0xad, - 0x6e, 0x9d, 0xff, 0xaf, 0x44, 0xee, 0xdc, 0x86, 0xb7, 0x51, 0x71, 0x60, - 0xc6, 0x84, 0x52, 0xb6, 0xd0, 0xea, 0xdf, 0x8e, 0x04, 0xd2, 0xed, 0x25, - 0x7b, 0xe0, 0xdc, 0x7d, 0xbf, 0x58, 0x4b, 0x5a, 0xb0, 0xe2, 0x3d, 0xcc, - 0x2e, 0xff, 0x24, 0x72, 0xe5, 0x5b, 0x31, 0xcd, 0x2f, 0xae, 0xda, 0x44, - 0x06, 0xcb, 0x21, 0xc9, 0xc9, 0xea, 0x74, 0x9f, 0x63, 0x0a, 0xb4, 0x59, - 0xe8, 0x3e, 0x5c, 0xc3, 0xcb, 0x5d, 0xbc, 0x81, 0x99, 0x13, 0x43, 0x32, - 0xe7, 0x55, 0x25, 0x32, 0x1d, 0x9a, 0x84, 0x6a, 0xd0, 0x01, 0x11, 0x37, - 0x1c, 0x7c, 0x1a, 0xab, 0x34, 0x64, 0xbd, 0xa8, 0x64, 0x02, 0xc5, 0xe8, - 0x7e, 0xbb, 0x90, 0x2e, 0x45, 0xb6, 0xfc, 0x09, 0xf0, 0x57, 0x12, 0x33, - 0x62, 0x74, 0x59, 0x33, 0xb0, 0xff, 0x6e, 0x68, 0xd7, 0x1f, 0xaa, 0x0c, - 0xcd, 0x55, 0x4c, 0xcd, 0x90, 0x4f, 0x1d, 0x53, 0x23, 0xe4, 0x33, 0x2f, - 0xab, 0x9d, 0x4b, 0x97, 0xa4, 0x12, 0x6d, 0x62, 0xd6, 0x4b, 0x28, 0xa6, - 0xb6, 0x48, 0xf3, 0xe7, 0xfc, 0x11, 0x97, 0xe6, 0xb9, 0xa0, 0xb0, 0x45, - 0xf4, 0xfb, 0xdc, 0x47, 0xb2, 0x86, 0xd1, 0xba, 0xf2, 0x4a, 0x1f, 0x57, - 0xf4, 0x7c, 0xbf, 0xd0, 0xf3, 0x4f, 0xd2, 0xe3, 0xa7, 0x21, 0xd6, 0x64, - 0xb8, 0x51, 0x81, 0xe5, 0xc0, 0xb6, 0xed, 0x97, 0xb6, 0xf0, 0xb4, 0xda, - 0x20, 0xa1, 0xc2, 0x11, 0xe6, 0xa8, 0xc9, 0xfd, 0x0b, 0x54, 0x42, 0x71, - 0x14, 0xd7, 0x96, 0x10, 0x92, 0xdd, 0x12, 0x32, 0x6c, 0xa5, 0x5c, 0x0a, - 0x40, 0xd9, 0x14, 0x04, 0xd7, 0x28, 0x3c, 0x2e, 0xeb, 0x5e, 0x8e, 0x62, - 0xee, 0xc7, 0x01, 0xf7, 0x05, 0x2e, 0xd5, 0x27, 0xb7, 0x25, 0xde, 0x57, - 0x8a, 0x82, 0xed, 0xbd, 0x25, 0x23, 0x8f, 0x77, 0x9c, 0x73, 0xb2, 0x89, - 0xd2, 0x17, 0x35, 0xab, 0x79, 0x8c, 0x52, 0xec, 0xc6, 0xa0, 0x7f, 0x54, - 0x17, 0xf1, 0x62, 0xd0, 0xac, 0x37, 0xca, 0x08, 0x63, 0x70, 0x89, 0x55, - 0x5e, 0xd8, 0xbc, 0x7e, 0x5b, 0xf2, 0x25, 0x49, 0x71, 0x3a, 0xd3, 0x5e, - 0x5d, 0x24, 0xd9, 0xc2, 0x10, 0x20, 0xb4, 0x88, 0x58, 0x9e, 0x0a, 0xb6, - 0x8b, 0x6e, 0x37, 0x79, 0x31, 0xee, 0x4c, 0xb8, 0x20, 0x07, 0xce, 0xc1, - 0x14, 0x94, 0x78, 0x83, 0xbb, 0xed, 0x60, 0xfc, 0xb0, 0xf6, 0x5c, 0x09, - 0x0d, 0xa9, 0x8b, 0x00, 0xf8, 0xb5, 0x10, 0x2a, 0x40, 0xd9, 0x0c, 0x76, - 0xd2, 0xf3, 0xf9, 0xf1, 0xba, 0x88, 0x4e, 0x56, 0x10, 0x1e, 0x9c, 0xbc, - 0x82, 0xea, 0x02, 0xaa, 0x75, 0x8d, 0x64, 0x57, 0xe8, 0x4e, 0xd5, 0x2b, - 0xc9, 0x45, 0x3c, 0x7e, 0x1e, 0xb0, 0xea, 0xe7, 0x30, 0x9d, 0x11, 0xcf, - 0x0d, 0x78, 0x72, 0x5c, 0xf2, 0x50, 0xc2, 0x73, 0x44, 0x59, 0x87, 0x89, - 0x0a, 0xba, 0xde, 0xf5, 0x7c, 0x03, 0x67, 0xd6, 0xad, 0xdd, 0xf8, 0xcb, - 0x8a, 0x45, 0x40, 0x3e, 0xae, 0x3b, 0x57, 0xf5, 0xa0, 0xc7, 0xf5, 0xaa, - 0xdc, 0xd8, 0x10, 0xb0, 0xf5, 0x97, 0x36, 0xfe, 0xc3, 0xc9, 0x48, 0x31, - 0xbb, 0x2d, 0x63, 0xfc, 0x12, 0x92, 0x35, 0x11, 0x1e, 0x11, 0x50, 0x77, - 0x86, 0x55, 0xc0, 0xe2, 0xbf, 0x8e, 0xeb, 0x38, 0x43, 0x30, 0x38, 0x4a, - 0x94, 0x6d, 0x8a, 0xa5, 0x27, 0xb1, 0xf5, 0x92, 0xd1, 0xf8, 0x88, 0x1a, - 0x26, 0x92, 0xd4, 0x69, 0x66, 0x03, 0xd0, 0xdc, 0xb4, 0x26, 0x68, 0x68, - 0xc1, 0x7b, 0x03, 0x3e, 0x07, 0x0b, 0x78, 0xbb, 0x2d, 0x15, 0x74, 0x9c, - 0x6f, 0xd1, 0x85, 0x63, 0x49, 0x2b, 0x00, 0xd4, 0x6e, 0x14, 0x0f, 0x83, - 0xe4, 0xd6, 0x88, 0x84, 0x21, 0xca, 0x02, 0x80, 0x1f, 0x31, 0xf5, 0x5b, - 0x01, 0x1e, 0x51, 0x89, 0x44, 0xcf, 0x20, 0xaa, 0x06, 0x60, 0x53, 0x4e, - 0xe3, 0x43, 0xce, 0x33, 0x4e, 0x09, 0x9f, 0x6a, 0x7b, 0x67, 0x45, 0x8c, - 0x20, 0xdc, 0xb6, 0xe7, 0x83, 0x40, 0x64, 0x29, 0x79, 0xc3, 0x7a, 0x36, - 0xa2, 0x69, 0x00, 0xef, 0x60, 0xb8, 0x27, 0x6c, 0x3f, 0xb7, 0x70, 0x9d, - 0x07, 0xbe, 0xdb, 0x55, 0xb4, 0x23, 0x77, 0xc2, 0x5c, 0xd2, 0xac, 0xe2, - 0x91, 0xb1, 0x96, 0xdc, 0x42, 0x22, 0x43, 0x32, 0xe0, 0xee, 0x62, 0xed, - 0x74, 0x86, 0x24, 0x2c, 0x19, 0x5f, 0xda, 0x08, 0xbf, 0x19, 0x9b, 0x01, - 0xae, 0x7f, 0xe0, 0x8d, 0x37, 0x64, 0xc7, 0x05, 0xdb, 0x08, 0x6c, 0xae, - 0xc3, 0x98, 0x9d, 0xb1, 0x81, 0xf7, 0x5b, 0xe0, 0xc8, 0x03, 0x0f, 0x0f, - 0x55, 0xd4, 0x2d, 0xa5, 0xf7, 0x7c, 0x18, 0x21, 0xf3, 0x69, 0xc4, 0x9a, - 0x9c, 0x23, 0x78, 0x40, 0x10, 0x9f, 0x8f, 0x6f, 0x99, 0x5a, 0x45, 0x75, - 0x2c, 0x62, 0x4f, 0xda, 0xf3, 0xf9, 0xe7, 0xd8, 0xd0, 0x72, 0xd8, 0x26, - 0xcf, 0xe4, 0xe2, 0x11, 0xf7, 0x38, 0x19, 0xee, 0x09, 0xa0, 0x12, 0x28, - 0x8f, 0x27, 0xa6, 0x15, 0x5e, 0x08, 0x5d, 0x71, 0x4b, 0x6e, 0x68, 0x79, - 0x6f, 0xcb, 0x49, 0x3f, 0x63, 0x6a, 0x96, 0x48, 0x62, 0x89, 0x87, 0xda, - 0xba, 0x1b, 0x97, 0xb4, 0x2d, 0x71, 0x2a, 0x92, 0x2a, 0x08, 0xbf, 0x97, - 0x08, 0x37, 0x98, 0xe2, 0x5d, 0x3e, 0x46, 0x57, 0xee, 0xdf, 0xeb, 0x96, - 0xf0, 0xc9, 0x12, 0xf8, 0x7c, 0xec, 0xc5, 0xdf, 0xca, 0x9c, 0x5f, 0x2a, - 0x34, 0x33, 0xfa, 0x4e, 0x2b, 0x0a, 0xb9, 0xe3, 0x52, 0x42, 0x05, 0x85, - 0x08, 0xda, 0x88, 0x1c, 0x4d, 0xa0, 0x59, 0x39, 0x58, 0xbe, 0xd6, 0x17, - 0x9f, 0x6e, 0xdf, 0x4e, 0xa5, 0x63, 0x42, 0x67, 0xbc, 0x9e, 0xcb, 0xd7, - 0x59, 0x2b, 0x44, 0x0c, 0xc2, 0xf5, 0xb5, 0x81, 0x4d, 0x9f, 0x05, 0x72, - 0xe2, 0xe1, 0xce, 0xb4, 0x5f, 0xf3, 0xa6, 0x48, 0xb7, 0xce, 0x6b, 0x3d, - 0x33, 0x5c, 0x4c, 0x95, 0x71, 0xae, 0xe1, 0xe9, 0x9d, 0x23, 0xef, 0xee, - 0xfa, 0x1c, 0x89, 0x1c, 0xf9, 0xc1, 0x41, 0x3e, 0xba, 0x04, 0xf9, 0x70, - 0xae, 0xca, 0x91, 0x83, 0x65, 0x1c, 0x22, 0x02, 0x4a, 0x77, 0x79, 0x94, - 0x7f, 0xb7, 0x35, 0x40, 0xd7, 0x57, 0xbf, 0x6f, 0xfd, 0x11, 0xd1, 0xdb, - 0xec, 0x57, 0x2e, 0x60, 0x12, 0xfb, 0x91, 0x31, 0xe7, 0xd8, 0x9e, 0xe2, - 0x5b, 0x90, 0x1e, 0xf9, 0x8c, 0x20, 0x68, 0x68, 0x14, 0xf6, 0xbb, 0xe5, - 0x13, 0x4a, 0x55, 0x92, 0x40, 0xfd, 0xb1, 0x38, 0xa1, 0xd9, 0xd8, 0xc0, - 0x84, 0xd2, 0x55, 0x11, 0x99, 0x6d, 0x77, 0x25, 0x9f, 0x5a, 0x70, 0x2c, - 0x72, 0x57, 0x11, 0xa1, 0x5e, 0x92, 0x9d, 0x60, 0xc7, 0x7d, 0xea, 0xb0, - 0xa3, 0xa9, 0x57, 0x5d, 0xee, 0x82, 0x49, 0x25, 0x8c, 0x9f, 0x3b, 0x29, - 0x1c, 0x8e, 0x0d, 0x8f, 0x13, 0xa9, 0x40, 0xe7, 0x5d, 0x41, 0x73, 0xe7, - 0x8f, 0x6f, 0x9b, 0xa6, 0x63, 0x67, 0x1a, 0x4e, 0x5a, 0x26, 0xf0, 0x6e, - 0x61, 0xbc, 0xc4, 0x52, 0xa1, 0x79, 0x7e, 0x87, 0x2b, 0x53, 0x6b, 0xc3, - 0xe2, 0xdd, 0x19, 0x7b, 0x81, 0xc5, 0x01, 0x47, 0xed, 0x6c, 0xc4, 0x25, - 0xab, 0x97, 0x27, 0x9e, 0x9b, 0x53, 0x43, 0xc5, 0x4a, 0xcf, 0x0d, 0x9c, - 0x23, 0x1c, 0xd9, 0x16, 0x1f, 0x4d, 0xf0, 0xa4, 0x53, 0xad, 0x79, 0x71, - 0x6a, 0x98, 0x97, 0xab, 0xe5, 0xcb, 0xfb, 0x46, 0x44, 0xa4, 0xbb, 0x85, - 0x80, 0x91, 0xaf, 0xd6, 0x8a, 0xef, 0xd7, 0x35, 0xf2, 0x87, 0xae, 0xbc, - 0xcc, 0x90, 0xee, 0xd0, 0x61, 0x96, 0xb5, 0x51, 0x8a, 0xb4, 0x41, 0xe4, - 0xb1, 0xc9, 0x3f, 0x22, 0xab, 0xb9, 0x63, 0x37, 0x4a, 0xe7, 0x08, 0xf7, - 0x01, 0xe4, 0x06, 0x04, 0x3f, 0x21, 0x0c, 0x19, 0x38, 0x85, 0x35, 0x19, - 0x3c, 0x95, 0xa6, 0x47, 0xd1, 0x01, 0x1d, 0x43, 0xa1, 0x7a, 0xf7, 0xe8, - 0x3a, 0xce, 0x37, 0xe5, 0x44, 0x88, 0x33, 0xb8, 0xa4, 0x1f, 0x08, 0x7c, - 0x82, 0xe4, 0xe4, 0x78, 0x77, 0x47, 0x6c, 0x04, 0x79, 0x62, 0x50, 0x32, - 0xa9, 0x98, 0x7b, 0x89, 0x25, 0x13, 0x64, 0x6a, 0xda, 0x87, 0xc2, 0x9a, - 0x0e, 0xd8, 0x11, 0x18, 0x11, 0xcc, 0xdd, 0x8a, 0xb5, 0x50, 0x8f, 0xb1, - 0xd7, 0x2c, 0xc8, 0xb4, 0xc6, 0xc0, 0xc8, 0xde, 0xe0, 0x25, 0xdf, 0x5a, - 0x0e, 0x67, 0xf1, 0xbe, 0x70, 0xd0, 0x3b, 0x7e, 0x98, 0x63, 0x87, 0x0c, - 0x05, 0x46, 0xd6, 0x07, 0x9d, 0xc3, 0x58, 0x1e, 0x7c, 0xde, 0x50, 0x44, - 0x12, 0xe1, 0x54, 0x30, 0xee, 0x26, 0x76, 0xdb, 0x6d, 0x8d, 0x37, 0x52, - 0x08, 0x76, 0x21, 0x7e, 0x78, 0x8d, 0xee, 0x6a, 0xa8, 0xae, 0x53, 0x84, - 0x77, 0x83, 0x2a, 0x3b, 0x8b, 0x15, 0xe2, 0x4f, 0x1e, 0x80, 0x2f, 0xd0, - 0xc4, 0x96, 0x49, 0x8a, 0x49, 0xfe, 0xd2, 0xcf, 0x89, 0x7e, 0x87, 0xf1, - 0x81, 0xe6, 0x30, 0xe1, 0x10, 0x3e, 0x06, 0xe3, 0xa1, 0x89, 0xf5, 0x89, - 0xde, 0x8a, 0x06, 0x02, 0xba, 0x6b, 0xb0, 0x18, 0xf6, 0x77, 0x4f, 0x10, - 0x1d, 0xc8, 0xae, 0x19, 0x39, 0xd0, 0x27, 0x9c, 0x8e, 0x09, 0xfe, 0xd7, - 0xd4, 0x2c, 0xe7, 0x54, 0x9c, 0x4a, 0x63, 0xe1, 0x2d, 0x0d, 0x0c, 0x82, - 0xf6, 0x74, 0xc0, 0x5e, 0xe5, 0x66, 0xa0, 0x03, 0x80, 0xfa, 0xd8, 0x42, - 0x1b, 0x95, 0x14, 0x1f, 0x78, 0x45, 0x78, 0xa4, 0x0b, 0x3a, 0x00, 0x56, - 0x82, 0xa7, 0x61, 0x84, 0xef, 0xf0, 0xbd, 0x3a, 0x1a, 0x44, 0x00, 0xb1, - 0x07, 0xb4, 0xe4, 0xb4, 0x13, 0x79, 0xc1, 0xff, 0x4d, 0x4d, 0xac, 0xb4, - 0xaa, 0x25, 0x37, 0x1f, 0x62, 0x92, 0xf8, 0xe4, 0xc1, 0x25, 0xda, 0x8e, - 0x68, 0x56, 0x9f, 0xf4, 0x22, 0xf3, 0xe8, 0xca, 0x80, 0x9c, 0xd9, 0x69, - 0x77, 0x6b, 0xbd, 0xb0, 0x0a, 0xa2, 0x65, 0x9b, 0x03, 0xd7, 0xf3, 0xe4, - 0xb4, 0xc3, 0xef, 0x7e, 0x68, 0x90, 0xc0, 0xb1, 0x7f, 0x29, 0x71, 0x30, - 0x38, 0x59, 0x52, 0x4d, 0xa1, 0x2b, 0x4d, 0x85, 0x4b, 0x17, 0x7d, 0xeb, - 0x81, 0xfe, 0x4c, 0xe5, 0xd2, 0xb4, 0x2b, 0x3c, 0x1c, 0x76, 0x4d, 0x62, - 0xd5, 0x49, 0x4c, 0xd0, 0xf4, 0x12, 0x45, 0xce, 0x83, 0x12, 0xdf, 0x8d, - 0xe4, 0x98, 0x3d, 0x1a, 0x32, 0xe3, 0xf0, 0x25, 0x90, 0xb6, 0x32, 0xa8, - 0x8f, 0xcc, 0xe9, 0xa2, 0xad, 0xd1, 0x48, 0x46, 0xbe, 0xda, 0xfa, 0xa4, - 0x5d, 0x3b, 0xe8, 0xa2, 0xf0, 0x3a, 0xc4, 0x7b, 0x24, 0xbe, 0x4f, 0x83, - 0x69, 0x6a, 0xe9, 0xa5, 0x0a, 0x03, 0xce, 0x6e, 0x3d, 0xbc, 0x67, 0xde, - 0x43, 0x08, 0xf2, 0x5a, 0xaa, 0xc7, 0xaf, 0xab, 0xe7, 0xf1, 0xed, 0xf4, - 0xbc, 0x26, 0x77, 0xc6, 0x01, 0xc3, 0x63, 0xd7, 0x27, 0x02, 0x56, 0x6a, - 0x8b, 0x07, 0x06, 0x8a, 0x70, 0xc0, 0xf4, 0xe5, 0xb3, 0x1f, 0xcf, 0x34, - 0xc0, 0x50, 0x26, 0xcc, 0x84, 0xde, 0xa6, 0x89, 0xda, 0x4c, 0x24, 0xc2, - 0xa9, 0xe3, 0x65, 0x62, 0xce, 0x64, 0x56, 0x86, 0x23, 0x04, 0x2c, 0xc3, - 0xb1, 0x21, 0xc5, 0x04, 0x2a, 0x3f, 0x56, 0x27, 0xd1, 0x5e, 0xa9, 0x7c, - 0xf1, 0x4c, 0xcb, 0xae, 0x70, 0x8a, 0xeb, 0x3f, 0xb5, 0x9a, 0x16, 0x27, - 0x0e, 0xb2, 0xc9, 0xf4, 0x7a, 0xf8, 0x26, 0xe5, 0x73, 0x9a, 0xff, 0xcc, - 0xda, 0x45, 0xc7, 0x37, 0x18, 0x4a, 0xe5, 0x60, 0xe4, 0xe8, 0xd3, 0xe0, - 0xa6, 0x5d, 0x0a, 0x40, 0x51, 0x2a, 0x1b, 0x60, 0x45, 0x17, 0x1c, 0xed, - 0x9e, 0x85, 0xe7, 0xdd, 0xf4, 0x1d, 0x68, 0x13, 0xf2, 0xd6, 0x14, 0x02, - 0x62, 0x45, 0xde, 0x91, 0x69, 0x22, 0x98, 0x31, 0x5c, 0xe9, 0x2f, 0x3d, - 0x43, 0x8f, 0x79, 0xdc, 0x2f, 0xd8, 0xa4, 0x73, 0x9e, 0xc4, 0x4d, 0xe1, - 0x54, 0x07, 0x01, 0xad, 0xab, 0x83, 0x9d, 0x3e, 0x56, 0xae, 0x0b, 0xc8, - 0x4e, 0x9f, 0x37, 0x6d, 0x8d, 0x1e, 0x05, 0x7e, 0x6b, 0xd3, 0x75, 0x65, - 0xa6, 0x7b, 0x4f, 0xb4, 0x12, 0x7a, 0xa0, 0xc5, 0x26, 0x7a, 0x16, 0xe6, - 0x02, 0xe1, 0x1b, 0x0d, 0xf9, 0xd2, 0x40, 0x2c, 0xd3, 0x78, 0x97, 0x87, - 0xa5, 0x20, 0x48, 0xc1, 0xf7, 0x3e, 0x3e, 0x71, 0xa6, 0xc7, 0xcd, 0x69, - 0xc7, 0x49, 0x5f, 0x4b, 0xc3, 0x21, 0xe3, 0xe8, 0x27, 0xe8, 0x8f, 0x66, - 0x03, 0xc5, 0xf8, 0x69, 0x53, 0xb4, 0x3b, 0x7a, 0x9a, 0x33, 0x0b, 0x8c, - 0x5e, 0x9d, 0xd2, 0x79, 0x96, 0x12, 0xa4, 0xb9, 0xd2, 0x14, 0xf5, 0xa5, - 0x54, 0x05, 0x93, 0x87, 0xd1, 0x81, 0x37, 0x1e, 0xb0, 0x2d, 0x1d, 0xae, - 0x0e, 0xbc, 0x37, 0xc4, 0xdc, 0x52, 0xd1, 0x0c, 0xd0, 0x68, 0x41, 0xbb, - 0xd7, 0x5e, 0x78, 0xa1, 0x8d, 0xac, 0xa2, 0x5b, 0xfe, 0x2e, 0x99, 0xa1, - 0xe5, 0x7b, 0x18, 0xfe, 0xb9, 0x7a, 0x3c, 0x1d, 0xff, 0xab, 0x75, 0x98, - 0x46, 0x10, 0xeb, 0x60, 0x5b, 0xc2, 0xc1, 0x59, 0x97, 0x2e, 0x5a, 0xca, - 0x8a, 0x6b, 0x28, 0xab, 0x8e, 0x3f, 0x68, 0x47, 0x5c, 0xfc, 0x2e, 0xb6, - 0x03, 0x5b, 0x57, 0x62, 0x62, 0x4a, 0x90, 0x77, 0x6f, 0x1d, 0x05, 0x18, - 0x78, 0xbc, 0xcb, 0x76, 0x44, 0x4a, 0xd0, 0xac, 0x3d, 0x48, 0x1c, 0x27, - 0x93, 0xda, 0xbb, 0x05, 0x6f, 0x69, 0xb7, 0x32, 0x57, 0xcf, 0xa3, 0xd3, - 0x0a, 0x2e, 0xd3, 0x24, 0x7e, 0xdc, 0xec, 0xf2, 0x70, 0x42, 0x92, 0x9d, - 0xbc, 0x43, 0x7a, 0xa7, 0x97, 0x48, 0x94, 0xce, 0xa8, 0x0a, 0xe7, 0xb2, - 0x92, 0xf2, 0x33, 0x67, 0x3c, 0x9b, 0xdd, 0x23, 0x31, 0x0e, 0x3d, 0x4c, - 0x8b, 0x30, 0x05, 0xad, 0x88, 0xda, 0xd0, 0xf2, 0x91, 0x4d, 0x2b, 0x9a, - 0x32, 0x11, 0x81, 0x4d, 0xa6, 0x59, 0x78, 0x63, 0x04, 0xfa, 0xc8, 0x83, - 0xf3, 0xcd, 0xe7, 0xdd, 0x33, 0xb7, 0xfa, 0x68, 0xbf, 0xbc, 0x86, 0x0c, - 0x27, 0xeb, 0x69, 0xee, 0xae, 0x5b, 0x8e, 0x9f, 0xe1, 0x62, 0x96, 0x83, - 0x5d, 0xcd, 0xc5, 0xf9, 0x05, 0x10, 0x77, 0x99, 0xaf, 0x71, 0xd5, 0x65, - 0x01, 0xe7, 0x71, 0x65, 0x62, 0x95, 0x8f, 0x17, 0x89, 0x20, 0xb5, 0x55, - 0x4f, 0x68, 0xd7, 0xe3, 0x84, 0x7a, 0x1e, 0xdd, 0x8a, 0x7c, 0xb8, 0x95, - 0xff, 0x36, 0x9f, 0x14, 0xc5, 0xeb, 0xb8, 0xa6, 0xd8, 0xb9, 0x23, 0xe2, - 0x89, 0x49, 0x79, 0x39, 0xe2, 0x54, 0xef, 0x9b, 0x70, 0x93, 0x69, 0x45, - 0x53, 0xe7, 0x39, 0x58, 0x73, 0x3b, 0xb8, 0x7a, 0xd9, 0x42, 0x76, 0x90, - 0x16, 0x72, 0x6b, 0x48, 0x7b, 0x82, 0x94, 0x2c, 0x0e, 0x1d, 0xad, 0x28, - 0x34, 0xb1, 0xb8, 0x94, 0x99, 0x03, 0xf2, 0x09, 0x57, 0x3d, 0x5a, 0xc6, - 0x40, 0x22, 0x04, 0x72, 0xea, 0x41, 0xa3, 0xab, 0x20, 0x04, 0x72, 0x20, - 0x8f, 0x27, 0x32, 0x7a, 0xe1, 0x1f, 0x4c, 0xd6, 0x22, 0x39, 0xff, 0xc8, - 0xb3, 0xf6, 0x89, 0x20, 0x2b, 0x44, 0x01, 0xb4, 0x47, 0xf2, 0xab, 0xd8, - 0x1c, 0x23, 0x5f, 0x51, 0x2b, 0x79, 0xae, 0x77, 0x3a, 0xc5, 0x56, 0x1a, - 0x2c, 0x54, 0xb5, 0x20, 0x53, 0xad, 0x3e, 0x76, 0x48, 0xe7, 0xbd, 0xe8, - 0xb3, 0xaf, 0xb4, 0x51, 0x27, 0xd6, 0x9b, 0x27, 0x99, 0x99, 0xea, 0xbb, - 0x06, 0xd4, 0xe5, 0x72, 0x47, 0x3d, 0xba, 0x30, 0x1a, 0x65, 0x6b, 0x84, - 0x63, 0x92, 0xfd, 0xda, 0x7d, 0x38, 0x2c, 0xd2, 0x1c, 0xb7, 0xfc, 0xd5, - 0x91, 0x52, 0x90, 0xb6, 0x3d, 0xcf, 0x2d, 0x44, 0x17, 0x06, 0x71, 0x2f, - 0x45, 0x16, 0x27, 0xd9, 0xfb, 0x4c, 0xc9, 0x8e, 0xbb, 0xbd, 0x46, 0x92, - 0x37, 0xb8, 0x48, 0xe5, 0x75, 0x6c, 0xfb, 0xd4, 0xb5, 0x73, 0xe5, 0xc9, - 0x1e, 0xfd, 0x8b, 0x36, 0x4f, 0x2b, 0x94, 0x6c, 0x93, 0x46, 0xe3, 0x03, - 0x53, 0xbb, 0x33, 0x97, 0x04, 0x24, 0xc2, 0x55, 0xf0, 0x76, 0xf4, 0x23, - 0x5f, 0x7c, 0xe9, 0x38, 0x32, 0x51, 0xa6, 0x06, 0x3b, 0x31, 0x7a, 0x4d, - 0x4c, 0x5e, 0x6a, 0x66, 0x22, 0x8b, 0xb7, 0x6a, 0x1b, 0x11, 0xef, 0xd8, - 0xe6, 0x17, 0x13, 0x8b, 0xde, 0x7d, 0xbc, 0xca, 0xb5, 0x7d, 0xfb, 0x94, - 0x42, 0x05, 0xb6, 0x89, 0x5f, 0x5a, 0xec, 0xdd, 0x40, 0x9d, 0x7f, 0xad, - 0x5c, 0x79, 0xf5, 0x95, 0x24, 0x57, 0xba, 0x17, 0x8d, 0x9d, 0x3d, 0xad, - 0x65, 0x1e, 0x3e, 0xd3, 0xa9, 0x56, 0xb7, 0x3b, 0x65, 0xe7, 0x29, 0x41, - 0x66, 0xc5, 0x5f, 0x2c, 0x86, 0x4d, 0x76, 0xbe, 0x13, 0xee, 0x70, 0x97, - 0x0c, 0xf2, 0x5f, 0xa2, 0x0c, 0x4c, 0xdf, 0x4e, 0xdb, 0xcb, 0x34, 0xd3, - 0xdb, 0x60, 0x58, 0xf4, 0x5e, 0x22, 0x91, 0xbd, 0xf5, 0x1e, 0x7b, 0x72, - 0x06, 0x8e, 0x57, 0x5f, 0x4b, 0xdb, 0xeb, 0x43, 0x71, 0x8e, 0xae, 0xd8, - 0x5f, 0x1c, 0x5c, 0x42, 0xec, 0x88, 0x12, 0xa1, 0x1e, 0x12, 0x9d, 0x04, - 0x24, 0x2f, 0xed, 0x14, 0x81, 0x56, 0x3a, 0x45, 0xc4, 0x2a, 0xcc, 0x32, - 0x92, 0x30, 0x60, 0xaa, 0xb0, 0x11, 0x14, 0xdc, 0x8c, 0x29, 0x8c, 0x26, - 0xc0, 0x20, 0xcb, 0x01, 0x50, 0x10, 0xa7, 0x81, 0x4e, 0x8d, 0x80, 0x58, - 0x3c, 0x8b, 0x9e, 0x0d, 0xc5, 0xc0, 0x13, 0x55, 0x80, 0x7c, 0x80, 0xcf, - 0x50, 0x45, 0x65, 0xf6, 0x54, 0x23, 0xf7, 0x04, 0x91, 0x74, 0xf9, 0xa4, - 0x35, 0xc4, 0x52, 0x4b, 0x28, 0x0a, 0xcb, 0x58, 0x8c, 0x1e, 0x4c, 0xa3, - 0x9c, 0xaa, 0xc7, 0x63, 0x00, 0x16, 0x13, 0xc1, 0x10, 0x51, 0x0b, 0xba, - 0x26, 0x2a, 0xd9, 0x78, 0x9f, 0x15, 0xec, 0xf2, 0x30, 0x32, 0xa6, 0x20, - 0x41, 0xec, 0x01, 0x78, 0x57, 0xeb, 0x8b, 0x05, 0xe2, 0x48, 0x27, 0xd2, - 0x16, 0x78, 0x22, 0x32, 0x08, 0xa5, 0x23, 0xd3, 0x33, 0x63, 0x0a, 0x35, - 0x13, 0xbc, 0x1c, 0x2a, 0x0f, 0x4c, 0xfe, 0xca, 0x33, 0xfd, 0x0a, 0xbc, - 0x91, 0x27, 0xd6, 0xf1, 0x34, 0xb0, 0xde, 0x12, 0x09, 0x0d, 0xba, 0x26, - 0x2c, 0xf7, 0x40, 0x11, 0x73, 0x8c, 0xe5, 0x3e, 0xb1, 0x75, 0xbb, 0x04, - 0x43, 0x32, 0x6d, 0x0d, 0x8f, 0x3a, 0x73, 0xbf, 0x38, 0x82, 0xc1, 0x33, - 0x2a, 0x91, 0xe1, 0x33, 0x98, 0x79, 0x9d, 0xea, 0x22, 0x0a, 0x74, 0x7a, - 0x7b, 0x5b, 0x48, 0x7e, 0x2b, 0x6e, 0x86, 0x52, 0x49, 0x60, 0xdd, 0x4c, - 0xfd, 0x4f, 0x9c, 0xbf, 0x95, 0xdf, 0x46, 0xd3, 0x28, 0x80, 0x0b, 0x1e, - 0x87, 0xc8, 0x78, 0xa6, 0xb2, 0x30, 0x85, 0x5b, 0x86, 0x1e, 0xf0, 0xa5, - 0x8d, 0x93, 0x6e, 0xd2, 0x8b, 0x15, 0x9a, 0x19, 0x66, 0xbb, 0x29, 0xaf, - 0x5d, 0x38, 0x71, 0x78, 0xe4, 0xa9, 0x5a, 0xfa, 0xc3, 0x31, 0x5e, 0x12, - 0x2c, 0xde, 0xd8, 0xd1, 0x40, 0x57, 0xb0, 0xae, 0xa4, 0xd1, 0xd6, 0x40, - 0x75, 0x51, 0x08, 0x76, 0xa1, 0x38, 0xbf, 0xb5, 0xa6, 0x45, 0x60, 0x6a, - 0xe5, 0xf6, 0x50, 0x46, 0x92, 0x26, 0xd7, 0xa3, 0xf1, 0xae, 0x92, 0x03, - 0x11, 0xc1, 0x31, 0x1c, 0xe4, 0x3c, 0xbb, 0x35, 0x7a, 0x60, 0x58, 0x71, - 0x00, 0x38, 0xf2, 0x05, 0x9c, 0x45, 0x61, 0x9a, 0xbd, 0xb3, 0x8e, 0xb9, - 0x79, 0x02, 0xa2, 0x8c, 0x3e, 0x30, 0x5b, 0x0f, 0x91, 0x1d, 0xef, 0x0b, - 0xf9, 0x6f, 0x49, 0x3b, 0x67, 0x09, 0xc9, 0xe5, 0x0a, 0x89, 0x30, 0xe1, - 0xa6, 0x42, 0x5d, 0x9f, 0xf1, 0x00, 0xf7, 0xb5, 0x2d, 0xe3, 0xa3, 0xbc, - 0x89, 0x14, 0x9d, 0xe5, 0x6d, 0xc0, 0xd8, 0x2c, 0x28, 0x93, 0xff, 0x24, - 0x52, 0x23, 0x8f, 0xe4, 0xd2, 0x94, 0xaf, 0x8e, 0x16, 0x22, 0x20, 0x92, - 0xf0, 0xa2, 0xd7, 0x51, 0xdd, 0x86, 0xde, 0x88, 0x17, 0x05, 0x6c, 0xc3, - 0x0e, 0xe2, 0x63, 0x10, 0xba, 0xe6, 0x39, 0xe5, 0x07, 0xf6, 0x60, 0xdb, - 0x2b, 0xdb, 0xf1, 0xb4, 0x38, 0x0d, 0x6f, 0xa7, 0xb4, 0x29, 0x70, 0x26, - 0x6d, 0x29, 0xb0, 0x8c, 0xc8, 0x83, 0xb0, 0x3e, 0x1d, 0x70, 0x25, 0xe2, - 0x1b, 0xe7, 0x09, 0xa7, 0x89, 0x8f, 0x7e, 0xcb, 0x2d, 0x15, 0x86, 0x56, - 0x20, 0xde, 0xa4, 0x95, 0xae, 0x93, 0x3b, 0x38, 0x58, 0x70, 0xc6, 0x95, - 0xac, 0x7b, 0x16, 0xc7, 0xc4, 0xf6, 0x5e, 0xe5, 0x66, 0x30, 0xbb, 0xc2, - 0xa1, 0xc3, 0x51, 0x83, 0xc7, 0x82, 0xcd, 0xe3, 0xe6, 0x0a, 0x9e, 0x0d, - 0x9f, 0xf4, 0x78, 0x3b, 0x1c, 0xd6, 0x16, 0x62, 0xc0, 0x2c, 0x0e, 0xb8, - 0xeb, 0x78, 0x78, 0x0d, 0xba, 0x48, 0xf3, 0x8e, 0xd0, 0x90, 0x29, 0x84, - 0xc7, 0x38, 0xb0, 0xd1, 0xb5, 0x37, 0x01, 0x5b, 0xc1, 0x11, 0x8d, 0x1c, - 0x26, 0x14, 0xcb, 0xcb, 0x39, 0x04, 0xc2, 0x15, 0xa8, 0x6f, 0x47, 0x8d, - 0x21, 0xaa, 0x0f, 0x22, 0x38, 0x35, 0x89, 0x0b, 0x17, 0x0d, 0x01, 0xca, - 0xf8, 0xb7, 0x54, 0x51, 0x7c, 0x51, 0xc1, 0xcb, 0x23, 0xaa, 0xcf, 0xe0, - 0x02, 0x80, 0x7e, 0x27, 0x97, 0x5f, 0xae, 0x24, 0xd0, 0x56, 0xc1, 0xc7, - 0x58, 0xf9, 0xb8, 0xe9, 0xd4, 0xea, 0x95, 0x4f, 0x21, 0x14, 0x72, 0x11, - 0x31, 0xdb, 0x57, 0x23, 0x89, 0xcb, 0x58, 0x50, 0xcf, 0xf5, 0xa2, 0x50, - 0x5c, 0xd3, 0xdc, 0x36, 0xe7, 0x80, 0xa8, 0x0e, 0x44, 0x5d, 0xc2, 0x9e, - 0x71, 0x97, 0x14, 0xa1, 0x52, 0xd6, 0x92, 0x1b, 0x80, 0xcd, 0x34, 0xde, - 0x1f, 0x98, 0xe5, 0x01, 0x37, 0x2c, 0xc6, 0xf4, 0x85, 0x32, 0x4e, 0xf8, - 0xf2, 0x35, 0x21, 0x42, 0x8f, 0xeb, 0x8f, 0x5b, 0xe0, 0x5d, 0x4a, 0x5b, - 0xaa, 0xb6, 0x44, 0x93, 0x02, 0x28, 0xbe, 0xc2, 0xaa, 0x95, 0xdf, 0x9e, - 0xa8, 0xab, 0x3e, 0x70, 0xb0, 0x20, 0x8b, 0x8b, 0x32, 0x44, 0xf4, 0x0d, - 0x3f, 0x9d, 0xcf, 0x05, 0x0d, 0xeb, 0xd5, 0x8c, 0x6a, 0x6c, 0xbb, 0xa8, - 0xec, 0xba, 0xfc, 0x66, 0xb1, 0x4c, 0x39, 0x40, 0xe8, 0xd0, 0x33, 0x89, - 0xc1, 0x65, 0x84, 0x21, 0x82, 0x3f, 0x16, 0xb2, 0x95, 0x8d, 0xbc, 0x58, - 0xb3, 0xdb, 0x2b, 0xef, 0x23, 0x7e, 0x29, 0xc5, 0xe6, 0xa3, 0xfc, 0x74, - 0x81, 0x79, 0xcb, 0x21, 0x80, 0x32, 0xd1, 0xff, 0xac, 0xd3, 0xb0, 0xc9, - 0x60, 0x41, 0x5b, 0xcc, 0x8c, 0xd7, 0xe3, 0xba, 0xae, 0x2e, 0x52, 0x76, - 0xbb, 0x49, 0x28, 0x72, 0x2b, 0xa2, 0x8f, 0x84, 0xfc, 0x71, 0x61, 0x21, - 0x1b, 0xc1, 0xba, 0x3e, 0x3a, 0xdf, 0xaa, 0xc1, 0xf9, 0x76, 0x0d, 0xa0, - 0xc8, 0xec, 0xac, 0x1d, 0x2e, 0xa9, 0x9b, 0x2f, 0xfe, 0xbf, 0x0a, 0xa2, - 0x69, 0x5f, 0x52, 0xc3, 0xd8, 0x00, 0x3a, 0xe1, 0x00, 0xe7, 0x0d, 0x41, - 0x47, 0x81, 0x07, 0xe7, 0xdb, 0xf4, 0x2b, 0xdb, 0x60, 0xe2, 0x1f, 0xc5, - 0x60, 0x37, 0x1c, 0x69, 0x1a, 0x30, 0x40, 0x18, 0xcc, 0xda, 0xf9, 0xcb, - 0xe3, 0x0c, 0xeb, 0x2a, 0x57, 0x3d, 0xa4, 0x11, 0xc0, 0x23, 0xb8, 0x81, - 0xc6, 0x80, 0x68, 0x02, 0xaa, 0x66, 0xe7, 0x84, 0x10, 0xc8, 0x88, 0x31, - 0x90, 0xf9, 0x9d, 0x52, 0x16, 0x82, 0x7d, 0xb2, 0x5b, 0xa6, 0x5e, 0xa7, - 0xdf, 0x7c, 0xda, 0x06, 0x16, 0xeb, 0xbd, 0x49, 0x79, 0xa5, 0xf8, 0x98, - 0x9f, 0xf1, 0xe5, 0x21, 0x13, 0x83, 0xe1, 0x9f, 0x75, 0xfe, 0x1d, 0xa3, - 0x28, 0xb7, 0x08, 0x61, 0x4d, 0x01, 0x9e, 0xdd, 0x1e, 0x90, 0xea, 0x3e, - 0x97, 0x08, 0xc2, 0x80, 0x9d, 0x64, 0x6c, 0x70, 0xd3, 0xe4, 0xd1, 0x02, - 0x71, 0x7b, 0x1c, 0xb1, 0xa1, 0x4f, 0x69, 0xe7, 0x69, 0x6f, 0xf1, 0x7f, - 0xea, 0x7f, 0x87, 0x3f, 0xa4, 0xea, 0xac, 0xdb, 0xde, 0xe4, 0x97, 0xb9, - 0x81, 0x1d, 0x31, 0x8b, 0x80, 0x07, 0x67, 0x35, 0xfc, 0x6b, 0xf9, 0x3f, - 0xbe, 0xfc, 0xd7, 0x9e, 0xb9, 0xd2, 0xb7, 0xa7, 0x0d, 0x37, 0x61, 0x21, - 0x99, 0x86, 0xf3, 0x47, 0x18, 0x14, 0x0c, 0x2a, 0x3c, 0x5b, 0x91, 0x00, - 0x1e, 0x02, 0x0d, 0xb6, 0x8c, 0xcf, 0x34, 0x0f, 0x37, 0xfe, 0xb4, 0x44, - 0x93, 0x1e, 0x58, 0x11, 0x84, 0x1c, 0xd1, 0x9a, 0x32, 0x23, 0x20, 0xac, - 0x18, 0x55, 0x6f, 0xcb, 0x4a, 0x31, 0x92, 0x17, 0x00, 0x1f, 0x9d, 0xca, - 0xeb, 0xcd, 0x2c, 0x60, 0x80, 0x83, 0xb7, 0x4d, 0x49, 0x7a, 0x37, 0x89, - 0x4a, 0x19, 0xdd, 0x80, 0xab, 0xcb, 0xb9, 0x6d, 0x53, 0x6e, 0xb8, 0xb6, - 0xdc, 0xb8, 0xfa, 0xfe, 0xf4, 0x8d, 0x68, 0xf6, 0xb4, 0xd7, 0xb2, 0x55, - 0xda, 0x60, 0x58, 0x85, 0x34, 0xc4, 0x26, 0xe1, 0x53, 0x09, 0x00, 0x00, - 0x1d, 0x35, 0x32, 0xa5, 0x2c, 0x88, 0x8f, 0x98, 0x0f, 0x36, 0xb7, 0x67, - 0x9c, 0xbf, 0x4d, 0x14, 0x5a, 0x80, 0x7a, 0x57, 0xec, 0xf3, 0xc6, 0x4c, - 0x1d, 0x28, 0x19, 0x07, 0xcf, 0xb9, 0xda, 0x5c, 0xcc, 0xfa, 0x0b, 0x24, - 0xa3, 0xe9, 0xfa, 0x64, 0xda, 0x06, 0xf3, 0xdc, 0xbe, 0xf6, 0x69, 0x1d, - 0x05, 0x2c, 0xf5, 0xb5, 0x10, 0x03, 0x04, 0x8a, 0xa3, 0xe7, 0x7b, 0x16, - 0x42, 0x4f, 0x5c, 0x64, 0xad, 0x90, 0x83, 0x17, 0x0c, 0x91, 0x4e, 0x76, - 0x6a, 0xa9, 0x79, 0xcb, 0x86, 0x94, 0xb3, 0xcd, 0x3f, 0x53, 0x3d, 0xde, - 0xba, 0x0b, 0xb0, 0x6c, 0x1f, 0x96, 0xea, 0x31, 0x4f, 0xe8, 0xe7, 0x13, - 0xb6, 0xfb, 0xaa, 0xc1, 0x5b, 0x84, 0x17, 0xbe, 0xd5, 0xde, 0x0c, 0xd1, - 0x2b, 0x88, 0xd1, 0x7b, 0x25, 0xc3, 0x98, 0x2d, 0x37, 0xd5, 0xc0, 0x97, - 0x16, 0x7b, 0x53, 0xf9, 0x1f, 0x35, 0xa7, 0x94, 0x61, 0x03, 0x05, 0xdf, - 0xf9, 0xe0, 0x02, 0x82, 0x50, 0xf1, 0xb0, 0x10, 0xa9, 0x6e, 0x24, 0xee, - 0x36, 0xea, 0xd5, 0xb4, 0x47, 0x94, 0x72, 0xdc, 0x1e, 0x2d, 0xa1, 0xb8, - 0x48, 0xaf, 0x89, 0x68, 0xf2, 0xa8, 0x89, 0x8a, 0x07, 0x15, 0xbe, 0x41, - 0x08, 0xe9, 0x96, 0xf2, 0xa4, 0xde, 0x22, 0xee, 0xef, 0x5e, 0xd7, 0xc4, - 0xb5, 0x3b, 0x35, 0x74, 0xbe, 0x79, 0xd0, 0x8d, 0xcc, 0xdd, 0xb0, 0x76, - 0x76, 0x29, 0xb9, 0x0b, 0x02, 0x80, 0x25, 0x86, 0xc4, 0x05, 0x8b, 0xa7, - 0xb1, 0x2d, 0x55, 0x6f, 0x39, 0x51, 0x22, 0xaa, 0xb6, 0xcb, 0x05, 0x57, - 0x75, 0xc0, 0x0d, 0x6c, 0x66, 0xd7, 0xc9, 0x86, 0xd9, 0x46, 0x5b, 0x39, - 0xd4, 0x9f, 0x44, 0x32, 0x7c, 0x27, 0x87, 0x23, 0xfb, 0x4b, 0x9d, 0x9c, - 0x2e, 0xe1, 0x9e, 0xef, 0xd0, 0xf9, 0x07, 0x16, 0x25, 0x36, 0x6a, 0x55, - 0x0b, 0x14, 0x9b, 0xca, 0x42, 0xb1, 0x49, 0x1a, 0xb2, 0xb4, 0xd9, 0x36, - 0x9c, 0x20, 0x57, 0xa9, 0x24, 0x44, 0x81, 0x4f, 0x96, 0x2f, 0xca, 0xe5, - 0x5a, 0x5c, 0x6c, 0x97, 0x60, 0x66, 0x6d, 0xbb, 0xce, 0x93, 0x95, 0x00, - 0x0a, 0x8f, 0x79, 0xb3, 0xde, 0x6b, 0x19, 0x58, 0x03, 0xbb, 0x3c, 0xc6, - 0xf7, 0xbc, 0xc3, 0xb9, 0xbe, 0x27, 0x87, 0x23, 0x78, 0x25, 0xf2, 0x61, - 0x51, 0x32, 0xb8, 0x42, 0x1b, 0xb8, 0x42, 0xa9, 0xae, 0x7e, 0x89, 0x19, - 0xad, 0x85, 0x8d, 0xea, 0x50, 0x33, 0x59, 0x8a, 0xe4, 0xc9, 0xf9, 0x09, - 0x2d, 0xa5, 0xab, 0x14, 0x6a, 0x03, 0x8d, 0x3a, 0x44, 0x3c, 0xb2, 0x23, - 0x86, 0x2e, 0xf4, 0x09, 0xa2, 0x34, 0xc3, 0x02, 0x04, 0x3a, 0x44, 0x89, - 0x72, 0xf8, 0x13, 0xdb, 0x97, 0xf0, 0x1a, 0xfa, 0x6c, 0x5e, 0x5a, 0x30, - 0x2f, 0xbd, 0x3a, 0x35, 0x2f, 0x2d, 0xee, 0x79, 0x71, 0x0f, 0x3c, 0xe0, - 0xed, 0xfa, 0xce, 0x76, 0xfd, 0x63, 0xb8, 0x60, 0xcb, 0x44, 0x52, 0xda, - 0x14, 0x6c, 0x50, 0xd9, 0x11, 0x67, 0x45, 0x82, 0xcc, 0xff, 0x56, 0x22, - 0x50, 0x90, 0x82, 0x0e, 0x37, 0x43, 0x07, 0x26, 0x69, 0x1f, 0x8e, 0xec, - 0x1f, 0xf0, 0xc5, 0x81, 0xd4, 0x71, 0xcc, 0x3b, 0xdd, 0x69, 0xeb, 0x77, - 0x66, 0xf0, 0x23, 0xd4, 0xef, 0x4a, 0xb6, 0x17, 0x53, 0x5c, 0x73, 0xa3, - 0xdf, 0xf8, 0x22, 0x0c, 0xea, 0x7d, 0xfd, 0x2e, 0xf2, 0x77, 0x7a, 0xf4, - 0x1d, 0x6e, 0x50, 0x1d, 0x8f, 0x5d, 0x1f, 0x16, 0x0d, 0xd6, 0xa6, 0x13, - 0x8d, 0xfd, 0xc2, 0xab, 0x52, 0x23, 0x10, 0xa2, 0x11, 0x07, 0xbe, 0xbf, - 0x2e, 0xeb, 0x1c, 0x25, 0xef, 0x85, 0x5a, 0xb8, 0x54, 0x68, 0x71, 0x8b, - 0x36, 0x78, 0xdf, 0x65, 0xaa, 0xf5, 0x3b, 0x64, 0xf3, 0x7c, 0xcc, 0x65, - 0x60, 0xc9, 0xee, 0xf4, 0xed, 0x01, 0x53, 0xeb, 0xac, 0x87, 0xb8, 0xf2, - 0x97, 0xd5, 0xf7, 0x89, 0x81, 0x37, 0x2e, 0x98, 0xfc, 0x56, 0xbf, 0x94, - 0x2c, 0xd2, 0x1e, 0x6a, 0xba, 0xaf, 0x16, 0x22, 0x72, 0x9c, 0x38, 0xdf, - 0xc3, 0x2f, 0xcd, 0x14, 0xd8, 0x15, 0xf6, 0x5c, 0xca, 0x43, 0x89, 0x44, - 0x11, 0xa8, 0x02, 0x10, 0xad, 0x6d, 0x11, 0x17, 0xba, 0xec, 0x30, 0xc7, - 0xdf, 0x37, 0x89, 0x7a, 0x75, 0x93, 0xa8, 0x37, 0x1f, 0x10, 0xe8, 0x3b, - 0xf7, 0xba, 0x7d, 0x0f, 0x7f, 0x66, 0xe2, 0x3a, 0xdd, 0x85, 0x18, 0x87, - 0xbd, 0x3e, 0x1a, 0x44, 0x54, 0xd4, 0x27, 0x5b, 0x49, 0x3f, 0x39, 0x78, - 0xd0, 0x9b, 0x06, 0xaa, 0xd7, 0xb7, 0xa9, 0x18, 0xa7, 0x55, 0x09, 0x56, - 0x30, 0x95, 0xc8, 0xb4, 0x75, 0x24, 0xd6, 0x3a, 0xb4, 0x68, 0x43, 0x6c, - 0x69, 0x28, 0x28, 0x9b, 0xd6, 0x65, 0xd4, 0x68, 0x85, 0x6c, 0xc4, 0xd3, - 0x0a, 0x11, 0x8b, 0xa3, 0x06, 0xcc, 0x46, 0x1b, 0x2c, 0xaf, 0x45, 0xb0, - 0x7c, 0xeb, 0xf1, 0xf8, 0x99, 0xdd, 0x7c, 0x37, 0xa6, 0xc4, 0xda, 0x8a, - 0xa3, 0x17, 0x0b, 0x0a, 0x3e, 0xcf, 0xeb, 0x4e, 0xa7, 0x74, 0x67, 0xe9, - 0x37, 0xc7, 0x87, 0xd4, 0x13, 0xdb, 0x21, 0x72, 0x50, 0xd5, 0x82, 0xf9, - 0x7e, 0x5a, 0x91, 0xa0, 0xa6, 0x59, 0x52, 0x48, 0x0b, 0x9c, 0x81, 0x28, - 0x9d, 0x00, 0x4e, 0x85, 0x10, 0x33, 0x46, 0x64, 0x30, 0xea, 0xc2, 0x59, - 0x52, 0x26, 0x91, 0x81, 0x8e, 0x33, 0x27, 0x53, 0xb8, 0x33, 0xb2, 0x20, - 0x81, 0xc6, 0x87, 0x69, 0xd5, 0x21, 0x7d, 0xb8, 0x8d, 0x5b, 0xbe, 0x41, - 0x66, 0x01, 0xd7, 0x3a, 0x85, 0x9c, 0xf7, 0x52, 0x14, 0xa2, 0x46, 0x52, - 0xa6, 0xa6, 0xcd, 0x59, 0x3a, 0xb9, 0x1e, 0xf3, 0x4e, 0xb9, 0xd7, 0x32, - 0xb0, 0x2a, 0x76, 0x5a, 0x5f, 0x79, 0xf8, 0x3c, 0xdd, 0x80, 0xac, 0x57, - 0x3f, 0xc9, 0x0e, 0x18, 0x26, 0x05, 0x0c, 0x6b, 0x88, 0x79, 0xe6, 0x94, - 0x33, 0xa6, 0x63, 0x08, 0x03, 0x44, 0xf7, 0x70, 0xb2, 0x3d, 0xe6, 0x38, - 0x43, 0x7a, 0x34, 0x04, 0xa7, 0x02, 0xb2, 0x14, 0xee, 0xde, 0x0a, 0xd8, - 0xf7, 0xdb, 0xe7, 0x50, 0xde, 0x8c, 0x67, 0xa1, 0xe2, 0x98, 0x9a, 0xbc, - 0xad, 0x62, 0x42, 0x50, 0xd2, 0xfd, 0x24, 0x9f, 0x7a, 0xcc, 0x65, 0x36, - 0x41, 0xeb, 0xa6, 0x4d, 0x43, 0x4c, 0x3a, 0x94, 0x78, 0x45, 0xe4, 0x0d, - 0x75, 0x01, 0x97, 0x62, 0xe3, 0xc0, 0x6a, 0xfb, 0x35, 0xcc, 0x34, 0x2c, - 0xfe, 0x76, 0x6e, 0x19, 0x1f, 0x1e, 0x0b, 0x83, 0xe2, 0xc3, 0xed, 0xd6, - 0x5f, 0xee, 0xdc, 0x29, 0x42, 0x38, 0x41, 0x24, 0xf4, 0x43, 0x34, 0x01, - 0xd9, 0xcc, 0x88, 0xea, 0xce, 0x80, 0x55, 0xa4, 0x2f, 0x2c, 0x7e, 0x07, - 0x46, 0xe6, 0x12, 0xb4, 0x3c, 0x74, 0x68, 0xcc, 0x44, 0x8d, 0x72, 0x51, - 0x91, 0xcc, 0x4d, 0x88, 0x61, 0x97, 0x9e, 0x9b, 0x26, 0xe6, 0xc5, 0x0a, - 0x52, 0x6c, 0x3b, 0x47, 0xba, 0xee, 0x33, 0x53, 0x11, 0xef, 0xb5, 0x0c, - 0xac, 0x85, 0x5d, 0x1e, 0xdb, 0x5b, 0x07, 0x8b, 0xe5, 0xc5, 0x92, 0xda, - 0x19, 0x4c, 0xf6, 0x77, 0x47, 0x72, 0x77, 0x37, 0xc8, 0xa3, 0x87, 0xdb, - 0x5b, 0x7f, 0x6b, 0x99, 0x3f, 0xe3, 0xc5, 0x81, 0x95, 0x85, 0x46, 0x13, - 0x78, 0x70, 0x38, 0x53, 0x1b, 0xd2, 0x5c, 0x62, 0x85, 0x10, 0x6d, 0xb1, - 0x25, 0xa2, 0x20, 0xfd, 0x71, 0xc8, 0x12, 0x29, 0x1e, 0x82, 0xc6, 0x74, - 0x49, 0x0e, 0x5d, 0xd6, 0x5a, 0x23, 0xc5, 0xa5, 0x5b, 0xc8, 0xea, 0xae, - 0x65, 0xfc, 0x0d, 0x5e, 0xc6, 0x46, 0x24, 0xc8, 0xab, 0xe1, 0x03, 0x94, - 0xdf, 0x7d, 0xb1, 0x64, 0xfa, 0x4c, 0x80, 0x07, 0x30, 0xed, 0x3b, 0x6d, - 0xaf, 0xd4, 0x1f, 0x17, 0xa8, 0x83, 0xc9, 0x88, 0x28, 0x9f, 0x73, 0x53, - 0xd8, 0x60, 0x4c, 0x4f, 0xef, 0x44, 0x93, 0x83, 0x99, 0x75, 0xc1, 0xc2, - 0xaf, 0x43, 0xf5, 0xcd, 0x2d, 0x86, 0x1c, 0xbf, 0xca, 0x86, 0x41, 0x66, - 0xe7, 0x2a, 0xb1, 0x1f, 0x1c, 0x88, 0xe1, 0x28, 0x5a, 0xa4, 0xc6, 0x5a, - 0x20, 0x91, 0xeb, 0x81, 0x18, 0xd3, 0x4a, 0x12, 0x6a, 0xc6, 0x08, 0x29, - 0x8c, 0xca, 0x00, 0x5e, 0x4b, 0x04, 0xee, 0x43, 0x0d, 0x86, 0x8a, 0x60, - 0x78, 0x15, 0x33, 0xed, 0x26, 0x0e, 0x5f, 0x1d, 0xa3, 0x8b, 0xb0, 0x6e, - 0x0a, 0x39, 0xc0, 0x52, 0x44, 0x10, 0xa5, 0x28, 0x80, 0x26, 0x11, 0x0f, - 0x2e, 0x11, 0x16, 0x92, 0x1f, 0x0f, 0x5b, 0xb7, 0x95, 0xbc, 0xd8, 0x12, - 0xa5, 0xb1, 0xe3, 0x68, 0x15, 0x5f, 0x1e, 0x04, 0xcd, 0xda, 0xba, 0xf1, - 0xab, 0x70, 0x94, 0x93, 0xc7, 0x0a, 0x10, 0xf0, 0x0c, 0x24, 0xbf, 0x9c, - 0x4d, 0xad, 0xb2, 0x72, 0xd1, 0xbb, 0x50, 0xf5, 0xfe, 0x64, 0x24, 0x38, - 0xec, 0x04, 0xae, 0xb0, 0x89, 0xa9, 0x08, 0x98, 0x0c, 0x77, 0x54, 0x0c, - 0xc2, 0x43, 0xa8, 0x7f, 0x89, 0x8a, 0x2c, 0xb8, 0x31, 0x5a, 0x81, 0xe3, - 0xbe, 0x19, 0x0b, 0xed, 0xc7, 0xc1, 0xd0, 0x82, 0xf5, 0xfb, 0x4c, 0x5a, - 0x9f, 0xa9, 0x8c, 0x02, 0x2a, 0x88, 0xb6, 0xa3, 0x55, 0x4e, 0x00, 0xb2, - 0xe1, 0x54, 0xdf, 0x79, 0x6c, 0x94, 0xee, 0xb5, 0x6b, 0x7a, 0x6a, 0x6b, - 0x3e, 0xdb, 0x69, 0x05, 0xab, 0x1c, 0xa7, 0x97, 0x0a, 0x2b, 0x88, 0x0f, - 0xbf, 0x40, 0x56, 0x01, 0xbf, 0xc5, 0x87, 0x11, 0xb1, 0x60, 0x0b, 0x2b, - 0xaf, 0xfa, 0xd0, 0x92, 0x55, 0x6d, 0x3f, 0x89, 0x3e, 0x10, 0x30, 0xfe, - 0xe0, 0xe3, 0x29, 0xd3, 0x95, 0x5e, 0x90, 0x75, 0x54, 0x88, 0x30, 0xf5, - 0x4f, 0x4e, 0xe6, 0xc9, 0x4c, 0xe8, 0x25, 0xd8, 0x19, 0x02, 0x33, 0x0f, - 0xeb, 0x41, 0xcd, 0x71, 0x4e, 0x45, 0x97, 0xa5, 0x40, 0x38, 0x2e, 0xe2, - 0x5a, 0xb5, 0xb6, 0x73, 0xdc, 0xc5, 0xf4, 0x56, 0x8d, 0xd1, 0x6e, 0xad, - 0xf5, 0x2f, 0xa6, 0x50, 0x9c, 0xd6, 0xa0, 0x62, 0xc9, 0x71, 0x23, 0x32, - 0x4b, 0x50, 0xa4, 0x40, 0x56, 0x4f, 0x4e, 0x92, 0xa4, 0xcc, 0x38, 0xe6, - 0x36, 0x94, 0x7e, 0x5b, 0x18, 0x8b, 0xfc, 0xcb, 0xba, 0x2a, 0xee, 0x75, - 0x3d, 0x5c, 0xb6, 0x95, 0xdf, 0x03, 0x85, 0xd6, 0x05, 0x49, 0x12, 0x1b, - 0x5b, 0x78, 0x14, 0x9b, 0x7d, 0xba, 0x81, 0xcf, 0x73, 0xcd, 0xa9, 0x27, - 0xb7, 0x01, 0x7f, 0x6b, 0x5c, 0xa3, 0xaf, 0x0c, 0x25, 0xf0, 0x41, 0xb1, - 0xc2, 0x0f, 0x28, 0x79, 0x00, 0x95, 0x00, 0xac, 0x10, 0x03, 0x05, 0x20, - 0x6b, 0x90, 0xf6, 0xac, 0x1a, 0x38, 0x5f, 0x73, 0xa6, 0x52, 0xac, 0x6e, - 0x09, 0x37, 0xa6, 0xc7, 0x30, 0x02, 0x32, 0xd2, 0x61, 0x6f, 0x0e, 0x35, - 0xe8, 0x96, 0x00, 0xcc, 0x18, 0xa1, 0xd9, 0x87, 0x08, 0xec, 0x92, 0xfb, - 0x51, 0x66, 0xad, 0x74, 0x0c, 0x88, 0x6c, 0xc4, 0x30, 0xce, 0x03, 0xaa, - 0x06, 0x21, 0x3f, 0x03, 0x50, 0x2e, 0x0e, 0xea, 0xc3, 0x8a, 0xd2, 0x31, - 0x42, 0x96, 0xcc, 0xc8, 0x91, 0xaf, 0x1a, 0x14, 0x8e, 0xfc, 0x45, 0xa0, - 0x10, 0x6a, 0x4c, 0x00, 0x80, 0x65, 0xf2, 0xf9, 0x0e, 0x56, 0xb9, 0xf6, - 0x75, 0x3c, 0x28, 0x33, 0x67, 0x4c, 0xa5, 0xb1, 0x79, 0x1e, 0x96, 0xe7, - 0x68, 0x8a, 0xfb, 0x8a, 0xa6, 0xf8, 0x6d, 0x5d, 0x34, 0x85, 0xba, 0x52, - 0x2a, 0xd5, 0xd9, 0xfc, 0x8c, 0x42, 0x29, 0xfe, 0x2e, 0x09, 0xb5, 0x12, - 0x2e, 0x44, 0xf7, 0x74, 0x26, 0xe3, 0xff, 0xb8, 0x2d, 0xa9, 0xed, 0x97, - 0x78, 0x4e, 0x79, 0xd5, 0xce, 0x19, 0xef, 0xad, 0x69, 0x4d, 0x70, 0xfe, - 0x49, 0xcf, 0x69, 0x94, 0xa7, 0x15, 0x60, 0x38, 0xf9, 0x0d, 0xa7, 0x7b, - 0xf6, 0x8c, 0xe0, 0xf0, 0x14, 0x63, 0x8e, 0x01, 0x58, 0x1f, 0x28, 0x28, - 0x19, 0x92, 0x04, 0x72, 0x62, 0x8d, 0xa6, 0x99, 0xc1, 0x39, 0x01, 0xfc, - 0xf2, 0x57, 0x37, 0xec, 0xdb, 0x26, 0x16, 0xc8, 0x36, 0x68, 0x7f, 0x61, - 0x75, 0xec, 0xb2, 0xce, 0x77, 0x5f, 0x66, 0x8e, 0x2c, 0x02, 0x12, 0xa6, - 0xb1, 0x69, 0x5d, 0x1f, 0x66, 0x79, 0x8b, 0x9f, 0x9c, 0xce, 0xf1, 0x47, - 0x43, 0xe9, 0xb7, 0x0b, 0xfc, 0x4e, 0xb3, 0xcd, 0x28, 0xe0, 0x0c, 0xd1, - 0xff, 0xec, 0x4b, 0x0c, 0x20, 0xb1, 0x76, 0xb0, 0xbd, 0xc1, 0x1d, 0x4e, - 0x79, 0x49, 0x34, 0xf3, 0x3d, 0x10, 0x90, 0x52, 0xd3, 0xa3, 0xe8, 0xc5, - 0xc6, 0x74, 0x3d, 0xf8, 0xc4, 0x91, 0xe2, 0xa5, 0xb7, 0x9c, 0xa4, 0x27, - 0x2c, 0x01, 0x3c, 0x44, 0xb3, 0x7e, 0x4b, 0x36, 0xf8, 0xa6, 0x05, 0x33, - 0xa6, 0x3e, 0x32, 0xdc, 0x4a, 0x6c, 0x27, 0x4a, 0x05, 0xf3, 0x71, 0x16, - 0x5b, 0x7e, 0x75, 0xf8, 0xed, 0x93, 0xf1, 0x24, 0xae, 0x2e, 0x03, 0x4b, - 0x62, 0xe7, 0x12, 0x5e, 0x01, 0x96, 0x42, 0x01, 0xcf, 0x6c, 0xca, 0xa7, - 0xeb, 0xbb, 0xfe, 0xbe, 0x41, 0x19, 0x8d, 0xbe, 0x66, 0xbe, 0x49, 0xc7, - 0xe2, 0xc5, 0x2e, 0x89, 0x66, 0xd6, 0x50, 0x2d, 0x8d, 0x78, 0xe7, 0x05, - 0x98, 0x36, 0x92, 0xf5, 0x63, 0x06, 0x28, 0x32, 0x8c, 0x15, 0xce, 0xa2, - 0x62, 0xda, 0xa7, 0xfd, 0x75, 0x50, 0x8e, 0xb8, 0x84, 0x48, 0x3f, 0xa5, - 0xcd, 0xe5, 0x07, 0x46, 0x1b, 0xe4, 0xcb, 0x89, 0x29, 0x2b, 0xb8, 0x78, - 0x47, 0x6e, 0x67, 0xd8, 0x5e, 0x73, 0xcf, 0xe6, 0x03, 0x95, 0x72, 0x18, - 0x8d, 0xc9, 0x7e, 0xf6, 0x04, 0xf9, 0xc2, 0xa8, 0x47, 0x3f, 0x10, 0x10, - 0x71, 0x56, 0x78, 0xeb, 0x2a, 0xc9, 0x07, 0x71, 0x29, 0xb9, 0x4a, 0xb9, - 0x13, 0x06, 0xde, 0x1e, 0x7c, 0x58, 0x31, 0xa9, 0x0f, 0xfa, 0x43, 0x6a, - 0x1e, 0x47, 0x06, 0xc1, 0x34, 0x3b, 0xbf, 0xca, 0x48, 0xb0, 0x2a, 0x7c, - 0x71, 0x5c, 0xc1, 0x4c, 0x9f, 0xe8, 0x38, 0xff, 0x63, 0x25, 0x26, 0x29, - 0xa9, 0x07, 0xd4, 0x4e, 0x4c, 0xd5, 0x38, 0xe4, 0xf1, 0x3e, 0x85, 0x72, - 0x97, 0x79, 0xbf, 0x0b, 0xeb, 0x01, 0xf3, 0x4d, 0x22, 0x93, 0x53, 0x91, - 0xcd, 0x74, 0x09, 0xe9, 0x90, 0x97, 0xbc, 0x39, 0x66, 0x62, 0xd0, 0xca, - 0xa5, 0x70, 0x5e, 0xd8, 0x23, 0xbb, 0xe8, 0x50, 0xc6, 0xe0, 0x02, 0x21, - 0x52, 0x2f, 0x64, 0x1a, 0x82, 0x84, 0x38, 0x2f, 0x16, 0xf6, 0x42, 0x83, - 0xe7, 0xbe, 0x69, 0x7b, 0x20, 0x88, 0x07, 0x58, 0xae, 0xc6, 0x6b, 0x6c, - 0x8f, 0x59, 0x4e, 0x06, 0xa5, 0x20, 0x9e, 0x4f, 0xb7, 0x18, 0x4f, 0x73, - 0x2d, 0xa6, 0x6e, 0xe2, 0xae, 0x94, 0x4b, 0x32, 0x2c, 0x20, 0xb5, 0x0a, - 0x4f, 0xd9, 0x38, 0xe8, 0x41, 0x89, 0x9b, 0x81, 0x10, 0x5d, 0x14, 0x20, - 0xc2, 0xfc, 0x37, 0x86, 0x62, 0x04, 0x03, 0x58, 0xca, 0xf1, 0xde, 0x49, - 0x88, 0x13, 0x0c, 0x14, 0x46, 0x6a, 0xaa, 0x03, 0xdd, 0x57, 0x89, 0xf4, - 0xaa, 0xb8, 0xf2, 0xc4, 0xa8, 0xa4, 0xd6, 0x96, 0xb8, 0x33, 0xf9, 0x4b, - 0xe8, 0x9b, 0x3a, 0x01, 0x2c, 0x0c, 0x61, 0x05, 0x42, 0x70, 0x49, 0x4c, - 0x0b, 0x50, 0x1b, 0xe5, 0x45, 0xa8, 0xcd, 0xd5, 0x82, 0x5a, 0x06, 0x19, - 0xe9, 0xca, 0xe3, 0x7a, 0x21, 0x2c, 0xbc, 0x70, 0xde, 0x25, 0xca, 0xf1, - 0x0a, 0xcc, 0xc4, 0x8c, 0xe5, 0x03, 0x79, 0x8b, 0x2e, 0x19, 0x40, 0x2d, - 0x30, 0xb1, 0x1c, 0x83, 0x5f, 0x21, 0x43, 0x21, 0xcf, 0x14, 0x5e, 0x30, - 0xf0, 0x7a, 0x14, 0x90, 0xa8, 0xce, 0x91, 0xea, 0x64, 0xf6, 0x85, 0xde, - 0x0d, 0x51, 0x10, 0x0e, 0xe1, 0x4b, 0xc5, 0x4b, 0xe3, 0x89, 0x55, 0xcd, - 0x11, 0x55, 0x34, 0x18, 0x0d, 0xd0, 0xd9, 0x62, 0xb7, 0x9c, 0x98, 0x96, - 0x03, 0xce, 0x55, 0x80, 0x9d, 0x6e, 0x39, 0x25, 0x64, 0x88, 0x95, 0x48, - 0x8f, 0xf9, 0xdb, 0xd8, 0x42, 0xe1, 0x0f, 0xf5, 0x4c, 0xd0, 0x6c, 0xf8, - 0x30, 0x96, 0x2d, 0x13, 0x21, 0x51, 0xb8, 0x98, 0x63, 0xc3, 0x83, 0x2a, - 0x14, 0x50, 0x6d, 0x85, 0x4c, 0x34, 0x0c, 0x1c, 0x96, 0x86, 0x79, 0xf3, - 0x69, 0xf3, 0xa0, 0x3f, 0xba, 0x32, 0xb0, 0x56, 0x77, 0xae, 0xbb, 0x10, - 0xfe, 0x34, 0x95, 0x8d, 0xfb, 0xa7, 0xa7, 0x93, 0xb5, 0xc8, 0xa9, 0x39, - 0xc3, 0x00, 0x68, 0x62, 0x87, 0x1a, 0x5e, 0xba, 0x02, 0x52, 0x21, 0x67, - 0xdd, 0x2b, 0x09, 0x86, 0x86, 0x88, 0xb0, 0xea, 0x2f, 0xed, 0x0a, 0x73, - 0x20, 0xee, 0x5b, 0x46, 0x45, 0xc8, 0x89, 0xfe, 0x24, 0x1d, 0x80, 0x62, - 0xd7, 0x72, 0x01, 0xc1, 0x68, 0xd1, 0x91, 0x8f, 0x56, 0x69, 0x57, 0xf9, - 0xcf, 0xc8, 0xcc, 0xc8, 0x78, 0xdd, 0xde, 0x29, 0x06, 0xfd, 0xaa, 0x9d, - 0xfe, 0xd8, 0x36, 0x5a, 0xc8, 0x3a, 0xdd, 0xec, 0x25, 0x63, 0x57, 0xbc, - 0x27, 0xf6, 0x16, 0x09, 0x00, 0xa5, 0xe1, 0xf2, 0x43, 0x08, 0xea, 0xbf, - 0xba, 0xdc, 0xb5, 0xac, 0xba, 0xd5, 0x57, 0x68, 0xdb, 0x32, 0xd5, 0xec, - 0x30, 0x10, 0xd8, 0xec, 0x2e, 0x59, 0x8d, 0x9b, 0x70, 0xb0, 0x6d, 0xea, - 0xef, 0x60, 0xef, 0x54, 0x01, 0x02, 0x97, 0x69, 0xbc, 0x35, 0x4b, 0x84, - 0xda, 0x4e, 0x9d, 0x27, 0x73, 0xa7, 0xc9, 0x8c, 0x11, 0x8a, 0x83, 0x70, - 0x27, 0x5a, 0xca, 0x4e, 0x0a, 0x2d, 0xdb, 0x4b, 0xa1, 0x65, 0x69, 0x55, - 0xe1, 0x34, 0x2f, 0x48, 0x11, 0x85, 0xa7, 0x98, 0xc9, 0xdd, 0xbc, 0xcf, - 0xf8, 0x98, 0xd0, 0x6f, 0x1f, 0x56, 0x76, 0xdb, 0x4b, 0xd4, 0xbf, 0xb4, - 0x4c, 0xcf, 0xb7, 0x1e, 0x97, 0x8b, 0x2e, 0xe8, 0x83, 0xf7, 0x16, 0x56, - 0x77, 0xd1, 0xe2, 0x85, 0x63, 0x1b, 0x5c, 0xdb, 0x2f, 0xfa, 0xd0, 0x8e, - 0x11, 0xf3, 0x12, 0xbe, 0x96, 0x36, 0xe6, 0xd5, 0x22, 0xb6, 0xe5, 0x3e, - 0xb6, 0xf1, 0x3a, 0x6d, 0x0a, 0x25, 0x18, 0x89, 0xd1, 0x48, 0xc0, 0xec, - 0x05, 0x3d, 0x16, 0x3c, 0xc8, 0xc6, 0xcc, 0x22, 0x84, 0x98, 0x3f, 0x54, - 0x54, 0x35, 0x8c, 0xcc, 0x96, 0xd1, 0x8a, 0x2a, 0x1e, 0x02, 0x1b, 0x1f, - 0xb7, 0xca, 0x30, 0x59, 0x1b, 0x89, 0xa3, 0x43, 0x88, 0x4f, 0x96, 0x34, - 0xb8, 0x0a, 0x92, 0x6d, 0x9f, 0x09, 0x31, 0xd5, 0xc4, 0x19, 0xdf, 0xa3, - 0x6b, 0xf8, 0x8e, 0x42, 0x86, 0xec, 0x53, 0x0e, 0x19, 0xfa, 0x5e, 0x76, - 0xf4, 0x16, 0xe0, 0xe2, 0xea, 0xe8, 0x06, 0x39, 0xb4, 0xee, 0x03, 0xd3, - 0x47, 0x25, 0xa2, 0x0d, 0x0e, 0x63, 0x6f, 0x24, 0xf3, 0xf1, 0xa2, 0x65, - 0x25, 0x11, 0x91, 0x6f, 0xa2, 0xfc, 0xf2, 0x8e, 0xd9, 0x9e, 0x90, 0x31, - 0xb9, 0x29, 0x3f, 0x64, 0xdd, 0x44, 0xee, 0x08, 0xe4, 0x9f, 0x39, 0x76, - 0x14, 0xfd, 0xde, 0xc4, 0x2b, 0x69, 0x31, 0x9d, 0xdf, 0x2c, 0x13, 0x88, - 0x8d, 0xc7, 0x05, 0x6b, 0xcc, 0xf9, 0x83, 0x79, 0x93, 0x8a, 0x9e, 0x21, - 0xfb, 0x20, 0xef, 0xf0, 0x68, 0xbf, 0x76, 0xaf, 0x6a, 0xd5, 0x1c, 0x2b, - 0xd5, 0x1a, 0x2b, 0x58, 0x51, 0x3b, 0xe3, 0x8b, 0x36, 0xe1, 0x4f, 0xd5, - 0x09, 0x81, 0x06, 0x6c, 0xa2, 0x4f, 0x2c, 0x82, 0x30, 0xf2, 0x63, 0x5f, - 0xaa, 0x6d, 0x2b, 0xf1, 0xec, 0xb2, 0x3a, 0x41, 0x89, 0x2f, 0xa8, 0xfc, - 0x9d, 0x07, 0x9f, 0x5f, 0xbf, 0x2a, 0x4c, 0x53, 0xc8, 0x53, 0xa4, 0xa4, - 0x34, 0xd6, 0xd7, 0x6e, 0xfe, 0x1f, 0x44, 0xc2, 0x48, 0x32, 0x93, 0x96, - 0xf8, 0x3a, 0x4c, 0x4b, 0xce, 0x36, 0x62, 0xa5, 0x56, 0xb9, 0x43, 0x6b, - 0xae, 0xee, 0x9d, 0xd2, 0x47, 0xb4, 0x19, 0x4a, 0xf0, 0x53, 0xf8, 0x5f, - 0x49, 0x9c, 0x3a, 0xca, 0x10, 0x0e, 0x99, 0x61, 0x39, 0x8b, 0x2d, 0x5b, - 0xa4, 0x21, 0xb9, 0xab, 0x2e, 0xb7, 0xa1, 0x92, 0x2c, 0x1d, 0x12, 0xb6, - 0x16, 0x4b, 0x33, 0x61, 0x4e, 0x2d, 0x99, 0x73, 0x19, 0xa7, 0xea, 0x2b, - 0x19, 0xba, 0x42, 0x82, 0x47, 0x44, 0xaa, 0xf6, 0x1c, 0x9a, 0xcb, 0x78, - 0x53, 0xcf, 0x40, 0x57, 0x0a, 0xb8, 0x42, 0x9e, 0xf9, 0xc1, 0x10, 0xcc, - 0xcc, 0xe3, 0x96, 0x0d, 0x45, 0x78, 0x40, 0x29, 0xa4, 0x48, 0x09, 0xd5, - 0x93, 0xe4, 0xa9, 0x26, 0x32, 0x56, 0x43, 0x65, 0x86, 0xae, 0x54, 0x81, - 0xd9, 0xd3, 0xd1, 0xfa, 0x85, 0xa4, 0x2a, 0x91, 0xc0, 0xa8, 0x6c, 0x21, - 0x19, 0x51, 0xe6, 0x6b, 0xc7, 0xbd, 0x29, 0x46, 0x70, 0xc5, 0x87, 0x21, - 0x42, 0x6f, 0x7d, 0xc1, 0xde, 0x32, 0xae, 0x35, 0xbd, 0xc0, 0x57, 0xf8, - 0xc0, 0x24, 0xed, 0x9e, 0x4b, 0xf8, 0x42, 0x73, 0xaf, 0xf1, 0xea, 0x75, - 0x2c, 0xc9, 0x96, 0x2b, 0xb3, 0x5f, 0x21, 0x69, 0x67, 0xc4, 0x08, 0x5b, - 0xad, 0x35, 0xbf, 0x11, 0xfc, 0x8a, 0xe4, 0xee, 0x81, 0xda, 0xa5, 0x3e, - 0x79, 0x8e, 0xb2, 0x84, 0x57, 0x70, 0x6c, 0x17, 0x32, 0x00, 0xc8, 0xdf, - 0x96, 0x6b, 0xaa, 0x74, 0x21, 0x92, 0x84, 0xf2, 0x38, 0x7b, 0xbb, 0xb4, - 0x1c, 0x8a, 0x8f, 0x0e, 0x51, 0x2b, 0x8a, 0x30, 0xbb, 0x40, 0x53, 0x42, - 0x43, 0x00, 0x87, 0x04, 0x46, 0xd2, 0x18, 0x57, 0x74, 0x04, 0xc4, 0x2c, - 0x63, 0xca, 0x72, 0x20, 0x47, 0x42, 0x36, 0x6d, 0x98, 0xff, 0x84, 0xb3, - 0x65, 0x7c, 0x9f, 0x54, 0x19, 0x68, 0xc4, 0xd0, 0x80, 0xe2, 0x77, 0x4c, - 0x5b, 0x5c, 0x1e, 0x21, 0x3f, 0x55, 0xd8, 0xc5, 0x3d, 0x94, 0x38, 0x10, - 0x8d, 0x3a, 0xce, 0x56, 0xc2, 0xe5, 0x92, 0xb7, 0x32, 0xf3, 0x9b, 0xaa, - 0x44, 0xab, 0x03, 0x12, 0x8f, 0x1d, 0x31, 0x4c, 0xdc, 0x70, 0x23, 0x0a, - 0xd2, 0x20, 0x20, 0xff, 0xb0, 0x03, 0x10, 0x71, 0xa2, 0xe9, 0xc1, 0x2f, - 0x91, 0x14, 0x15, 0x28, 0x86, 0xf2, 0x8f, 0x08, 0x82, 0x56, 0x89, 0x3a, - 0x43, 0xb1, 0xe6, 0x91, 0x1a, 0x04, 0xd4, 0x72, 0x82, 0x72, 0x58, 0x75, - 0x99, 0x5e, 0x9c, 0x13, 0xcd, 0x01, 0xb7, 0xb9, 0xa3, 0x61, 0x5b, 0xc2, - 0x67, 0xb1, 0x65, 0x0d, 0x41, 0x0c, 0xb9, 0x03, 0xa5, 0x46, 0xa4, 0x5f, - 0xd5, 0xf8, 0x66, 0xf8, 0x03, 0x00, 0x71, 0xa0, 0xf3, 0x3c, 0x43, 0xfe, - 0x23, 0xbe, 0x97, 0x71, 0xf5, 0x30, 0x97, 0x5c, 0x3b, 0x9b, 0x28, 0x4e, - 0xda, 0x68, 0x0b, 0x4f, 0x0c, 0x0b, 0x88, 0x37, 0xa0, 0xcd, 0x58, 0x38, - 0x37, 0x44, 0xe3, 0x41, 0x23, 0x3f, 0xee, 0xb0, 0x16, 0xa6, 0x77, 0xf9, - 0xd4, 0x56, 0x73, 0x93, 0x54, 0x93, 0xc0, 0x53, 0x65, 0xdb, 0x55, 0xd8, - 0x35, 0x55, 0xdc, 0xeb, 0xd1, 0x0a, 0xf2, 0x76, 0xe7, 0x35, 0xe7, 0xd0, - 0x85, 0xb9, 0x02, 0x99, 0xd2, 0x11, 0x50, 0x48, 0x81, 0x46, 0x0c, 0x29, - 0xde, 0x2e, 0x23, 0x69, 0xc1, 0x14, 0xd6, 0xa7, 0xf0, 0x61, 0x84, 0xc5, - 0x83, 0x10, 0xa0, 0x83, 0xb3, 0x9b, 0x9f, 0x9c, 0xa6, 0x5d, 0xb8, 0x23, - 0x01, 0x05, 0xc5, 0x8b, 0x5f, 0xcb, 0x3a, 0x4e, 0x1e, 0x35, 0xad, 0xea, - 0x94, 0x6b, 0x7a, 0x37, 0xb5, 0x08, 0xec, 0x39, 0x66, 0x2a, 0x5f, 0x53, - 0xcb, 0x6a, 0x3c, 0xc3, 0x57, 0x5d, 0x8d, 0x84, 0xd5, 0x23, 0xb1, 0xaa, - 0x8e, 0xac, 0x41, 0xb8, 0x91, 0xef, 0x64, 0xaa, 0x3e, 0x54, 0x92, 0xc8, - 0xa1, 0x40, 0xde, 0x60, 0x37, 0x65, 0x31, 0x9f, 0x52, 0x7d, 0x0b, 0xac, - 0x94, 0xd5, 0x2f, 0x83, 0x09, 0xbe, 0xa7, 0x6c, 0xdf, 0xc2, 0xe3, 0xf6, - 0x3c, 0x69, 0xb6, 0xc4, 0xdc, 0x5d, 0xe9, 0xb6, 0x57, 0xf8, 0x72, 0x62, - 0x77, 0x18, 0x67, 0xf4, 0xba, 0x07, 0x52, 0x9d, 0xd0, 0x4c, 0x51, 0x05, - 0xbf, 0xad, 0x61, 0x8f, 0x53, 0xc3, 0x79, 0x7e, 0x41, 0x75, 0xe1, 0x6e, - 0x32, 0x9b, 0xff, 0x20, 0xd3, 0xe8, 0xaa, 0xea, 0x10, 0x5d, 0xc9, 0xe4, - 0x17, 0x0b, 0x97, 0xdf, 0xfc, 0x18, 0x53, 0x45, 0x33, 0xe9, 0x6b, 0x78, - 0x0d, 0xaa, 0x33, 0x86, 0x2d, 0xb1, 0x87, 0xda, 0x56, 0x5e, 0xd5, 0xac, - 0x58, 0x68, 0xcb, 0x5f, 0xf4, 0x7c, 0xd6, 0xf1, 0xb3, 0x8e, 0x46, 0x09, - 0xe9, 0xb6, 0xe0, 0xd7, 0x9a, 0x9f, 0x88, 0x7e, 0x2f, 0x39, 0x2e, 0xd8, - 0x46, 0x98, 0x1f, 0xe0, 0x61, 0xed, 0x47, 0xd4, 0x08, 0xc5, 0xb7, 0x0f, - 0xad, 0xf9, 0xda, 0x23, 0x7c, 0xa4, 0x26, 0xb5, 0xff, 0x88, 0x19, 0x8a, - 0x06, 0x5e, 0x3c, 0x38, 0xcc, 0xb8, 0x6c, 0x1a, 0x17, 0xe9, 0xea, 0xd7, - 0x07, 0x33, 0xf0, 0x15, 0x0a, 0x8e, 0x63, 0x3d, 0xcf, 0xd9, 0x4e, 0x43, - 0x37, 0x1f, 0x2f, 0x24, 0x1a, 0xd3, 0xa5, 0x85, 0xe1, 0x94, 0x12, 0x59, - 0xf9, 0xdc, 0x1a, 0x37, 0xb7, 0x5a, 0x70, 0x94, 0x2b, 0xd9, 0x16, 0x2c, - 0xac, 0x56, 0x3c, 0x59, 0x91, 0xe3, 0x18, 0xff, 0xed, 0xc0, 0x1b, 0x15, - 0x97, 0x2e, 0xa2, 0x4e, 0xaf, 0xab, 0x39, 0x1e, 0xb2, 0x06, 0xb3, 0xd0, - 0x41, 0xf1, 0x1d, 0x05, 0xda, 0xc1, 0x66, 0x15, 0x61, 0x15, 0x18, 0x00, - 0x73, 0xdf, 0x88, 0x87, 0x64, 0xf0, 0xcd, 0x5b, 0x5d, 0xde, 0x3f, 0x3b, - 0xe3, 0x6e, 0xcd, 0x23, 0xa6, 0xa6, 0x87, 0x42, 0xeb, 0x5a, 0x27, 0x9c, - 0x4e, 0xf5, 0x68, 0x9b, 0xc5, 0xc5, 0xd8, 0xe2, 0x6a, 0x8e, 0xa8, 0xa5, - 0xb2, 0xb9, 0xa0, 0x9e, 0x0a, 0x8b, 0x47, 0xdd, 0x14, 0x65, 0x77, 0x40, - 0x40, 0x17, 0x6e, 0x25, 0xa9, 0xac, 0x8d, 0xe7, 0x42, 0x82, 0x6c, 0x14, - 0xcf, 0x44, 0x15, 0xcf, 0x1a, 0x6d, 0xcf, 0xbe, 0xf9, 0xf2, 0x8d, 0x96, - 0x00, 0x32, 0xb8, 0x65, 0xd7, 0x56, 0x34, 0xaf, 0x26, 0x78, 0xd0, 0x48, - 0xdb, 0x67, 0xb2, 0x70, 0x10, 0x59, 0xf1, 0x20, 0xa2, 0x4a, 0xdc, 0xbc, - 0x96, 0x70, 0x1e, 0xce, 0x10, 0x84, 0xe3, 0x73, 0x3c, 0xe8, 0xed, 0x92, - 0xa0, 0x54, 0x3b, 0x90, 0x8e, 0x0e, 0x40, 0x14, 0xbb, 0x93, 0xcf, 0xdd, - 0xf6, 0xde, 0x58, 0xa1, 0xef, 0x68, 0x2b, 0xe7, 0x45, 0xd2, 0x3c, 0x0d, - 0x55, 0x6c, 0x6c, 0xe5, 0xc6, 0x41, 0xcd, 0xe3, 0xdf, 0xd4, 0x7f, 0x9d, - 0x88, 0x34, 0x82, 0x2e, 0xc1, 0xee, 0x16, 0xa9, 0xb5, 0xf8, 0x08, 0xcb, - 0xb7, 0x7e, 0x64, 0x4f, 0x8d, 0x25, 0x81, 0x73, 0x1e, 0x63, 0x5a, 0x95, - 0xf9, 0x66, 0xfe, 0x02, 0xb1, 0x93, 0x70, 0xb6, 0x87, 0xd5, 0xa7, 0xa8, - 0xdd, 0x4d, 0x6c, 0x04, 0x73, 0xc3, 0xa1, 0x63, 0x70, 0x92, 0xc6, 0xa6, - 0x6d, 0x11, 0xbf, 0xb2, 0x29, 0x4a, 0xbc, 0x64, 0x14, 0xeb, 0xc3, 0xd4, - 0x4b, 0xc9, 0x79, 0xa3, 0x6c, 0x39, 0x02, 0x39, 0x95, 0x54, 0xa7, 0x7a, - 0x4a, 0x38, 0x66, 0xf0, 0xb6, 0x98, 0xef, 0x67, 0x70, 0x0f, 0x75, 0x14, - 0xf1, 0x02, 0x49, 0xbd, 0xf8, 0x0a, 0xad, 0x08, 0xcb, 0xe2, 0x8b, 0x85, - 0x12, 0x11, 0x63, 0x05, 0xd2, 0xdf, 0x46, 0x79, 0xad, 0x32, 0x2d, 0xc2, - 0xe2, 0x8d, 0x84, 0xd6, 0xe0, 0x31, 0xd5, 0x4c, 0x74, 0x2a, 0x66, 0xd6, - 0x6a, 0x39, 0x37, 0xe7, 0x07, 0x0f, 0x1c, 0xb4, 0x4a, 0xf7, 0x6c, 0x7a, - 0xa7, 0x9c, 0x57, 0x2a, 0x5f, 0x1b, 0x75, 0xd7, 0x71, 0x22, 0xed, 0xa6, - 0x8b, 0x53, 0x25, 0x95, 0x64, 0x3f, 0x8d, 0xd0, 0xce, 0xc2, 0xd1, 0xa4, - 0xe4, 0xb3, 0xe9, 0x2e, 0xee, 0x5f, 0x04, 0x47, 0x8a, 0x6c, 0x6b, 0x36, - 0x6c, 0x1d, 0x29, 0x14, 0xaa, 0x16, 0x49, 0x4c, 0x3d, 0x50, 0x4e, 0xc1, - 0x1f, 0x81, 0xe7, 0x3c, 0x16, 0x77, 0x8e, 0x31, 0x10, 0x59, 0x82, 0x2c, - 0xb7, 0x5b, 0x98, 0x51, 0x17, 0x96, 0xa7, 0x32, 0x88, 0xf0, 0xa4, 0xc4, - 0xbb, 0x68, 0x97, 0x42, 0xb9, 0xdf, 0x31, 0xa7, 0xf9, 0xad, 0x6e, 0x74, - 0x65, 0xad, 0x8b, 0xf2, 0x76, 0xb8, 0x03, 0xf1, 0x63, 0x52, 0xc6, 0x1d, - 0xc1, 0x4f, 0x29, 0x94, 0x77, 0x92, 0x97, 0x32, 0x6f, 0x3a, 0x2a, 0x80, - 0xae, 0xf9, 0xf3, 0x22, 0x3f, 0x3f, 0x3f, 0xbf, 0x51, 0x6d, 0x6f, 0x0e, - 0xc3, 0xce, 0x92, 0xa5, 0x37, 0xf5, 0x63, 0xcf, 0x95, 0xe0, 0xe3, 0xf3, - 0x7a, 0x60, 0xe5, 0x4f, 0x4b, 0xe1, 0xf3, 0x5a, 0xb8, 0xc6, 0xe9, 0xd6, - 0x11, 0x33, 0xbc, 0x72, 0x7e, 0x46, 0x28, 0xa7, 0xb4, 0x4c, 0xa3, 0x33, - 0x2e, 0x37, 0x4f, 0xe5, 0xac, 0x5c, 0x4a, 0xa7, 0x21, 0xbb, 0xa5, 0x73, - 0x2e, 0xc1, 0x19, 0x94, 0x7f, 0x16, 0xca, 0xa8, 0x73, 0x83, 0xbb, 0xc7, - 0xc1, 0x2d, 0xe3, 0xe2, 0xe6, 0xed, 0x0e, 0x0f, 0xff, 0x1f, 0x90, 0xe5, - 0x1d, 0xd7, 0x81, 0x8f, 0xc3, 0xe8, 0xdd, 0xfd, 0x31, 0x57, 0x37, 0x74, - 0xcf, 0x4d, 0x35, 0x85, 0x91, 0xbc, 0xbd, 0xed, 0x5c, 0x48, 0x9c, 0x54, - 0xd4, 0xc3, 0x58, 0xb5, 0xf5, 0xea, 0x24, 0x89, 0x1e, 0xbb, 0x70, 0x21, - 0x84, 0x61, 0x83, 0xea, 0xa2, 0x74, 0x0c, 0xc1, 0x8f, 0x50, 0x5f, 0xd7, - 0x9d, 0x7a, 0x0d, 0x0f, 0x7c, 0x08, 0xc1, 0x0e, 0x96, 0x09, 0xf4, 0x6e, - 0x4b, 0xf8, 0x2e, 0x93, 0xbd, 0x7b, 0x6d, 0x0f, 0x8e, 0xed, 0xdc, 0x22, - 0xd7, 0x7b, 0x7e, 0x20, 0xcc, 0x62, 0x8e, 0xa9, 0x46, 0x89, 0xeb, 0xdd, - 0xba, 0xac, 0xbc, 0x81, 0x1e, 0xa2, 0x91, 0xe0, 0x1c, 0xaa, 0x67, 0x34, - 0x73, 0x5b, 0x78, 0x25, 0x5d, 0xa0, 0x23, 0x53, 0xcb, 0x59, 0x54, 0xe8, - 0xb2, 0x6f, 0x30, 0x4f, 0xc2, 0xaf, 0x2d, 0x0e, 0x77, 0xad, 0x53, 0x42, - 0x9e, 0x59, 0x08, 0x21, 0x84, 0x44, 0x74, 0xad, 0x6a, 0x52, 0x87, 0xaf, - 0x18, 0xd3, 0xd4, 0x25, 0x5e, 0xb8, 0xda, 0xb3, 0x36, 0x6e, 0xb3, 0x5a, - 0xe5, 0x7b, 0xe7, 0xf1, 0x9d, 0xc0, 0x8a, 0xca, 0x7f, 0xb5, 0x16, 0x5e, - 0xb4, 0x4e, 0xae, 0xf3, 0xf6, 0x24, 0x03, 0xeb, 0xe8, 0xd8, 0x69, 0x95, - 0x5c, 0xc9, 0xbf, 0x7e, 0xdd, 0xbe, 0x5c, 0x5d, 0xfa, 0xc4, 0xbf, 0x04, - 0x67, 0x12, 0x4f, 0x32, 0x99, 0x24, 0x1c, 0x91, 0x39, 0x0a, 0x83, 0x0e, - 0x8f, 0xd2, 0x87, 0x1e, 0x26, 0xf7, 0x43, 0x71, 0xcb, 0xe7, 0x0d, 0xeb, - 0x5c, 0x73, 0x8c, 0xdc, 0x68, 0x8c, 0xae, 0xea, 0x37, 0x0c, 0xb1, 0x88, - 0x87, 0xe5, 0x80, 0x96, 0xc4, 0xe6, 0x8e, 0xac, 0xea, 0x90, 0x7e, 0xc8, - 0x31, 0xc9, 0xab, 0x22, 0x17, 0xc6, 0x8a, 0xe7, 0x4e, 0x19, 0x11, 0xc9, - 0x06, 0xfa, 0x84, 0xc2, 0x2c, 0xbc, 0x47, 0x8c, 0xde, 0x44, 0x98, 0x6a, - 0x48, 0xdb, 0x31, 0x01, 0x81, 0x89, 0xb1, 0xc8, 0xc6, 0xd8, 0x61, 0x90, - 0x52, 0xfd, 0x89, 0x8d, 0xfd, 0x48, 0xa2, 0x6e, 0x39, 0xab, 0x89, 0x26, - 0x26, 0x12, 0x50, 0x2a, 0x61, 0xcb, 0x22, 0xf3, 0x88, 0xc7, 0xdc, 0x29, - 0x70, 0x83, 0x03, 0xf7, 0xf4, 0xe0, 0x60, 0x21, 0xfb, 0x11, 0xfa, 0xac, - 0xd1, 0x65, 0x6d, 0x06, 0x87, 0x08, 0x64, 0xaf, 0xa6, 0x82, 0x40, 0xa1, - 0x89, 0xc1, 0xbc, 0xca, 0x51, 0x06, 0x65, 0x48, 0xc3, 0x42, 0x71, 0x4b, - 0xbe, 0x78, 0xb5, 0x28, 0xe4, 0x17, 0x9b, 0x89, 0x05, 0x42, 0x0b, 0x3e, - 0xa5, 0x88, 0x1e, 0x1d, 0x26, 0x61, 0x01, 0x13, 0x2f, 0x92, 0x97, 0x58, - 0x4a, 0xf2, 0xe4, 0xc8, 0x07, 0x44, 0xde, 0x34, 0x3d, 0x8e, 0xc7, 0x28, - 0x4e, 0x20, 0x24, 0x42, 0xc1, 0xc4, 0x2f, 0xc8, 0x80, 0x42, 0x06, 0x93, - 0x4e, 0x3b, 0x36, 0x17, 0xc3, 0x1f, 0x5a, 0x83, 0xa7, 0x3f, 0x96, 0xaa, - 0x2a, 0x91, 0xa1, 0x2b, 0x9e, 0x2c, 0x0d, 0x66, 0xa8, 0x3c, 0x1a, 0xaa, - 0x77, 0x01, 0x49, 0x55, 0x2a, 0x1d, 0x4b, 0xc7, 0x2e, 0x0f, 0x0d, 0x9d, - 0x22, 0x9a, 0x17, 0x43, 0x0a, 0x39, 0xd1, 0xb0, 0x40, 0x33, 0x79, 0xac, - 0x15, 0x46, 0x3a, 0x47, 0x02, 0x1c, 0x6b, 0x1a, 0x49, 0x70, 0xa3, 0x91, - 0xcb, 0xcc, 0x50, 0x3e, 0x4b, 0x52, 0xd6, 0xa1, 0x78, 0x52, 0xdb, 0x61, - 0xfa, 0x3c, 0xce, 0x51, 0x9d, 0x26, 0xc3, 0x3e, 0x38, 0x43, 0x48, 0x63, - 0x5b, 0x90, 0xea, 0x38, 0x51, 0x00, 0x62, 0xdf, 0x33, 0x50, 0xc1, 0xd1, - 0x60, 0x98, 0xc2, 0x12, 0xac, 0x39, 0x67, 0xb5, 0x66, 0x17, 0x8d, 0xe5, - 0x9c, 0xcd, 0x79, 0xac, 0x62, 0x4d, 0x94, 0xe5, 0x80, 0xda, 0x9b, 0x2e, - 0x11, 0x9a, 0x43, 0x1d, 0xc0, 0x29, 0xb8, 0x0f, 0x8c, 0x76, 0xb0, 0x9c, - 0x91, 0x9b, 0x32, 0x5b, 0x51, 0x4a, 0x6f, 0x95, 0x95, 0x47, 0x8a, 0x89, - 0x60, 0xc8, 0x26, 0xb9, 0xe4, 0xd0, 0x37, 0x57, 0xea, 0xa2, 0x60, 0x02, - 0x70, 0xce, 0x85, 0x02, 0x9c, 0x80, 0x35, 0x58, 0x66, 0x55, 0x51, 0x46, - 0x68, 0xcd, 0x37, 0x18, 0xc3, 0x3f, 0x43, 0x7a, 0x07, 0xe2, 0x3a, 0x46, - 0x6c, 0xbe, 0x81, 0x72, 0xc4, 0x50, 0x97, 0x6b, 0x8c, 0x25, 0x9c, 0x1c, - 0xd8, 0x5d, 0x0e, 0x8c, 0x02, 0x87, 0x59, 0x60, 0x1f, 0x25, 0xac, 0x4e, - 0x5c, 0xc5, 0x9c, 0x10, 0xdc, 0x7a, 0xc2, 0x6d, 0x58, 0x6a, 0x1e, 0x97, - 0xa1, 0xb6, 0x95, 0x85, 0x07, 0xce, 0x4d, 0xec, 0x02, 0xb2, 0x8e, 0x0f, - 0x37, 0xab, 0x12, 0x07, 0xe1, 0x90, 0x82, 0xa3, 0xbc, 0x8f, 0xa5, 0x70, - 0xf5, 0xc8, 0xfe, 0xcc, 0x58, 0x6a, 0x60, 0x77, 0xab, 0x2e, 0xb3, 0x04, - 0xd0, 0xf2, 0x30, 0x04, 0x0c, 0x21, 0x98, 0x84, 0x54, 0xfc, 0x92, 0xb2, - 0xa8, 0xf8, 0x7f, 0xc9, 0x3b, 0x88, 0xd7, 0x34, 0x4b, 0x6e, 0x4b, 0x5c, - 0x59, 0xb4, 0x5c, 0x29, 0x24, 0x49, 0xd7, 0xf9, 0x35, 0x40, 0x09, 0x52, - 0x3d, 0xb0, 0x3e, 0x32, 0x46, 0x85, 0xc6, 0x80, 0xd0, 0x4a, 0x94, 0xb3, - 0x9b, 0x4f, 0xa3, 0x9a, 0x27, 0x01, 0x20, 0xf5, 0x5d, 0x09, 0x76, 0xda, - 0x8e, 0x56, 0x99, 0x78, 0xc6, 0x0f, 0x94, 0x3f, 0x73, 0x85, 0x61, 0x37, - 0x4f, 0x84, 0x0c, 0x48, 0xba, 0xae, 0x2b, 0xa9, 0x90, 0x49, 0x32, 0x17, - 0xd5, 0x09, 0x93, 0xa6, 0x53, 0xe0, 0x02, 0xde, 0x69, 0x81, 0xdf, 0x33, - 0xd4, 0x4b, 0x2d, 0xec, 0x1d, 0xb8, 0xae, 0x92, 0x70, 0xe4, 0xa4, 0xc5, - 0xfb, 0x12, 0xce, 0xe4, 0x11, 0x6a, 0x1f, 0x31, 0x5d, 0xb2, 0x21, 0x54, - 0xfe, 0x28, 0xa9, 0x33, 0x7e, 0xc1, 0x89, 0x95, 0xb3, 0x20, 0x0c, 0xa8, - 0xb6, 0x6c, 0xb9, 0x19, 0x48, 0xeb, 0x88, 0xbf, 0xf6, 0x45, 0x9b, 0xc1, - 0x6c, 0xc6, 0xb5, 0x25, 0x4a, 0xec, 0x54, 0x3e, 0x29, 0xb5, 0x2d, 0xe9, - 0x5d, 0xd8, 0x7c, 0x4d, 0x99, 0x58, 0x4a, 0xe3, 0x35, 0xf4, 0xba, 0xb6, - 0xab, 0x5c, 0x7d, 0xce, 0x70, 0x43, 0x96, 0x9e, 0xee, 0x39, 0x9a, 0x21, - 0x52, 0xd8, 0x4c, 0x28, 0xdd, 0x28, 0x89, 0x99, 0xe9, 0x45, 0xf6, 0xfc, - 0x66, 0xec, 0x2a, 0xb6, 0xb3, 0x97, 0xe9, 0x28, 0x63, 0x38, 0x73, 0x42, - 0xd2, 0xb3, 0xa1, 0xf5, 0x54, 0xac, 0x71, 0x53, 0xb5, 0x39, 0x53, 0xda, - 0xa3, 0xf7, 0xda, 0x7b, 0xfe, 0x21, 0x9c, 0x76, 0x87, 0x77, 0x12, 0xe4, - 0xb8, 0x98, 0x0e, 0xed, 0x78, 0x70, 0x68, 0x50, 0x6b, 0x32, 0x69, 0x55, - 0x5e, 0x7a, 0x8b, 0xd2, 0xbe, 0x3c, 0x39, 0x69, 0xaa, 0xdc, 0xb1, 0xb6, - 0x43, 0x6a, 0x74, 0xb4, 0x69, 0x50, 0x1d, 0xb8, 0x7a, 0xb9, 0x12, 0x8e, - 0xd4, 0x21, 0x49, 0x35, 0xd0, 0x35, 0x0f, 0xab, 0x66, 0x6f, 0xb9, 0xd0, - 0xbe, 0x96, 0xa1, 0x71, 0xd4, 0x75, 0x20, 0x99, 0x25, 0x6a, 0x8b, 0xd8, - 0x0b, 0xfa, 0x8a, 0xad, 0x28, 0xc6, 0xd7, 0x51, 0x29, 0x59, 0x46, 0xd9, - 0x63, 0xcd, 0xcc, 0x95, 0xe4, 0x39, 0x84, 0x78, 0x91, 0xf2, 0x9c, 0xae, - 0x09, 0xbb, 0xb1, 0xad, 0x8a, 0x34, 0xd3, 0x1f, 0xeb, 0x60, 0x0f, 0x8b, - 0x38, 0x4a, 0xd3, 0x92, 0x4a, 0xa2, 0xf3, 0xf2, 0x0b, 0x3c, 0x69, 0x94, - 0xe1, 0x49, 0xd4, 0x1c, 0x76, 0x98, 0x68, 0x9c, 0x21, 0x17, 0x7d, 0xac, - 0x63, 0xa4, 0xdc, 0x50, 0xc4, 0x33, 0xaa, 0x77, 0x5e, 0xce, 0x51, 0x1b, - 0x25, 0xa7, 0xb1, 0x1b, 0xd9, 0x8a, 0x14, 0xbf, 0x78, 0x59, 0xa4, 0xb6, - 0x38, 0x66, 0x4a, 0x74, 0xcb, 0x90, 0x8f, 0x1c, 0x17, 0x10, 0x2f, 0xda, - 0xe9, 0x4f, 0xf8, 0xe6, 0xf6, 0x28, 0x95, 0xe8, 0xf9, 0x28, 0x28, 0x83, - 0x42, 0xb3, 0x61, 0xe6, 0x9d, 0x18, 0x97, 0xf3, 0x75, 0x7b, 0xf2, 0x97, - 0xa1, 0x72, 0x8f, 0x0e, 0x18, 0x96, 0x30, 0xce, 0x74, 0x3e, 0xef, 0x2d, - 0xb8, 0x9f, 0xfb, 0xe2, 0x52, 0xca, 0x02, 0x86, 0x9e, 0x60, 0xa1, 0xda, - 0x6c, 0x39, 0xd6, 0x05, 0x33, 0xfd, 0x96, 0x5b, 0x18, 0x7f, 0xc9, 0x10, - 0x4f, 0x5a, 0x21, 0xc3, 0x3e, 0x20, 0x28, 0x4b, 0x11, 0x5c, 0x59, 0x34, - 0xc9, 0x23, 0x59, 0xf6, 0xe2, 0x30, 0x3a, 0x8d, 0x96, 0x69, 0xcf, 0xdb, - 0x93, 0x01, 0x8a, 0xc3, 0xaa, 0xd1, 0xd3, 0xf7, 0x19, 0xd6, 0x24, 0x8e, - 0xe4, 0x96, 0xc9, 0x1f, 0x6c, 0x3b, 0x40, 0x21, 0x36, 0xe5, 0xf8, 0x71, - 0xaa, 0xb1, 0x16, 0x62, 0x36, 0xca, 0xcc, 0xd1, 0x0d, 0x4a, 0x63, 0x91, - 0x7c, 0x36, 0x5f, 0x29, 0x49, 0x23, 0x4f, 0x1f, 0xb7, 0x82, 0xef, 0x4b, - 0xb5, 0x38, 0x26, 0x55, 0x44, 0xf4, 0x08, 0x95, 0x94, 0xca, 0xf9, 0xd6, - 0x71, 0x63, 0x66, 0xae, 0x29, 0xdf, 0xa4, 0x8f, 0x83, 0xdf, 0x72, 0x25, - 0xb3, 0x48, 0x87, 0x07, 0x25, 0x90, 0x82, 0x0b, 0xc1, 0x2e, 0xa9, 0x4b, - 0xd2, 0xd8, 0x14, 0xcf, 0x3e, 0xe6, 0x89, 0xf4, 0xc0, 0x8a, 0x92, 0xff, - 0xf5, 0xfc, 0x9f, 0x62, 0x64, 0xa1, 0x72, 0xea, 0xd4, 0xd6, 0xe2, 0x64, - 0x9f, 0x51, 0x9e, 0xc3, 0x91, 0xc8, 0xc8, 0xe7, 0x30, 0x88, 0x0c, 0x43, - 0x9a, 0x60, 0x64, 0xfb, 0xea, 0xc0, 0xd8, 0x9b, 0xd7, 0xd2, 0x66, 0x37, - 0x2a, 0x13, 0x8e, 0xe5, 0xe4, 0x1e, 0x8e, 0x6d, 0x8e, 0x35, 0x2e, 0xe7, - 0x75, 0x95, 0xc0, 0xfc, 0x83, 0x19, 0xfd, 0x62, 0x8b, 0xfc, 0xf1, 0x24, - 0x75, 0xc3, 0xf0, 0x93, 0xe3, 0x3e, 0xb1, 0xca, 0xa2, 0xdc, 0xf0, 0x93, - 0xaf, 0xeb, 0xbe, 0x1f, 0x4e, 0x83, 0xb1, 0xbc, 0x45, 0xc5, 0x3e, 0x16, - 0x6c, 0x18, 0x89, 0x6a, 0x33, 0x96, 0xb7, 0x13, 0x11, 0x4a, 0xc2, 0xb3, - 0xfe, 0x5e, 0xc4, 0xa2, 0x2b, 0xa9, 0x21, 0x07, 0xbd, 0x18, 0x35, 0x73, - 0xfa, 0xa2, 0x3f, 0x51, 0x72, 0x07, 0x45, 0x0e, 0xb5, 0xf6, 0x52, 0x06, - 0xed, 0xee, 0x27, 0xa2, 0xa7, 0x47, 0x75, 0xbe, 0xfc, 0xce, 0xa3, 0x18, - 0x6b, 0x9d, 0x28, 0x3b, 0x4e, 0x85, 0x03, 0xe8, 0x23, 0x45, 0x45, 0xb4, - 0x61, 0x3f, 0xbc, 0x56, 0x19, 0x01, 0x1d, 0xf8, 0x14, 0x19, 0x4d, 0x4d, - 0x27, 0xcc, 0x4b, 0x38, 0x9d, 0x98, 0xd2, 0x08, 0x86, 0xbd, 0x8a, 0x1a, - 0x54, 0xd1, 0x61, 0x48, 0x1f, 0x70, 0xa3, 0x51, 0x98, 0xa8, 0x4d, 0x83, - 0xce, 0x34, 0x52, 0x98, 0x4e, 0xb4, 0x25, 0x3a, 0x2d, 0x8b, 0xaa, 0x84, - 0xbe, 0x87, 0x41, 0x65, 0xc2, 0x28, 0xca, 0xd2, 0x18, 0x2f, 0x20, 0x6d, - 0xcb, 0x01, 0x0e, 0xdc, 0x4c, 0x3c, 0xb5, 0x23, 0x1d, 0x69, 0xae, 0x20, - 0x6d, 0x71, 0x01, 0xd5, 0x09, 0x5f, 0xa1, 0xf7, 0x9c, 0x68, 0x35, 0xa7, - 0xab, 0x8c, 0xdf, 0xd3, 0xf0, 0x8c, 0xd6, 0xc1, 0xf1, 0xe3, 0xe7, 0x47, - 0xba, 0x48, 0x55, 0x3f, 0x4e, 0x74, 0x8f, 0x86, 0x62, 0x31, 0xd2, 0x2a, - 0x86, 0x59, 0x1c, 0x14, 0x88, 0xd3, 0xa5, 0xcc, 0x7b, 0x90, 0x5f, 0x29, - 0x56, 0xfa, 0x81, 0xed, 0xe9, 0xea, 0x1e, 0x2b, 0x0c, 0x0b, 0xda, 0x42, - 0x59, 0xea, 0x27, 0xcf, 0x4a, 0x1a, 0xc2, 0x89, 0x6e, 0x20, 0x2a, 0x06, - 0x2d, 0xad, 0x40, 0x52, 0x09, 0x66, 0xfa, 0xc0, 0xa9, 0x26, 0x30, 0x9c, - 0xc4, 0x73, 0x05, 0x60, 0xf9, 0xf4, 0x9f, 0xf5, 0xa7, 0x9e, 0xfb, 0xd2, - 0xb6, 0x13, 0xba, 0x3e, 0x3a, 0xbc, 0x79, 0xf7, 0x9d, 0x9c, 0xd9, 0x8d, - 0x03, 0x7b, 0x38, 0xaa, 0xa5, 0x73, 0x5a, 0x3e, 0xa4, 0x47, 0xc7, 0xf3, - 0xf8, 0x6c, 0x2e, 0xae, 0x0b, 0x51, 0x68, 0xcf, 0x30, 0x64, 0x73, 0x9f, - 0xb1, 0x60, 0xda, 0x61, 0x52, 0x35, 0x32, 0xe4, 0x1c, 0x17, 0x1b, 0x38, - 0x4f, 0xf7, 0xb9, 0xca, 0xf8, 0x73, 0x00, 0x3e, 0x09, 0xc5, 0xd7, 0x55, - 0x30, 0xf5, 0x7c, 0xc6, 0x66, 0x1f, 0xad, 0x07, 0xcb, 0xcf, 0x79, 0xb3, - 0x4f, 0xde, 0xf2, 0x0a, 0x1e, 0x60, 0x36, 0xdd, 0xfb, 0x37, 0xfc, 0x2c, - 0x4e, 0xe7, 0x3a, 0x8c, 0x01, 0xec, 0x41, 0x3c, 0x0c, 0x6c, 0x99, 0xb6, - 0x2d, 0xa1, 0x83, 0x56, 0xad, 0x45, 0x33, 0x59, 0x93, 0x22, 0x94, 0x2f, - 0xab, 0x8a, 0xd7, 0xae, 0x3b, 0xdb, 0x2d, 0xa9, 0x33, 0x76, 0x70, 0x72, - 0xb5, 0x2a, 0xf0, 0xa0, 0x5d, 0xe5, 0x7f, 0x57, 0xd5, 0x63, 0xa7, 0x7c, - 0x11, 0x59, 0x51, 0xdd, 0x90, 0xba, 0xba, 0xaa, 0x1b, 0x4b, 0x98, 0xa0, - 0x5b, 0xd5, 0xb4, 0x88, 0x2e, 0x8a, 0x7e, 0x43, 0x3a, 0xec, 0xaa, 0x9a, - 0xd6, 0xf0, 0x67, 0x00, 0x65, 0xab, 0x3f, 0x4e, 0xaa, 0xbb, 0x73, 0xdf, - 0xdb, 0xc2, 0xcd, 0xa1, 0x5c, 0xaf, 0x67, 0x97, 0x07, 0x32, 0x06, 0x70, - 0xa1, 0xe1, 0x6a, 0xb0, 0xbd, 0xdd, 0xad, 0xc2, 0xb6, 0xaf, 0x02, 0xb6, - 0x4b, 0xa6, 0x73, 0xda, 0x77, 0xf3, 0x5b, 0xcf, 0xd5, 0x16, 0xff, 0x9f, - 0x25, 0x8b, 0x7f, 0x8b, 0x47, 0x6f, 0x5a, 0xc9, 0x2c, 0x93, 0x6a, 0x68, - 0xdd, 0xdc, 0x4c, 0xe8, 0x92, 0x9a, 0x05, 0x65, 0x9a, 0xd8, 0x7c, 0xfe, - 0x73, 0x4b, 0xbb, 0x76, 0xcf, 0xf7, 0xb0, 0x9f, 0x81, 0x25, 0xcf, 0x3f, - 0x27, 0x93, 0xba, 0x70, 0x95, 0xcb, 0x29, 0x34, 0x0a, 0xf9, 0x43, 0x58, - 0xe3, 0x5d, 0xae, 0x10, 0xe4, 0xb9, 0xe3, 0xea, 0x84, 0xf4, 0x81, 0x98, - 0xf4, 0x0d, 0x12, 0xc5, 0x06, 0xe2, 0x7d, 0x40, 0xe5, 0xa0, 0x33, 0x44, - 0xce, 0xe3, 0xef, 0x8c, 0xf9, 0x21, 0x20, 0x8b, 0xde, 0x87, 0x96, 0xbf, - 0x35, 0x89, 0x95, 0x3d, 0x68, 0xe8, 0xc5, 0x63, 0x2e, 0x03, 0x8b, 0x62, - 0x97, 0xfc, 0x5a, 0x87, 0xf2, 0x2d, 0x03, 0x26, 0x67, 0x04, 0x0c, 0x7e, - 0x35, 0x01, 0x83, 0x17, 0x40, 0x42, 0xa1, 0xa1, 0xd7, 0x4c, 0x11, 0x9d, - 0x8f, 0x8a, 0x90, 0xe0, 0xe1, 0xb6, 0x77, 0x8b, 0xdb, 0x85, 0x51, 0x1f, - 0x70, 0x58, 0xa7, 0x91, 0xd9, 0x1d, 0x52, 0x86, 0xa7, 0x6a, 0xa4, 0x3a, - 0xd3, 0x06, 0xf8, 0x87, 0x70, 0xdf, 0x67, 0xc5, 0x4b, 0x72, 0x14, 0xdd, - 0x90, 0xc3, 0x2c, 0xa0, 0x5a, 0x6f, 0x38, 0x3d, 0x55, 0xbe, 0x74, 0xc4, - 0x7a, 0xf9, 0x70, 0x98, 0xe0, 0x14, 0xf5, 0x64, 0x4e, 0x7f, 0xe1, 0x29, - 0x39, 0x87, 0x41, 0xcf, 0xe1, 0x0d, 0xe1, 0x3a, 0x23, 0xca, 0x0f, 0x7c, - 0xa4, 0x58, 0xeb, 0x5f, 0xb0, 0xfb, 0x1f, 0x6e, 0x5f, 0x78, 0x9f, 0x44, - 0x65, 0x24, 0xdf, 0xae, 0xd1, 0xc4, 0x80, 0xce, 0x04, 0x36, 0x1a, 0x03, - 0x43, 0x56, 0x6f, 0x51, 0x85, 0x68, 0xb3, 0x30, 0x89, 0x56, 0x49, 0x7a, - 0x49, 0xe9, 0xdd, 0x52, 0xb9, 0x2b, 0xb3, 0x1b, 0x0c, 0xd3, 0x50, 0x12, - 0x54, 0x01, 0xee, 0x0f, 0xdc, 0x32, 0xe5, 0x2c, 0xe7, 0x9f, 0xd3, 0xcd, - 0xe0, 0x56, 0xc2, 0x47, 0xfb, 0xa8, 0x3a, 0xfa, 0x16, 0x80, 0x79, 0x70, - 0xeb, 0x48, 0x68, 0x13, 0x59, 0xe0, 0x1b, 0x58, 0x67, 0xe2, 0x7d, 0x74, - 0xe2, 0xe4, 0x5a, 0xa0, 0x08, 0xde, 0x76, 0xf2, 0xde, 0xc7, 0x19, 0x4e, - 0xc9, 0x34, 0x81, 0xb7, 0xf9, 0x37, 0x89, 0xc2, 0x03, 0x07, 0x08, 0x76, - 0xc2, 0x2e, 0xc5, 0x6b, 0xd2, 0x8e, 0xb7, 0x75, 0x7a, 0xdc, 0x4f, 0x32, - 0x62, 0x5c, 0xb7, 0xee, 0x26, 0x0b, 0x65, 0x86, 0x67, 0x91, 0x3b, 0xc6, - 0xcb, 0x4f, 0xcd, 0xae, 0x06, 0x8b, 0xbc, 0x33, 0x77, 0x7e, 0x1d, 0xc8, - 0xb3, 0x92, 0xac, 0x52, 0x64, 0xc7, 0x49, 0x36, 0xef, 0xb0, 0xf6, 0xc2, - 0xcd, 0xcf, 0x29, 0x35, 0x47, 0xb9, 0x5d, 0xba, 0x70, 0xaf, 0x16, 0x8a, - 0xef, 0x44, 0xa1, 0x58, 0x03, 0xaf, 0x00, 0x4b, 0xd3, 0x58, 0x63, 0xd3, - 0x1a, 0xe7, 0x54, 0xdb, 0x37, 0x84, 0x1c, 0x53, 0x03, 0x63, 0xa8, 0xa6, - 0x14, 0xb4, 0x07, 0x13, 0x98, 0x4c, 0x8e, 0x70, 0x02, 0x28, 0xfe, 0x88, - 0xae, 0x0e, 0xd9, 0x7e, 0x63, 0x09, 0xe0, 0xe6, 0x58, 0x2a, 0x07, 0xb6, - 0x4c, 0x0a, 0x98, 0x06, 0xeb, 0x10, 0x62, 0x11, 0x0c, 0x5b, 0x14, 0x91, - 0xcf, 0x2e, 0xb0, 0x41, 0x84, 0x51, 0x0a, 0xc5, 0xce, 0x97, 0xd0, 0x34, - 0x42, 0xa6, 0xb6, 0x18, 0xc0, 0x67, 0xdd, 0x94, 0x7b, 0x85, 0xdc, 0xe5, - 0xe4, 0x8d, 0x66, 0x34, 0x00, 0x87, 0xe2, 0xa2, 0x24, 0x94, 0x0a, 0x23, - 0x29, 0x4a, 0x8c, 0xb6, 0x27, 0x8d, 0xae, 0x58, 0xb7, 0x15, 0x01, 0x4a, - 0xc0, 0x42, 0xe4, 0x2a, 0x4e, 0x01, 0x87, 0x81, 0xbc, 0xdf, 0x60, 0x50, - 0xc9, 0x3f, 0x62, 0x6a, 0x26, 0x5f, 0xbc, 0xf5, 0x05, 0xb9, 0xe0, 0xd8, - 0x3c, 0x65, 0xd1, 0xae, 0xc1, 0xfc, 0x5c, 0x6c, 0x09, 0x8b, 0x0b, 0x0c, - 0xfe, 0x4a, 0x89, 0x79, 0xab, 0x17, 0x12, 0x57, 0x9f, 0x7f, 0xef, 0xd4, - 0x24, 0xec, 0x4e, 0xdd, 0x9c, 0x65, 0x2b, 0x7c, 0x22, 0xd9, 0x68, 0x53, - 0xab, 0x97, 0x96, 0x28, 0xcb, 0x66, 0xbd, 0x84, 0xd5, 0xbf, 0x33, 0xce, - 0x12, 0x0a, 0x1f, 0xaf, 0xed, 0xaa, 0xcf, 0x47, 0x91, 0xee, 0xb6, 0xf9, - 0x3f, 0xf9, 0x9f, 0xc5, 0x7b, 0x54, 0x83, 0x60, 0xb4, 0x41, 0x19, 0x8e, - 0x5b, 0x6a, 0x4c, 0xed, 0x69, 0x24, 0x65, 0x6d, 0x6e, 0xe0, 0x32, 0x8f, - 0x84, 0x69, 0xbc, 0x84, 0x80, 0xcb, 0x6b, 0x28, 0x89, 0xe3, 0xdb, 0x94, - 0x96, 0x1e, 0x17, 0x39, 0xee, 0xd5, 0xba, 0xe8, 0xd9, 0x87, 0x82, 0xa6, - 0xc6, 0xe4, 0x30, 0x99, 0x45, 0x73, 0x91, 0xeb, 0x20, 0xb5, 0x07, 0x13, - 0x2a, 0x93, 0x4b, 0x0d, 0xd0, 0x02, 0x87, 0x94, 0x19, 0xc4, 0x70, 0x3c, - 0xf2, 0x9e, 0xc7, 0x8f, 0x85, 0x91, 0x01, 0xaf, 0x79, 0xeb, 0xf4, 0xbd, - 0x56, 0xb0, 0x3c, 0xaa, 0x43, 0x9a, 0x6a, 0x43, 0x13, 0xd0, 0x0d, 0x81, - 0xd9, 0x48, 0x0e, 0x7c, 0x40, 0xf4, 0x4c, 0x38, 0x72, 0x22, 0x33, 0x85, - 0x86, 0x61, 0xcb, 0xc9, 0xcb, 0x7c, 0x21, 0xd9, 0xa9, 0x1e, 0x85, 0x52, - 0x44, 0xd7, 0xbc, 0x6a, 0x60, 0xbb, 0xb5, 0x91, 0xd3, 0xa4, 0x61, 0x62, - 0x91, 0x54, 0x72, 0xb9, 0x15, 0xab, 0xfd, 0xd0, 0x8e, 0x19, 0xb2, 0xdd, - 0x5b, 0x37, 0x26, 0xbe, 0x40, 0x5c, 0x98, 0x2a, 0x3e, 0x9d, 0x71, 0x2b, - 0x8e, 0xd0, 0x60, 0x25, 0xbd, 0x1a, 0x3a, 0x59, 0x2c, 0xa7, 0x64, 0x2b, - 0x30, 0x30, 0x83, 0xb2, 0x39, 0x4c, 0xcb, 0x6a, 0xe2, 0xee, 0x20, 0x2a, - 0x21, 0xc3, 0x0c, 0x19, 0xc6, 0x71, 0x28, 0x9c, 0x61, 0xe0, 0xd7, 0xde, - 0x0d, 0x4e, 0xa1, 0xa1, 0xb0, 0xb1, 0x2c, 0xd6, 0x11, 0xe2, 0xc5, 0x22, - 0x91, 0xd3, 0xbf, 0xa5, 0xe9, 0x5b, 0xf1, 0x2f, 0xc8, 0xd4, 0x70, 0x92, - 0x02, 0xaf, 0x50, 0x60, 0xe8, 0x9d, 0x18, 0xaa, 0xda, 0xe9, 0x06, 0xbc, - 0x58, 0x5a, 0x11, 0x14, 0x8a, 0x09, 0x31, 0xc3, 0xa6, 0xbd, 0x30, 0x36, - 0x46, 0x56, 0x45, 0x5b, 0x3c, 0x0a, 0x45, 0xf7, 0xf5, 0x5c, 0xab, 0x11, - 0x23, 0x6a, 0x45, 0xc0, 0xbe, 0x9f, 0x1d, 0xb0, 0x5d, 0x0c, 0x6c, 0x1b, - 0x43, 0x33, 0x24, 0x64, 0x32, 0x39, 0x20, 0x4a, 0xb5, 0x58, 0x23, 0x31, - 0x1b, 0x0c, 0xeb, 0xe0, 0x76, 0x7c, 0xb7, 0x01, 0x2c, 0x47, 0x81, 0x6a, - 0xd8, 0x8f, 0xd5, 0xb5, 0x37, 0xff, 0xd1, 0x97, 0x6c, 0x1b, 0x5e, 0xec, - 0xa8, 0x18, 0x05, 0xe0, 0x77, 0x62, 0x08, 0x52, 0x64, 0xb8, 0x57, 0x39, - 0x40, 0xc1, 0xcb, 0xd0, 0x1e, 0x02, 0x2b, 0xc5, 0xd8, 0xcd, 0x87, 0x00, - 0xde, 0x3b, 0x10, 0x9b, 0x4c, 0x6a, 0x47, 0x01, 0x07, 0x99, 0xa6, 0x67, - 0xde, 0xc7, 0x55, 0x10, 0xea, 0x71, 0x1d, 0xac, 0x51, 0xbf, 0xcf, 0x07, - 0xc9, 0x95, 0x94, 0x67, 0x4b, 0x96, 0xf2, 0x0e, 0xe4, 0x49, 0xef, 0xdc, - 0xf8, 0x00, 0xc1, 0xef, 0x4e, 0xd5, 0x71, 0x27, 0x17, 0x6c, 0x95, 0xda, - 0x4d, 0xb2, 0xda, 0xcd, 0x1f, 0x5e, 0xdf, 0x3f, 0xc5, 0x80, 0x01, 0xda, - 0xa6, 0xcd, 0x34, 0x7c, 0xf3, 0x26, 0x4f, 0x0b, 0x92, 0x01, 0x1d, 0x7c, - 0x7f, 0x2a, 0x10, 0x62, 0xd5, 0x51, 0x94, 0xd6, 0xf2, 0x73, 0xb0, 0xcc, - 0xd1, 0x4d, 0x8a, 0x6b, 0x78, 0xbb, 0x9d, 0xbd, 0xc4, 0x79, 0x07, 0xcd, - 0xa8, 0x05, 0x84, 0x69, 0xc4, 0xf9, 0x48, 0xd4, 0x04, 0xdf, 0x0b, 0x6f, - 0x21, 0x94, 0x5d, 0x7b, 0x43, 0xc1, 0x9b, 0x2f, 0xa7, 0x55, 0x02, 0x54, - 0x25, 0xbc, 0x3f, 0x87, 0xce, 0x0a, 0x3f, 0xa1, 0xf2, 0xe8, 0xd8, 0x77, - 0xde, 0xca, 0x9a, 0x36, 0x51, 0x42, 0x62, 0xca, 0x87, 0x26, 0xfc, 0x7b, - 0x70, 0xfb, 0xf6, 0x24, 0xb5, 0xa7, 0xf9, 0x4a, 0x65, 0x64, 0x9e, 0x52, - 0x19, 0xb6, 0x79, 0x6b, 0xd3, 0xca, 0x12, 0xe0, 0xd2, 0xe4, 0x38, 0x57, - 0x29, 0x42, 0x79, 0x87, 0xff, 0xd8, 0xe0, 0xa8, 0xb8, 0x93, 0xe8, 0x23, - 0x67, 0x18, 0x2f, 0xbd, 0x10, 0x80, 0x94, 0x9f, 0x69, 0xd9, 0x65, 0xa4, - 0x00, 0x24, 0x87, 0xea, 0x1a, 0xe1, 0x01, 0xba, 0x03, 0xb2, 0x5e, 0xa5, - 0x70, 0x60, 0x68, 0x91, 0xc6, 0xdf, 0x92, 0x59, 0x4c, 0x4e, 0x14, 0x42, - 0xe2, 0x78, 0xca, 0xd9, 0x6d, 0x02, 0x2a, 0x85, 0x9a, 0x8d, 0x43, 0x1d, - 0x02, 0xc8, 0x1f, 0x9b, 0xca, 0x5a, 0x3e, 0xcb, 0x42, 0xd6, 0xb1, 0x1b, - 0xf1, 0x49, 0x4a, 0x77, 0xbe, 0xa7, 0x54, 0xea, 0xde, 0xc3, 0x6a, 0xef, - 0x15, 0x18, 0x83, 0x30, 0xe5, 0x5a, 0x17, 0xb2, 0xc4, 0xdb, 0xb6, 0xef, - 0x3a, 0xb9, 0xd5, 0xfc, 0xac, 0x94, 0x6f, 0x95, 0x2f, 0x9e, 0xe5, 0x7f, - 0xf9, 0xfe, 0x68, 0x75, 0xef, 0x13, 0x84, 0x2c, 0x19, 0xbe, 0x52, 0x5a, - 0x05, 0x04, 0x49, 0x80, 0x98, 0xc8, 0x77, 0xf1, 0x76, 0xf6, 0x96, 0x68, - 0x6d, 0xe8, 0xe4, 0x3c, 0xa9, 0x10, 0xb1, 0xd6, 0x2a, 0x46, 0xbf, 0x5e, - 0x11, 0xc6, 0x94, 0x97, 0xdb, 0x95, 0x61, 0x4c, 0x9b, 0xe0, 0x19, 0x6b, - 0x03, 0xb4, 0x55, 0x07, 0xd4, 0xa9, 0x2c, 0x46, 0xb1, 0x60, 0x74, 0x00, - 0x41, 0xc1, 0x28, 0x4b, 0x00, 0x06, 0xd8, 0x02, 0x49, 0xc3, 0x02, 0x91, - 0x46, 0xf0, 0x76, 0x70, 0x49, 0x5e, 0xb5, 0x99, 0xe6, 0x91, 0x4f, 0xd2, - 0x72, 0x22, 0xed, 0xc8, 0x72, 0x18, 0xd4, 0xaa, 0x89, 0x24, 0xdb, 0xa7, - 0xee, 0x61, 0x4d, 0x95, 0x55, 0xf3, 0x50, 0x31, 0x51, 0x3f, 0xca, 0xc1, - 0x89, 0xe5, 0xda, 0x71, 0x69, 0x4a, 0xc6, 0x88, 0x93, 0x48, 0x7c, 0x32, - 0x4c, 0x09, 0xb7, 0x47, 0x2b, 0xb1, 0xc6, 0x10, 0x11, 0x6f, 0x86, 0x94, - 0x28, 0x84, 0x81, 0x28, 0xf8, 0xb9, 0x21, 0x93, 0x00, 0xe6, 0xca, 0x28, - 0x37, 0x05, 0x86, 0x9c, 0x38, 0x34, 0x92, 0x60, 0x1a, 0x64, 0x5b, 0x81, - 0x7b, 0x5d, 0x89, 0xf7, 0x40, 0x35, 0x9a, 0xcd, 0x30, 0x14, 0xa3, 0x61, - 0x8b, 0x12, 0xde, 0x91, 0xa6, 0x0d, 0xad, 0x50, 0x56, 0x80, 0x01, 0x98, - 0xad, 0xb1, 0x63, 0xed, 0xdd, 0x9a, 0x5f, 0xc5, 0xcd, 0xe5, 0x39, 0xbd, - 0xbb, 0xfc, 0xda, 0x18, 0xdc, 0xc2, 0x2a, 0xbf, 0xb1, 0x15, 0xa6, 0x4f, - 0xa3, 0xc1, 0xf9, 0xa2, 0x2b, 0xfe, 0x9b, 0xa0, 0x31, 0xe3, 0xb7, 0x01, - 0x34, 0x67, 0xa0, 0xd7, 0x50, 0xcc, 0xa9, 0x9e, 0x4e, 0x69, 0xf6, 0x00, - 0xc0, 0x83, 0x00, 0x51, 0x18, 0xba, 0xc5, 0x9e, 0xeb, 0xb9, 0x75, 0xa8, - 0xd1, 0xf3, 0x9b, 0xe7, 0xac, 0x88, 0xb7, 0xec, 0x02, 0xec, 0x9d, 0x55, - 0x59, 0x11, 0xdb, 0xb2, 0x6e, 0x75, 0x5b, 0x75, 0x42, 0x3f, 0x9f, 0xc4, - 0x88, 0x3f, 0x8a, 0xd8, 0x8b, 0x51, 0x1c, 0xc2, 0x6a, 0x1a, 0xe0, 0xd9, - 0xf1, 0xab, 0xab, 0x29, 0x66, 0xc8, 0xbc, 0x86, 0x38, 0xe1, 0x92, 0x99, - 0x34, 0x90, 0x5d, 0x96, 0x42, 0xe6, 0xe8, 0x42, 0x8e, 0x7e, 0x6a, 0xdc, - 0x47, 0x75, 0xa3, 0x91, 0x91, 0x00, 0xec, 0x66, 0x8c, 0x3f, 0xc3, 0x6a, - 0x4a, 0x12, 0x12, 0x45, 0x26, 0x50, 0x4c, 0x04, 0x82, 0x78, 0x5c, 0xcd, - 0x85, 0x7c, 0xe2, 0xbc, 0x27, 0x18, 0x70, 0x06, 0x76, 0x5d, 0x2a, 0xfb, - 0x81, 0x23, 0x37, 0x0c, 0x47, 0xa1, 0x61, 0x8b, 0x1e, 0x3c, 0xe3, 0x59, - 0xe2, 0x1b, 0xda, 0xda, 0xf8, 0xa3, 0x32, 0xfc, 0x63, 0xb1, 0x97, 0xda, - 0xc4, 0x2d, 0x11, 0xd0, 0x59, 0xa1, 0xa5, 0xc3, 0xba, 0x12, 0xb7, 0x36, - 0xde, 0xfe, 0xf4, 0xda, 0xae, 0x03, 0xe2, 0xe1, 0xb2, 0x65, 0x0b, 0x1c, - 0xb3, 0x03, 0x9a, 0x4e, 0x64, 0x88, 0xa0, 0x7e, 0xa1, 0xfd, 0xe2, 0x60, - 0x2a, 0xaa, 0x19, 0x9c, 0xf5, 0x25, 0xd2, 0xaf, 0x63, 0x99, 0x4a, 0x32, - 0x90, 0x72, 0x41, 0xb2, 0x49, 0xe5, 0x48, 0xd2, 0x53, 0x63, 0x4e, 0x94, - 0x32, 0xb2, 0x58, 0x5c, 0x05, 0x0a, 0x18, 0x24, 0x63, 0xb0, 0xaf, 0x5d, - 0x0e, 0xc8, 0x4f, 0x4a, 0x90, 0xbe, 0x3d, 0x21, 0x08, 0x3b, 0xbd, 0x37, - 0x84, 0xf1, 0x66, 0x8c, 0x6b, 0xee, 0x70, 0xa0, 0x0b, 0x40, 0xb7, 0x60, - 0x05, 0xd6, 0x82, 0x55, 0x77, 0xea, 0xb9, 0x43, 0x2d, 0xd1, 0x21, 0x02, - 0xd1, 0x31, 0x8e, 0x90, 0xd1, 0xa0, 0xa9, 0xfc, 0xd5, 0xd6, 0x06, 0x44, - 0x2a, 0xe4, 0x79, 0x06, 0x88, 0x05, 0x81, 0x37, 0xcf, 0xf4, 0x38, 0x73, - 0x2d, 0x76, 0x0b, 0x76, 0xe7, 0x15, 0xe5, 0xa3, 0x6b, 0x36, 0x2f, 0xa5, - 0xdd, 0x9c, 0x8d, 0x4f, 0x13, 0x6a, 0xb5, 0x8a, 0xca, 0xeb, 0x16, 0xf2, - 0xef, 0x67, 0x80, 0x18, 0xe8, 0x0b, 0xfc, 0x71, 0xe7, 0xee, 0xb4, 0x20, - 0x25, 0xc0, 0xe6, 0x16, 0x24, 0x0e, 0xaa, 0x70, 0xee, 0xb6, 0x07, 0x7b, - 0xa7, 0x10, 0x80, 0xb4, 0xbd, 0x79, 0x13, 0xba, 0xc5, 0x16, 0x5d, 0xd4, - 0x40, 0x67, 0x39, 0xb9, 0x3b, 0x47, 0x06, 0xce, 0x2e, 0xf9, 0xe7, 0x36, - 0x01, 0x76, 0x26, 0x9e, 0x47, 0xed, 0xeb, 0x8a, 0xf5, 0x5e, 0xce, 0xa5, - 0x7a, 0xdd, 0x91, 0x31, 0x3d, 0xdd, 0xb3, 0x9c, 0x8b, 0x4b, 0xd7, 0xa6, - 0x18, 0x05, 0x4f, 0xd2, 0x5d, 0xa4, 0xa1, 0xfa, 0xf1, 0x97, 0x45, 0x36, - 0x78, 0xa0, 0xd5, 0xe8, 0x29, 0x4d, 0x5a, 0xb5, 0x64, 0x2b, 0x5b, 0x58, - 0x0a, 0x77, 0x35, 0x99, 0xe0, 0x0a, 0xe3, 0xf6, 0x24, 0x0c, 0x3f, 0x57, - 0xb3, 0x53, 0x6e, 0xa7, 0xfc, 0x4e, 0x49, 0xc1, 0xf8, 0x04, 0x8c, 0xa6, - 0x08, 0x60, 0x48, 0x43, 0x85, 0x5e, 0x30, 0xc3, 0x46, 0x67, 0x8c, 0xc0, - 0x85, 0x94, 0x7b, 0x9a, 0x69, 0x8b, 0xc9, 0x55, 0x47, 0xd1, 0xba, 0x8c, - 0xd5, 0xd5, 0x45, 0xbf, 0x20, 0xa0, 0xb2, 0x2a, 0xd1, 0x7b, 0x30, 0xe5, - 0x8c, 0xea, 0xe7, 0x7c, 0xd9, 0x45, 0xd3, 0x74, 0x25, 0x1a, 0xc1, 0x17, - 0x94, 0x76, 0x7d, 0xaa, 0xc4, 0x7f, 0xe2, 0x7d, 0xe2, 0x50, 0x92, 0x17, - 0x72, 0xf2, 0x3f, 0x57, 0x02, 0xec, 0xe2, 0x0d, 0x25, 0xe1, 0xc6, 0x5f, - 0x51, 0xe6, 0x15, 0xdf, 0x5a, 0x09, 0x92, 0xd0, 0x1c, 0xae, 0xcb, 0x9a, - 0x22, 0x7c, 0x62, 0xe6, 0x66, 0x68, 0x84, 0x82, 0x29, 0x5b, 0xe2, 0xc5, - 0x88, 0x96, 0xc2, 0x19, 0x59, 0x3d, 0xec, 0xad, 0x6e, 0x60, 0xf3, 0x5f, - 0x20, 0x9c, 0x3f, 0x83, 0xce, 0x02, 0x02, 0x9d, 0x62, 0xf1, 0xad, 0xb8, - 0x54, 0x5c, 0x0a, 0x86, 0x89, 0xbf, 0x14, 0x84, 0x0c, 0xfa, 0xe1, 0xef, - 0x10, 0xd8, 0x76, 0x5f, 0x95, 0x6a, 0x36, 0x12, 0xc7, 0x62, 0x10, 0x8e, - 0x51, 0x13, 0x2d, 0x76, 0x95, 0x0d, 0xd3, 0xce, 0x29, 0x2d, 0x63, 0x54, - 0x53, 0x6a, 0x8a, 0xfd, 0xb4, 0xe6, 0xd8, 0xb8, 0x68, 0x67, 0xb6, 0x43, - 0xe4, 0xfc, 0x2a, 0x7a, 0x2f, 0xb7, 0x3c, 0x11, 0x6e, 0x61, 0x22, 0x60, - 0x63, 0xee, 0x22, 0x2a, 0xb0, 0xb7, 0xc6, 0x53, 0xb4, 0x30, 0xcd, 0x03, - 0xc7, 0x11, 0x81, 0xee, 0x5d, 0x00, 0xf3, 0xf6, 0x19, 0xd1, 0xda, 0xe6, - 0x94, 0x12, 0x39, 0x70, 0x25, 0xe1, 0xcf, 0x5c, 0x49, 0x5d, 0x17, 0xe0, - 0x4d, 0xba, 0x10, 0x5a, 0x3c, 0x47, 0x73, 0xcb, 0xf5, 0xa4, 0xc9, 0x5b, - 0x56, 0x21, 0x55, 0x10, 0xb1, 0x82, 0x18, 0x17, 0x2b, 0x98, 0x1b, 0x54, - 0xc7, 0x55, 0x80, 0x40, 0xd9, 0x70, 0xf6, 0x48, 0x13, 0xf2, 0x16, 0xd8, - 0x2e, 0x56, 0xb6, 0xc4, 0x6d, 0x7c, 0xeb, 0xca, 0xdc, 0xec, 0xc4, 0xbb, - 0xa2, 0x32, 0x5f, 0xfe, 0x5b, 0xe9, 0x8d, 0x2f, 0xa8, 0xac, 0x85, 0xde, - 0x19, 0x93, 0x97, 0xc1, 0x55, 0xb8, 0x83, 0x60, 0x1b, 0xd5, 0x3c, 0xf9, - 0xb9, 0x78, 0xab, 0x0e, 0x45, 0xf1, 0x2e, 0xe6, 0x40, 0xe8, 0x0c, 0xe7, - 0x89, 0xd7, 0x82, 0xb0, 0x6d, 0x06, 0xfd, 0x79, 0x36, 0x11, 0x49, 0x7a, - 0xf0, 0x7d, 0x0a, 0x59, 0x56, 0x5b, 0xcf, 0x12, 0x19, 0xef, 0x0c, 0xa1, - 0x77, 0x0a, 0x4d, 0x1b, 0x20, 0x79, 0xb3, 0x4e, 0x1f, 0x81, 0xe5, 0x55, - 0xf9, 0xca, 0x21, 0x99, 0x45, 0x33, 0x2a, 0xed, 0x59, 0xea, 0x5b, 0x72, - 0x12, 0x84, 0x12, 0xb0, 0xe4, 0x30, 0x1c, 0x2c, 0xbf, 0x3f, 0x56, 0xcf, - 0x2c, 0xa4, 0x16, 0x38, 0x01, 0x03, 0x2b, 0xfd, 0x86, 0x1c, 0xa1, 0x36, - 0x96, 0x4e, 0x6d, 0xb1, 0x3b, 0x40, 0x8d, 0x11, 0x8f, 0xa3, 0x4e, 0x25, - 0xe8, 0x55, 0xa4, 0x6e, 0x81, 0xa5, 0x12, 0xbd, 0xd5, 0x29, 0x57, 0x6c, - 0x03, 0xf4, 0x0f, 0x99, 0x49, 0xbd, 0xf1, 0xa5, 0x93, 0xf9, 0x05, 0x3a, - 0x4d, 0xb4, 0xbc, 0xc8, 0x54, 0xe8, 0xd3, 0xf6, 0xc1, 0xba, 0x9b, 0x72, - 0x7f, 0x4b, 0x42, 0x16, 0xb9, 0xd7, 0x85, 0x7d, 0x63, 0xda, 0xfb, 0x62, - 0x3f, 0x59, 0x7c, 0x8b, 0x45, 0x99, 0xd3, 0xde, 0xbf, 0x4c, 0xdf, 0x32, - 0x57, 0x07, 0x1c, 0x1f, 0xd6, 0x1e, 0xb5, 0x02, 0x56, 0x07, 0xfc, 0x90, - 0x24, 0xb2, 0xb0, 0x59, 0xc0, 0xc5, 0x69, 0xcf, 0xfc, 0x28, 0x66, 0xef, - 0x62, 0x09, 0xdb, 0xa3, 0xab, 0x93, 0x25, 0x7d, 0x82, 0x33, 0x24, 0xe4, - 0x4b, 0x8c, 0xe7, 0xe3, 0x7b, 0x48, 0x51, 0xa3, 0x0c, 0x0f, 0xb3, 0xc6, - 0xb0, 0x27, 0x73, 0x28, 0x77, 0xb6, 0xc2, 0xce, 0xd2, 0xd1, 0x2d, 0x0e, - 0xd7, 0x17, 0x2d, 0x4c, 0x87, 0x43, 0xae, 0xe8, 0x96, 0x88, 0x3c, 0x93, - 0x21, 0x72, 0x8c, 0xd7, 0x9e, 0xf3, 0x46, 0x0c, 0xea, 0x46, 0x3c, 0xd0, - 0x6d, 0x77, 0x6c, 0x44, 0xc3, 0x2c, 0x00, 0xb9, 0x29, 0x37, 0x56, 0x3c, - 0xd0, 0x09, 0x5e, 0xd2, 0x3c, 0x58, 0x7e, 0xd5, 0x4e, 0xd9, 0x1a, 0x1c, - 0xa9, 0x0f, 0x96, 0x5f, 0x33, 0x92, 0x42, 0x42, 0xd4, 0x34, 0x54, 0xb6, - 0xdc, 0x0d, 0x5d, 0x28, 0xfa, 0x89, 0x63, 0x56, 0x1a, 0x74, 0xc2, 0xa3, - 0x7a, 0x92, 0x27, 0xab, 0xe3, 0xe4, 0x81, 0x9e, 0xb4, 0x99, 0x8e, 0xb2, - 0xa5, 0xa3, 0xef, 0x9e, 0xbb, 0x6c, 0x43, 0x1d, 0x22, 0xec, 0x35, 0xc0, - 0xa6, 0xea, 0x22, 0x15, 0x67, 0x8a, 0xaa, 0xf6, 0x94, 0x2d, 0xd9, 0x1d, - 0xcb, 0x1a, 0x3b, 0x3f, 0x75, 0x37, 0xc4, 0x9b, 0x51, 0xd8, 0x6d, 0x0c, - 0x86, 0xd4, 0x4e, 0x27, 0x91, 0x1e, 0xa2, 0xba, 0xb0, 0xcf, 0x21, 0x16, - 0xca, 0x9a, 0x12, 0x07, 0xc9, 0xe3, 0x66, 0x31, 0xd6, 0x76, 0x3b, 0x4a, - 0x57, 0x88, 0x30, 0x89, 0x50, 0x61, 0x04, 0xba, 0x80, 0x07, 0xca, 0x05, - 0x76, 0x30, 0xf2, 0x29, 0xc5, 0xe4, 0x36, 0x1c, 0x9d, 0x4b, 0x4b, 0xab, - 0xe4, 0x33, 0xe2, 0xd0, 0xf0, 0xd9, 0xda, 0xc0, 0x5a, 0x5d, 0x3a, 0x0e, - 0x6b, 0x75, 0x7b, 0xfd, 0x3a, 0x81, 0x4a, 0x6d, 0xc9, 0x32, 0x7c, 0x18, - 0x45, 0x6c, 0xae, 0x5e, 0x35, 0x34, 0x28, 0x6c, 0x46, 0xf0, 0x65, 0x99, - 0xd8, 0x10, 0x07, 0xfb, 0x2e, 0x87, 0x76, 0xc2, 0x6b, 0xe6, 0x7e, 0x31, - 0xef, 0xcf, 0xc0, 0x04, 0x81, 0x6c, 0x1f, 0xba, 0xf4, 0xae, 0xe0, 0x4d, - 0x30, 0xe9, 0xc5, 0xc9, 0xb2, 0xc3, 0x67, 0xc7, 0x94, 0x44, 0x35, 0x03, - 0x14, 0xd5, 0xc8, 0x76, 0x94, 0xbb, 0x5f, 0x96, 0x38, 0xb2, 0x14, 0x5b, - 0xa8, 0x29, 0x7e, 0xd5, 0xed, 0x39, 0xf9, 0xc2, 0xf3, 0x42, 0xfd, 0x8b, - 0x2f, 0x54, 0xf8, 0xd8, 0x01, 0xdd, 0x7c, 0xa0, 0xf1, 0xb7, 0x54, 0x3d, - 0xa4, 0x91, 0x99, 0x2f, 0x5f, 0x9c, 0xf3, 0xbd, 0x63, 0x2b, 0x1c, 0x25, - 0x8a, 0x59, 0x5e, 0xca, 0xf8, 0x5a, 0xc4, 0xb3, 0x55, 0xa4, 0xaf, 0xa7, - 0x5a, 0x8a, 0xad, 0xcd, 0x97, 0x6a, 0xb8, 0x37, 0x65, 0x51, 0x25, 0x5c, - 0x1a, 0xf7, 0xb5, 0xdc, 0x71, 0x8e, 0x3a, 0x5d, 0x22, 0xd3, 0xb5, 0xe5, - 0xe0, 0xf0, 0xe7, 0x0d, 0xf0, 0xbc, 0x01, 0x78, 0x01, 0x3b, 0x8c, 0xdf, - 0xf6, 0xdd, 0xf6, 0x79, 0x23, 0x34, 0x34, 0xd2, 0x05, 0xe6, 0xde, 0xa2, - 0x91, 0xb2, 0x5a, 0x49, 0xc7, 0x1a, 0x39, 0x09, 0x2c, 0x05, 0xec, 0x9b, - 0x84, 0xc1, 0xe8, 0x45, 0x5b, 0xa4, 0x25, 0x66, 0x91, 0x4e, 0x10, 0xc3, - 0xe9, 0x8b, 0xef, 0x14, 0x92, 0x5d, 0xd1, 0x2a, 0xd0, 0x48, 0x7d, 0x01, - 0x0b, 0x96, 0x43, 0xcf, 0x07, 0xaf, 0x22, 0xdb, 0xc2, 0x92, 0xc1, 0x2d, - 0x3b, 0x6e, 0x14, 0x7e, 0x25, 0xb8, 0x37, 0xa5, 0xae, 0x50, 0x38, 0xf2, - 0x27, 0x7d, 0x08, 0xa3, 0xb5, 0xdf, 0xe1, 0x83, 0xf0, 0x1c, 0xee, 0xd7, - 0xeb, 0x3b, 0x04, 0xe7, 0xea, 0xb9, 0x4e, 0xc1, 0x46, 0x44, 0x6b, 0xc3, - 0x83, 0xf6, 0x0c, 0x66, 0x5e, 0xf5, 0xf6, 0xf2, 0xeb, 0x06, 0x25, 0x9b, - 0xb3, 0xc7, 0x80, 0xdc, 0x71, 0x70, 0x7b, 0x43, 0xfe, 0x05, 0x58, 0x74, - 0x00, 0x78, 0x81, 0x60, 0x19, 0xb1, 0xea, 0x73, 0x37, 0x62, 0xc3, 0x6b, - 0x02, 0xa9, 0x3b, 0x30, 0x45, 0x25, 0xcb, 0x8c, 0x4b, 0x57, 0x21, 0xdc, - 0x02, 0xd9, 0x96, 0x38, 0xb2, 0x78, 0x3f, 0x2a, 0xab, 0xd0, 0xb3, 0x9d, - 0xe0, 0xd9, 0x4e, 0xf0, 0x6c, 0x27, 0x78, 0xb6, 0x13, 0x3c, 0xdb, 0x09, - 0x9e, 0x96, 0xf6, 0xf9, 0x6c, 0x27, 0x78, 0x5e, 0xa8, 0x9f, 0xc5, 0x42, - 0x95, 0xaf, 0x49, 0xcf, 0x76, 0x82, 0xe7, 0x0d, 0xf0, 0xa4, 0x37, 0xc0, - 0xcd, 0xb3, 0x9d, 0xe0, 0xd9, 0x4e, 0xf0, 0x6c, 0x27, 0xf8, 0x4b, 0xdb, - 0x09, 0x46, 0xd8, 0x12, 0xdd, 0xcc, 0xa2, 0xa3, 0x17, 0xe0, 0x2a, 0x22, - 0x0c, 0x6d, 0x73, 0xef, 0x68, 0x21, 0x40, 0x82, 0x40, 0x72, 0x9f, 0x69, - 0x3c, 0x4c, 0x68, 0x82, 0x85, 0x5c, 0x68, 0x81, 0x85, 0xae, 0x45, 0xd2, - 0xbd, 0x16, 0x63, 0xb9, 0x18, 0x43, 0x05, 0x48, 0xb9, 0x81, 0xff, 0xe2, - 0x56, 0x89, 0x87, 0xa5, 0xe9, 0xc1, 0xfa, 0x6a, 0x22, 0x05, 0xaa, 0x5d, - 0x15, 0x80, 0x1e, 0xe6, 0x1d, 0xe6, 0x34, 0xc1, 0xbb, 0x92, 0x39, 0xb8, - 0x44, 0xc8, 0xe2, 0x93, 0x85, 0x6f, 0x9f, 0x7e, 0xe6, 0x23, 0x74, 0x88, - 0x52, 0x46, 0x5c, 0x9f, 0xe6, 0xa7, 0xfd, 0x08, 0x20, 0x32, 0x5f, 0x11, - 0x5a, 0x80, 0xbc, 0x62, 0xcf, 0x05, 0x58, 0x30, 0x91, 0xfc, 0x4e, 0x48, - 0xf4, 0x09, 0xb0, 0x3c, 0xc2, 0x09, 0xb7, 0xd1, 0xc1, 0x4a, 0xe2, 0x9e, - 0x99, 0xa3, 0x83, 0xbb, 0xc3, 0x10, 0xf2, 0xb6, 0x6b, 0xc5, 0x45, 0x08, - 0x15, 0xcd, 0xc7, 0x1a, 0xe2, 0x24, 0x2a, 0x75, 0x7c, 0x03, 0x30, 0x2c, - 0xd5, 0xf4, 0xc8, 0xa9, 0x7f, 0x60, 0xa5, 0xee, 0xb4, 0xc3, 0x38, 0x30, - 0x01, 0x5b, 0xd6, 0xb9, 0x7e, 0x75, 0x06, 0xfa, 0x09, 0x4c, 0x17, 0x33, - 0xd4, 0x36, 0x64, 0x93, 0x19, 0x30, 0x47, 0x27, 0xc8, 0xde, 0xcb, 0xb9, - 0x77, 0x40, 0x3b, 0x7a, 0x9a, 0xa4, 0x63, 0xaf, 0x5f, 0x35, 0xa3, 0x37, - 0x62, 0x85, 0xed, 0x9e, 0x95, 0x30, 0xcd, 0xb4, 0xe6, 0xac, 0x0c, 0x11, - 0x0b, 0x2e, 0x33, 0xe4, 0x18, 0x66, 0x7c, 0x08, 0xac, 0xb9, 0x6b, 0xe2, - 0x91, 0x21, 0xad, 0xaa, 0xab, 0x2c, 0x11, 0xf9, 0x7b, 0x47, 0xa9, 0x52, - 0x3d, 0xc2, 0x5c, 0x5d, 0x79, 0x96, 0xc2, 0x3e, 0x12, 0x7f, 0xed, 0xcb, - 0xa3, 0xa4, 0x46, 0xfb, 0x0a, 0xae, 0xa5, 0x67, 0x7d, 0x24, 0x9a, 0x88, - 0x84, 0x45, 0x38, 0x69, 0x07, 0x1d, 0xda, 0x98, 0x66, 0x0a, 0xc3, 0xc5, - 0xb0, 0x10, 0x47, 0xaa, 0xa5, 0x1e, 0x39, 0x84, 0x51, 0x7d, 0xff, 0xb0, - 0x00, 0xa3, 0x36, 0x0d, 0x19, 0xd2, 0x18, 0x05, 0x8d, 0x41, 0x21, 0xae, - 0xc6, 0xab, 0x84, 0x92, 0x5d, 0x22, 0x94, 0x94, 0x2a, 0x57, 0x24, 0xe5, - 0x2e, 0x99, 0xcb, 0x45, 0x32, 0xc6, 0x06, 0x55, 0xeb, 0xa3, 0x93, 0x25, - 0x97, 0xc9, 0x9f, 0x57, 0x9b, 0x5d, 0x4a, 0xfe, 0x12, 0xaa, 0xb0, 0x65, - 0xba, 0x5e, 0x76, 0x22, 0x60, 0xc0, 0x0f, 0xd0, 0x6a, 0x2f, 0xbb, 0x10, - 0xa6, 0x59, 0x1e, 0x70, 0xcd, 0x23, 0x49, 0xf6, 0x81, 0xd2, 0xb8, 0xae, - 0x91, 0x4c, 0x52, 0x37, 0x4a, 0x82, 0xec, 0x27, 0x2a, 0x9c, 0xbe, 0x5f, - 0x8c, 0x28, 0xb8, 0x96, 0xf0, 0x74, 0x6c, 0x84, 0x60, 0x3e, 0x19, 0xcd, - 0x29, 0x05, 0x30, 0xb9, 0x98, 0x43, 0x56, 0xc3, 0x92, 0x23, 0x9e, 0x3d, - 0x40, 0xb0, 0x6d, 0x41, 0x5e, 0xbc, 0x60, 0xc9, 0xd0, 0x6b, 0x83, 0xf7, - 0x5e, 0x0d, 0xa6, 0xbe, 0xc8, 0x67, 0x1a, 0x2d, 0x0d, 0x41, 0xcb, 0x31, - 0xf3, 0x1c, 0x9d, 0x4d, 0x62, 0xd4, 0x9b, 0xca, 0xca, 0x63, 0x58, 0xcb, - 0x02, 0x4a, 0x45, 0x7c, 0x73, 0xcc, 0x03, 0xcb, 0xc1, 0x0c, 0x36, 0x32, - 0x5d, 0x50, 0x0d, 0x40, 0xc5, 0x97, 0xb1, 0x71, 0xcb, 0xef, 0x83, 0x3e, - 0x17, 0x78, 0x9b, 0xfc, 0x07, 0x2b, 0x68, 0x27, 0xd9, 0xb4, 0xe0, 0x49, - 0x4e, 0x8c, 0x51, 0xbe, 0x56, 0x7e, 0x54, 0x17, 0x3d, 0x11, 0x27, 0x5d, - 0x29, 0xaf, 0x8a, 0xa2, 0xd4, 0xf3, 0xd3, 0xa1, 0x74, 0xae, 0xe7, 0xc0, - 0xb3, 0x0f, 0x25, 0x0c, 0x61, 0x89, 0x24, 0x71, 0x36, 0x1a, 0x93, 0xe0, - 0x81, 0x88, 0xca, 0x3f, 0xc4, 0xb2, 0x63, 0x04, 0x5f, 0x6a, 0x13, 0x2f, - 0x35, 0xd2, 0x5a, 0xcf, 0xe3, 0x11, 0xd2, 0x49, 0x95, 0x4b, 0x35, 0xa6, - 0x7b, 0x4b, 0x3d, 0x7d, 0xcf, 0x92, 0xf1, 0xfb, 0xcd, 0x2e, 0x3a, 0x07, - 0x92, 0x91, 0xc2, 0x94, 0x2f, 0xa5, 0x52, 0x5c, 0xd2, 0x9b, 0x60, 0x00, - 0x6b, 0xd4, 0x89, 0x74, 0x95, 0x54, 0xa0, 0x59, 0xb5, 0x12, 0x2c, 0x8f, - 0xea, 0xc1, 0xc7, 0x1e, 0x09, 0x93, 0xd8, 0xc3, 0x89, 0xb7, 0x1f, 0x64, - 0xdd, 0xcb, 0x52, 0xfc, 0x0e, 0xb0, 0x03, 0x10, 0xc9, 0x00, 0x5e, 0xca, - 0x6a, 0x8a, 0xd0, 0xb3, 0x22, 0x4f, 0x24, 0x78, 0x05, 0x57, 0xe9, 0x48, - 0xfb, 0x72, 0x1d, 0xde, 0x93, 0xdc, 0xb1, 0xe4, 0x66, 0x85, 0x5d, 0x8c, - 0x01, 0xd6, 0x44, 0x93, 0xa5, 0x34, 0x8a, 0x3b, 0xad, 0x0f, 0x94, 0xbe, - 0x25, 0x3f, 0xd9, 0x71, 0x8e, 0x05, 0xcd, 0x34, 0xbe, 0xf9, 0x60, 0xec, - 0xba, 0x7e, 0xa1, 0x0c, 0xe6, 0x23, 0xc9, 0x8f, 0x20, 0x8d, 0x17, 0x50, - 0x20, 0x34, 0x13, 0xf1, 0x1a, 0x81, 0x13, 0xf0, 0x86, 0x63, 0x7f, 0x3b, - 0x4a, 0x39, 0x6f, 0x3a, 0xbe, 0xdf, 0x73, 0x27, 0xca, 0xd7, 0x37, 0x14, - 0x6f, 0x4b, 0xb9, 0x0c, 0x95, 0x5d, 0x6a, 0x25, 0xac, 0x88, 0x3a, 0x7d, - 0x74, 0x1b, 0xf9, 0x6a, 0x02, 0x0b, 0x4e, 0xa6, 0x57, 0x6d, 0x23, 0x4a, - 0x93, 0x89, 0x5a, 0x73, 0x7c, 0xae, 0x96, 0xe6, 0x23, 0x0f, 0xd4, 0x8c, - 0x03, 0x34, 0xf2, 0x9a, 0xdd, 0xf9, 0x28, 0x53, 0xb8, 0x3f, 0xde, 0x04, - 0xc6, 0x0f, 0xb7, 0xa5, 0x65, 0x9a, 0x0d, 0x63, 0x43, 0x61, 0x15, 0x3b, - 0x6f, 0xad, 0x99, 0xda, 0x3b, 0x0e, 0x76, 0x21, 0x27, 0xa8, 0xcc, 0x80, - 0x03, 0x7b, 0xaf, 0x75, 0xa5, 0x60, 0xde, 0xdd, 0x3b, 0xe0, 0x63, 0x88, - 0xad, 0x26, 0x0a, 0x67, 0xe7, 0xe3, 0xde, 0x25, 0x30, 0x59, 0x3b, 0xed, - 0x2f, 0x64, 0x45, 0x9b, 0x5a, 0x72, 0xf5, 0xe9, 0xa1, 0xf6, 0xc4, 0x4e, - 0x32, 0x31, 0xe3, 0xf6, 0xf5, 0xec, 0x32, 0x3e, 0x15, 0x43, 0x7d, 0xea, - 0x01, 0xa3, 0x64, 0x3a, 0x5d, 0xc2, 0x6e, 0x29, 0x4b, 0x5e, 0x58, 0x20, - 0x19, 0xc8, 0xa5, 0xb5, 0xf1, 0x2b, 0x69, 0x51, 0xb0, 0x25, 0x87, 0x0e, - 0x2a, 0x4f, 0xfe, 0x34, 0xf4, 0xd1, 0x90, 0x99, 0xb9, 0x0f, 0x9e, 0x73, - 0x5d, 0x2d, 0xb4, 0x15, 0xbc, 0xd3, 0x49, 0x85, 0x15, 0x6d, 0xdd, 0x3c, - 0x53, 0xb0, 0xdc, 0x7a, 0xab, 0xfe, 0xf4, 0xd0, 0x14, 0x2c, 0x3e, 0x7d, - 0x3e, 0x14, 0x2c, 0xaf, 0xc5, 0xc8, 0x7b, 0x45, 0x5b, 0xaf, 0x5e, 0x1a, - 0x57, 0x68, 0x8e, 0xb1, 0x75, 0x55, 0x2e, 0x26, 0xfc, 0x36, 0x65, 0x85, - 0x16, 0x2f, 0x73, 0x62, 0x65, 0x2a, 0x61, 0xa6, 0xe2, 0x46, 0x9f, 0xf2, - 0xcf, 0x62, 0x5d, 0x8f, 0xfe, 0xca, 0xf5, 0x70, 0xe7, 0x16, 0xc4, 0x73, - 0xbb, 0x0e, 0xce, 0xad, 0x3e, 0xa5, 0x6b, 0xed, 0x5e, 0xab, 0x52, 0x7f, - 0x7c, 0x38, 0xcf, 0xe5, 0xa1, 0xd7, 0x39, 0x12, 0xe7, 0x97, 0xbf, 0xfb, - 0x33, 0x6e, 0x6d, 0x38, 0x4d, 0xa4, 0x2e, 0xee, 0xb2, 0x9a, 0xf4, 0xb7, - 0x5a, 0x31, 0x4a, 0x8e, 0xd2, 0xb6, 0xc5, 0x26, 0xce, 0xb9, 0xb9, 0x2f, - 0xbd, 0x33, 0x5c, 0xbd, 0xcf, 0xc5, 0x0c, 0x21, 0xe4, 0x1a, 0x2d, 0xb6, - 0x7a, 0xb2, 0xc1, 0xa4, 0x9d, 0x52, 0x1f, 0xb7, 0x7d, 0xcd, 0x0d, 0x84, - 0x34, 0xcf, 0xb1, 0xe1, 0x8e, 0x9d, 0xb6, 0xe6, 0x76, 0x7e, 0x37, 0xa7, - 0xd8, 0xc8, 0xaf, 0x6c, 0xe6, 0x72, 0xa1, 0x1a, 0xe3, 0xd0, 0x73, 0x58, - 0x30, 0x2a, 0xe8, 0x1d, 0x3f, 0x12, 0x89, 0xb3, 0x23, 0x8e, 0x64, 0x36, - 0xb7, 0xfc, 0x4b, 0xef, 0xcc, 0xc7, 0xfe, 0xa4, 0x94, 0xe4, 0x0d, 0x94, - 0x6c, 0xeb, 0x43, 0xb7, 0xc4, 0xae, 0xa8, 0x92, 0x7a, 0x90, 0x4c, 0x83, - 0x92, 0xdb, 0x19, 0xef, 0x34, 0xdd, 0xec, 0x62, 0x23, 0xf8, 0xeb, 0xf0, - 0x98, 0x63, 0xe7, 0x45, 0x17, 0x7b, 0x1f, 0xe9, 0xe2, 0x99, 0x22, 0x19, - 0xb8, 0x0c, 0xb8, 0x94, 0x6b, 0x9a, 0x12, 0xf9, 0xb8, 0x6e, 0x10, 0xfa, - 0x8e, 0x06, 0x74, 0xca, 0x10, 0xb1, 0x78, 0x86, 0xfa, 0x4e, 0xf2, 0x98, - 0xdf, 0x05, 0x35, 0x85, 0x6b, 0xba, 0xe9, 0x97, 0x58, 0x25, 0x4e, 0xae, - 0x28, 0xcd, 0x1a, 0xc2, 0x12, 0x2f, 0x45, 0x5e, 0xce, 0xbb, 0xa8, 0x79, - 0x01, 0x43, 0x1e, 0xcb, 0xc4, 0x89, 0x3e, 0xf3, 0xda, 0x71, 0x08, 0x63, - 0x09, 0xac, 0x6e, 0x84, 0xde, 0xa0, 0xa6, 0x84, 0x99, 0x1a, 0x11, 0x41, - 0x36, 0x11, 0x79, 0x37, 0xc8, 0xa1, 0x87, 0x9a, 0x1b, 0x1d, 0x51, 0x59, - 0xec, 0xbc, 0x58, 0x69, 0xdf, 0x1a, 0x13, 0x33, 0x70, 0xec, 0x42, 0x6b, - 0x11, 0x57, 0xc9, 0x08, 0xff, 0xbe, 0x7c, 0xb9, 0x5f, 0xcb, 0x57, 0xa1, - 0x08, 0xf9, 0x44, 0x6e, 0x6a, 0x0f, 0x10, 0x34, 0x42, 0x69, 0x75, 0x48, - 0x8a, 0x58, 0x10, 0x71, 0xec, 0xe1, 0x1a, 0xa9, 0x55, 0x00, 0x5f, 0x61, - 0x9b, 0x6d, 0x00, 0x24, 0x92, 0xe5, 0xec, 0x3b, 0x25, 0x89, 0x25, 0xa9, - 0x91, 0x40, 0x92, 0x45, 0x48, 0x97, 0x92, 0x57, 0xb0, 0xd1, 0xbb, 0x71, - 0xaa, 0x12, 0xc5, 0x66, 0x60, 0x54, 0xa8, 0xca, 0xdf, 0xa7, 0x1f, 0xec, - 0x99, 0xb7, 0x6d, 0xd1, 0x2e, 0x8f, 0xc0, 0x2c, 0x27, 0xf0, 0x90, 0x56, - 0xb7, 0xce, 0x63, 0x4d, 0x78, 0x6f, 0xe4, 0x3d, 0xb7, 0xba, 0xae, 0x85, - 0x5e, 0xa9, 0x4a, 0x24, 0xb6, 0x30, 0xd5, 0xb7, 0xea, 0xf9, 0x42, 0x20, - 0x8a, 0x0b, 0xc7, 0xb3, 0x9d, 0x76, 0x67, 0xcf, 0xc8, 0xae, 0x33, 0xc8, - 0x9f, 0x61, 0x3a, 0xfe, 0x4f, 0x3c, 0x3f, 0xd5, 0x8d, 0x71, 0x18, 0x57, - 0x0a, 0xc0, 0xa9, 0xca, 0xcb, 0x91, 0xd7, 0x5c, 0xda, 0x9e, 0x7e, 0x5a, - 0xdb, 0xca, 0x72, 0x4e, 0xaf, 0x9a, 0xa3, 0x94, 0x19, 0x57, 0x12, 0xff, - 0x47, 0xa8, 0xfd, 0xf8, 0xbc, 0x47, 0x9f, 0xf7, 0xe8, 0x63, 0xd9, 0xa3, - 0x13, 0xfd, 0xc2, 0x2d, 0x28, 0x16, 0xae, 0x99, 0x63, 0xe1, 0x0c, 0xa2, - 0xad, 0xa9, 0x5f, 0xb4, 0xf4, 0x00, 0xdc, 0x38, 0xe2, 0xfd, 0xa8, 0xa9, - 0x59, 0x9c, 0x59, 0xb7, 0xdd, 0x68, 0xd1, 0x86, 0xae, 0xb9, 0x6e, 0x9b, - 0x1e, 0x32, 0x67, 0xed, 0xbd, 0xf0, 0xc9, 0xbd, 0xfe, 0xbb, 0xec, 0xfd, - 0xd5, 0xce, 0x0f, 0xca, 0xe3, 0x1a, 0xf0, 0x9b, 0xe0, 0x57, 0x8d, 0xe8, - 0xf9, 0x63, 0x88, 0x2f, 0xdf, 0x0c, 0x30, 0xfb, 0x83, 0xda, 0x17, 0xde, - 0xd2, 0x3c, 0x28, 0xcc, 0xe0, 0x4c, 0x04, 0x99, 0x07, 0xcc, 0x83, 0xfd, - 0x81, 0xd3, 0x1c, 0x99, 0x9a, 0xd2, 0x64, 0xe1, 0xee, 0x20, 0xa7, 0xf2, - 0xe0, 0xd9, 0x00, 0x96, 0xe3, 0x62, 0x92, 0x1f, 0x32, 0xe1, 0x15, 0x34, - 0x8b, 0x76, 0x08, 0xd0, 0x24, 0xc8, 0x4c, 0x21, 0x51, 0xee, 0x8c, 0x2d, - 0xa8, 0x37, 0x8d, 0x4f, 0x91, 0x15, 0xec, 0x03, 0xbb, 0xa4, 0xd1, 0x03, - 0xcb, 0xd6, 0x7e, 0x22, 0x89, 0x1b, 0xc3, 0x5d, 0x0e, 0x1d, 0x67, 0x69, - 0x32, 0xb9, 0x9e, 0x54, 0x72, 0xa5, 0x77, 0xe0, 0xfd, 0xa4, 0x0a, 0x3f, - 0x10, 0x98, 0x4e, 0x59, 0x6e, 0xc2, 0x91, 0xaf, 0x9b, 0xd0, 0xef, 0x1f, - 0x0a, 0x57, 0xbb, 0xae, 0xca, 0xfb, 0x16, 0xf9, 0x97, 0x8b, 0xcf, 0x38, - 0xf1, 0x5e, 0x6b, 0x8e, 0x86, 0x5b, 0x41, 0x89, 0x79, 0x89, 0xfe, 0xfa, - 0x97, 0x28, 0x03, 0x8b, 0x7d, 0x97, 0xbc, 0xbb, 0xcc, 0x16, 0x6d, 0x67, - 0xc7, 0x64, 0x4d, 0x5c, 0x07, 0xfe, 0x38, 0x06, 0x4c, 0x16, 0xa8, 0x3f, - 0xfd, 0x95, 0xd7, 0xb6, 0x46, 0x2c, 0x7e, 0x42, 0x4c, 0x7b, 0x3b, 0xdb, - 0xc2, 0x04, 0xda, 0xa2, 0xc1, 0x68, 0x49, 0x58, 0x00, 0x57, 0x62, 0x5a, - 0x9e, 0x9c, 0xe3, 0xf6, 0x0f, 0xd9, 0xcb, 0x73, 0xad, 0xbd, 0x3b, 0xef, - 0x8e, 0x62, 0xef, 0xd6, 0x28, 0x7e, 0x2c, 0x08, 0x66, 0xf8, 0x68, 0x7a, - 0x13, 0x7b, 0xcb, 0x0e, 0x58, 0x8b, 0x58, 0x37, 0xd4, 0x52, 0x50, 0x59, - 0x09, 0xa1, 0x4a, 0x6c, 0x85, 0x74, 0xc2, 0xda, 0x61, 0x06, 0xa6, 0xc8, - 0xe1, 0x28, 0x16, 0x73, 0xd0, 0xb9, 0x45, 0x3b, 0x47, 0x6e, 0x5a, 0xeb, - 0x99, 0xa5, 0x83, 0x45, 0xa8, 0xd8, 0x4d, 0xa3, 0xd9, 0x93, 0x8c, 0x58, - 0x27, 0x8f, 0x54, 0xc4, 0x8e, 0x33, 0xde, 0x79, 0x76, 0x31, 0x07, 0x0f, - 0x98, 0xfa, 0xc4, 0x91, 0xb8, 0xf4, 0x0c, 0x2a, 0x09, 0x14, 0xfd, 0xb2, - 0xd8, 0x1d, 0xa3, 0xcd, 0x7d, 0x53, 0x9a, 0x8b, 0xe2, 0xf9, 0xd4, 0x9e, - 0xde, 0xe7, 0x67, 0x52, 0xf0, 0xad, 0x7e, 0xa6, 0x6b, 0x2d, 0xdb, 0x8f, - 0xc2, 0xb8, 0xfe, 0xc7, 0xb5, 0xc6, 0x75, 0x98, 0xaf, 0x48, 0xf9, 0xed, - 0x1a, 0xb3, 0x99, 0x7f, 0x65, 0x97, 0x60, 0xfd, 0xea, 0x33, 0xb2, 0xaf, - 0xff, 0x29, 0xed, 0x77, 0xd8, 0x03, 0x48, 0x06, 0x5e, 0xf0, 0x10, 0x31, - 0x1f, 0xa6, 0x91, 0xb1, 0x44, 0x2b, 0x34, 0x93, 0x99, 0x19, 0xc5, 0x18, - 0x8f, 0xa7, 0x30, 0xa0, 0xca, 0x02, 0xa3, 0xbf, 0xba, 0x41, 0x47, 0x29, - 0xa4, 0xe3, 0x00, 0x7d, 0x35, 0xdb, 0x5e, 0x4d, 0x7e, 0xc1, 0x54, 0x8e, - 0x69, 0x3b, 0xd6, 0x6a, 0xf0, 0x33, 0xa8, 0x98, 0x9a, 0xcf, 0xfd, 0x92, - 0x90, 0x92, 0x0f, 0x03, 0xf8, 0xd9, 0x9e, 0x60, 0x43, 0x58, 0x71, 0x70, - 0xcc, 0x7c, 0xeb, 0x86, 0xb2, 0xaa, 0x9c, 0x1e, 0x81, 0xca, 0x51, 0x9c, - 0x15, 0xf9, 0x99, 0xe1, 0x79, 0x10, 0x47, 0x60, 0xb1, 0xc1, 0xc7, 0x11, - 0x2c, 0xa6, 0x43, 0x05, 0x9c, 0x58, 0x5f, 0x4a, 0x3b, 0x50, 0x3c, 0x74, - 0x85, 0x04, 0x97, 0xee, 0x17, 0x00, 0xbf, 0xb1, 0x18, 0xb0, 0xa5, 0x47, - 0x7d, 0xc6, 0xd8, 0x3b, 0xeb, 0xa1, 0x0d, 0xe4, 0xbc, 0xe5, 0xb8, 0xb1, - 0x51, 0xd3, 0x26, 0x15, 0xc8, 0x30, 0xb7, 0xa7, 0x87, 0xd7, 0x73, 0xa7, - 0xa3, 0xa4, 0x34, 0x5d, 0xeb, 0x60, 0x0c, 0x15, 0x83, 0x87, 0x27, 0xef, - 0x67, 0xa9, 0x60, 0x60, 0xe8, 0x5f, 0x1a, 0xb2, 0x54, 0xe8, 0x50, 0xf3, - 0xc2, 0x4d, 0x67, 0x84, 0x11, 0xc5, 0xa5, 0x7d, 0x0e, 0xce, 0x4b, 0x0b, - 0x19, 0x82, 0xc3, 0x90, 0x96, 0x6d, 0x1e, 0xdf, 0x40, 0x1c, 0xef, 0x18, - 0x3b, 0x17, 0x30, 0xdd, 0x3a, 0xf4, 0x2a, 0xeb, 0x9b, 0x8e, 0x0c, 0x5c, - 0xcd, 0xac, 0xba, 0x21, 0x80, 0x89, 0x33, 0xa5, 0x34, 0xcb, 0x38, 0xd3, - 0x35, 0xf9, 0x67, 0x2b, 0x64, 0x6e, 0x9a, 0x41, 0x86, 0x13, 0x2a, 0xca, - 0x65, 0x92, 0x58, 0xe6, 0x22, 0xb1, 0x17, 0xbb, 0xd8, 0x6e, 0x27, 0xca, - 0x7d, 0x0b, 0x4e, 0x35, 0xc7, 0xc0, 0xa9, 0xa1, 0x0c, 0x6c, 0xdd, 0x5d, - 0xc8, 0x15, 0x21, 0xf5, 0xed, 0x89, 0x11, 0xb2, 0x7e, 0xda, 0xc4, 0xff, - 0xad, 0x04, 0x9f, 0xc9, 0x5d, 0xc9, 0x99, 0xd5, 0x7d, 0xfd, 0x14, 0x92, - 0xed, 0xcd, 0x57, 0x32, 0x04, 0x8d, 0xc1, 0xff, 0xb7, 0x44, 0xd8, 0x4a, - 0xf8, 0x5a, 0x48, 0x0c, 0x66, 0x38, 0xbc, 0x28, 0x5f, 0x1d, 0x20, 0xd0, - 0x96, 0xf0, 0xb5, 0x0a, 0x42, 0xe3, 0x15, 0x86, 0xaa, 0xfa, 0xd8, 0x8e, - 0xd5, 0xd1, 0x80, 0xb3, 0x8f, 0x5e, 0x4b, 0x90, 0xd9, 0x59, 0x40, 0x13, - 0xb6, 0xa8, 0x4d, 0x44, 0x59, 0xa2, 0x39, 0x1a, 0x38, 0x1c, 0x38, 0xe2, - 0x53, 0x2d, 0x47, 0x05, 0xe9, 0x4e, 0x9b, 0xcf, 0x11, 0xea, 0xf9, 0x60, - 0x77, 0x94, 0xbc, 0x58, 0x76, 0xd1, 0xdd, 0x1a, 0x6c, 0xaf, 0x3b, 0xd9, - 0x48, 0x28, 0x22, 0xdd, 0xb5, 0x40, 0xf9, 0x53, 0x96, 0xe3, 0x39, 0x23, - 0x29, 0x2f, 0x36, 0x5c, 0x59, 0x18, 0x87, 0x3c, 0xaf, 0xca, 0x4c, 0xfa, - 0xa2, 0x97, 0xfa, 0x62, 0x86, 0xbe, 0x3c, 0xa9, 0xeb, 0xcd, 0x9b, 0xaf, - 0x1b, 0xa9, 0xe4, 0xf6, 0xd7, 0xda, 0x5d, 0x00, 0x89, 0x5c, 0xa1, 0xe5, - 0x25, 0xde, 0x9b, 0xd4, 0x04, 0xaf, 0x11, 0x90, 0x8a, 0x84, 0x2e, 0x1d, - 0x33, 0xca, 0xd4, 0x90, 0xb9, 0x6a, 0x5d, 0x68, 0x1a, 0xa1, 0x84, 0x8d, - 0x2b, 0xe0, 0xe9, 0x4d, 0x31, 0x63, 0x30, 0x1e, 0x92, 0x89, 0x77, 0x30, - 0x7c, 0xbb, 0x70, 0x0a, 0x00, 0x73, 0x40, 0x04, 0x89, 0xbd, 0x70, 0x74, - 0xdf, 0x19, 0x9e, 0x26, 0x15, 0x60, 0xa6, 0x8c, 0xdc, 0x11, 0xde, 0x6a, - 0x96, 0x44, 0x64, 0x21, 0x87, 0xc9, 0xf9, 0xe2, 0xf7, 0x2c, 0x30, 0xbe, - 0x06, 0xa3, 0x86, 0xba, 0x3a, 0x71, 0x88, 0x10, 0x9a, 0x03, 0xc9, 0x7a, - 0x47, 0x9c, 0x01, 0x10, 0xf9, 0xd5, 0x5c, 0x40, 0x82, 0x44, 0x61, 0xab, - 0xd5, 0xb9, 0x66, 0xca, 0x52, 0x69, 0xad, 0x13, 0x64, 0x55, 0xc8, 0xbf, - 0x3f, 0x35, 0x03, 0xc8, 0x9b, 0x97, 0x32, 0xde, 0x2f, 0x5c, 0x69, 0x00, - 0x09, 0xae, 0xa4, 0x46, 0x34, 0x98, 0x16, 0x8e, 0x5c, 0x31, 0xcc, 0x9c, - 0xc1, 0xc9, 0x8b, 0x02, 0xfe, 0x91, 0xaf, 0x40, 0xb1, 0x29, 0x0d, 0x72, - 0x35, 0xd6, 0x74, 0x53, 0xaf, 0xb3, 0x2c, 0x15, 0xa8, 0x49, 0x1d, 0x29, - 0xac, 0xd0, 0x44, 0x5b, 0x01, 0x86, 0xd0, 0xa6, 0xad, 0xd7, 0x20, 0x0c, - 0x51, 0xe8, 0x75, 0xd7, 0x47, 0x4b, 0x97, 0x03, 0x45, 0xfd, 0x2a, 0xd7, - 0x14, 0xb5, 0x60, 0xcd, 0xc8, 0x6d, 0xe8, 0x38, 0xf3, 0x82, 0xcb, 0xfd, - 0x79, 0x46, 0x07, 0x5e, 0x20, 0x67, 0x5e, 0x3e, 0x30, 0x3a, 0x30, 0x4f, - 0xe8, 0xe7, 0x63, 0xbd, 0x78, 0x23, 0x86, 0x99, 0x70, 0x9e, 0x4f, 0xc8, - 0xc3, 0x58, 0x13, 0xc4, 0xae, 0x39, 0xd5, 0x1b, 0x69, 0xda, 0x3a, 0x05, - 0x09, 0xc9, 0x4a, 0x7a, 0x34, 0x4f, 0xf4, 0x75, 0xcc, 0x34, 0x48, 0xa4, - 0x81, 0xc8, 0xac, 0x13, 0x28, 0xb1, 0x23, 0xb3, 0xb3, 0xf8, 0x65, 0xe4, - 0xd5, 0x1c, 0x37, 0x32, 0xdd, 0x2c, 0x35, 0xf9, 0x64, 0xea, 0x29, 0x96, - 0xab, 0xab, 0xae, 0x12, 0x88, 0xe7, 0xa3, 0x94, 0x6f, 0x68, 0x5a, 0x30, - 0xa9, 0x5c, 0xc5, 0xe9, 0xcc, 0x30, 0xc5, 0x6f, 0x61, 0x75, 0xef, 0x7c, - 0x3b, 0x51, 0x59, 0x81, 0xdd, 0xcc, 0xee, 0xc6, 0x14, 0xf6, 0x02, 0x7c, - 0x7c, 0x63, 0xdd, 0x44, 0x0a, 0xa6, 0x40, 0x92, 0x00, 0xad, 0x17, 0x5f, - 0x24, 0x95, 0xfa, 0x80, 0xaf, 0x48, 0xb1, 0xc5, 0x97, 0x6e, 0x4b, 0xde, - 0x23, 0x1f, 0x43, 0xb3, 0xfa, 0x74, 0xbe, 0xfa, 0x7b, 0x5d, 0x9e, 0x97, - 0xed, 0xd8, 0x1f, 0x36, 0x3b, 0xab, 0x8d, 0xac, 0x19, 0xe4, 0x79, 0xa3, - 0x15, 0x95, 0xa5, 0x2d, 0xa4, 0x0a, 0x99, 0xd5, 0x21, 0xb9, 0x29, 0x1a, - 0x38, 0x7c, 0x4a, 0x32, 0x16, 0x16, 0xfc, 0x1b, 0xed, 0xd3, 0x1f, 0x9d, - 0x1b, 0xe3, 0x62, 0x3e, 0x6d, 0x6f, 0xc2, 0xc4, 0xa7, 0x3c, 0x2d, 0x93, - 0xc2, 0x23, 0x51, 0x06, 0x36, 0x31, 0xe0, 0x7d, 0x38, 0xf6, 0x31, 0xb4, - 0xd7, 0x66, 0xe8, 0x74, 0x54, 0xf3, 0xc5, 0x23, 0xf6, 0x02, 0x5e, 0x0e, - 0x8e, 0x67, 0xd8, 0x31, 0xfd, 0x81, 0x22, 0x5a, 0xda, 0x3b, 0x27, 0x85, - 0x38, 0x03, 0xdf, 0x03, 0x5e, 0x0d, 0x66, 0xff, 0xf5, 0x72, 0xa6, 0xb0, - 0x15, 0x84, 0x03, 0x82, 0xf2, 0xc0, 0x89, 0xbe, 0xf8, 0x42, 0x01, 0xb6, - 0xfb, 0x14, 0x0c, 0x7b, 0xb0, 0x7a, 0xb6, 0x45, 0x50, 0xf2, 0x47, 0x45, - 0x0c, 0x5f, 0xca, 0x21, 0x81, 0x12, 0x9a, 0xeb, 0x98, 0xa0, 0x92, 0x99, - 0xb2, 0xd4, 0x76, 0x5c, 0x4f, 0xf3, 0xba, 0xb1, 0x4a, 0xbf, 0x40, 0x53, - 0xde, 0xbe, 0x09, 0xc1, 0x1e, 0x0c, 0x81, 0x8f, 0x3c, 0x5c, 0xe6, 0xe1, - 0x64, 0xc3, 0xeb, 0x7c, 0x6b, 0x58, 0x9b, 0x5a, 0x5a, 0x84, 0x0b, 0xa9, - 0x39, 0x41, 0x48, 0xbd, 0x37, 0xa0, 0x4d, 0xe8, 0x76, 0x9c, 0x47, 0xa3, - 0xfb, 0xc0, 0x13, 0x35, 0x08, 0x88, 0xb8, 0x63, 0x8a, 0x09, 0xd8, 0x81, - 0x0e, 0x61, 0x38, 0xbc, 0x2d, 0xff, 0x6d, 0x79, 0xef, 0x51, 0xa0, 0xc0, - 0x9a, 0xd4, 0xaf, 0x12, 0xc9, 0x0f, 0x1b, 0xd3, 0x21, 0x30, 0xd5, 0xc0, - 0xff, 0xb5, 0xb5, 0x84, 0x75, 0x31, 0xe4, 0x18, 0x31, 0xca, 0x76, 0x07, - 0x63, 0x3a, 0xb2, 0xdd, 0x7b, 0x66, 0x0d, 0x73, 0x6e, 0xfb, 0x02, 0x0d, - 0x03, 0xd5, 0x91, 0x33, 0x8e, 0xe3, 0x97, 0xa3, 0xee, 0xa4, 0xbb, 0xf5, - 0x4c, 0x39, 0xba, 0x64, 0x52, 0x37, 0x86, 0x12, 0xd0, 0x6a, 0x0a, 0xbd, - 0x5f, 0x12, 0xb1, 0xf9, 0xc9, 0x6e, 0x0e, 0x4e, 0x7f, 0xf4, 0x9c, 0x41, - 0x79, 0x35, 0xed, 0xb4, 0xb9, 0xb5, 0x55, 0x40, 0xaf, 0xb1, 0x00, 0x0a, - 0x57, 0x7d, 0x8b, 0xe8, 0xf3, 0x33, 0xe6, 0x04, 0xdb, 0x22, 0xf8, 0x38, - 0x2f, 0x13, 0x80, 0x2b, 0x27, 0xc4, 0x27, 0x4a, 0x1f, 0xf4, 0xe6, 0x9d, - 0xec, 0x3f, 0x70, 0x7e, 0x7d, 0xcc, 0x91, 0x1c, 0x6a, 0xb4, 0x10, 0x14, - 0x70, 0xfa, 0x3c, 0x63, 0xa4, 0x16, 0xd3, 0x22, 0xce, 0xbd, 0x61, 0x85, - 0x8d, 0x48, 0x8e, 0xe6, 0xe3, 0x4b, 0xf1, 0x5f, 0xf0, 0x44, 0x86, 0x19, - 0xdb, 0x69, 0x2f, 0x07, 0x70, 0x8b, 0xc5, 0xc6, 0xbb, 0x41, 0xc0, 0x12, - 0x3f, 0xb5, 0x05, 0xff, 0x5e, 0x86, 0xfe, 0x94, 0xb8, 0x93, 0xdb, 0xaf, - 0x77, 0xc2, 0xb7, 0x5a, 0x22, 0x4a, 0x55, 0x48, 0x7b, 0xd6, 0x3b, 0x7d, - 0x36, 0x77, 0xeb, 0x64, 0x49, 0xfb, 0xd6, 0x16, 0xf0, 0x2d, 0xe7, 0x6e, - 0x33, 0x77, 0x75, 0xcd, 0x7d, 0x3d, 0xb9, 0xa2, 0xd2, 0xbd, 0x5a, 0x03, - 0x89, 0xa6, 0xea, 0xda, 0xa4, 0x2e, 0x72, 0x69, 0x76, 0xf2, 0xca, 0xed, - 0x45, 0xa9, 0x44, 0x68, 0xf7, 0x30, 0x88, 0x6d, 0xdc, 0x62, 0x0f, 0xbc, - 0xdf, 0xec, 0x4c, 0xe8, 0xf8, 0x04, 0x3a, 0xf5, 0x0a, 0x03, 0xbb, 0x61, - 0xfb, 0x10, 0xe2, 0xc0, 0x7a, 0x91, 0x7f, 0xce, 0x04, 0x34, 0x1d, 0x2a, - 0xa0, 0x1a, 0x77, 0x64, 0xb7, 0xb4, 0x44, 0xfd, 0x74, 0x13, 0xf7, 0x90, - 0xda, 0x9a, 0xea, 0x52, 0xa3, 0xb3, 0xc9, 0x54, 0x6f, 0x88, 0x4c, 0x23, - 0x95, 0xd7, 0x05, 0x2c, 0x0b, 0x86, 0x68, 0x80, 0x59, 0x85, 0x80, 0x7b, - 0xb1, 0xf7, 0x8b, 0xf5, 0x16, 0xfa, 0xc5, 0x65, 0x37, 0x17, 0x9e, 0x5e, - 0x25, 0x81, 0x76, 0xfc, 0xe2, 0x4b, 0x35, 0xaf, 0xc9, 0x6d, 0xf1, 0xdc, - 0x5d, 0xb8, 0xf0, 0x3a, 0x4d, 0xb0, 0x12, 0xa1, 0x3f, 0x8f, 0x41, 0x30, - 0xe4, 0xb5, 0x52, 0x98, 0x53, 0xe4, 0x95, 0x54, 0xf9, 0x13, 0xae, 0x96, - 0x0c, 0xbf, 0x35, 0xd8, 0x5c, 0x78, 0x2e, 0xcc, 0x4e, 0x75, 0x35, 0xfc, - 0xd0, 0x96, 0x40, 0x35, 0x0d, 0x81, 0x79, 0x8e, 0xbd, 0x0b, 0x78, 0x77, - 0xc9, 0x2a, 0xf3, 0xf9, 0x0c, 0xd8, 0x76, 0x07, 0xd1, 0x70, 0x61, 0x08, - 0xd3, 0x93, 0x5c, 0xef, 0x7a, 0xdc, 0x06, 0x1a, 0xbd, 0x2c, 0xdf, 0x69, - 0x41, 0xc7, 0xc5, 0xed, 0x4c, 0x79, 0xa7, 0x4b, 0xe3, 0x05, 0x12, 0x1c, - 0x13, 0x67, 0xb4, 0x1e, 0x11, 0x38, 0xc9, 0xfd, 0xda, 0xe8, 0x20, 0x9e, - 0xb0, 0x1e, 0xb9, 0xd3, 0x80, 0x1e, 0xb6, 0xc9, 0x7b, 0xb1, 0xf1, 0x3a, - 0xae, 0xe7, 0xb6, 0x5b, 0x14, 0x54, 0x4b, 0xe2, 0x35, 0x75, 0x88, 0x54, - 0x3d, 0x2b, 0xae, 0x96, 0xea, 0x88, 0x9d, 0x6a, 0xf7, 0x41, 0xdd, 0x0b, - 0xaa, 0x99, 0xc0, 0x0c, 0xdc, 0x6c, 0xcf, 0x9c, 0xe7, 0x34, 0x0f, 0x8b, - 0xfc, 0xa9, 0x27, 0xfd, 0x38, 0x5d, 0x25, 0xbc, 0x48, 0x77, 0xc6, 0x69, - 0x99, 0xbe, 0xe5, 0x46, 0x31, 0xdc, 0x1d, 0x4c, 0xa7, 0xc8, 0xe8, 0x63, - 0x1c, 0x92, 0x77, 0x1f, 0x29, 0xf8, 0x4e, 0x43, 0x80, 0x40, 0x09, 0x1d, - 0x80, 0x85, 0xb1, 0x32, 0xc0, 0x6e, 0xca, 0xec, 0x09, 0x14, 0xdf, 0x81, - 0x69, 0xa3, 0xf2, 0x5b, 0x8d, 0x17, 0x22, 0x93, 0xe5, 0x51, 0x2d, 0x5f, - 0xbe, 0x7c, 0xf9, 0x45, 0x53, 0x21, 0x5f, 0xb2, 0xf7, 0xdd, 0x69, 0x03, - 0xc2, 0x2d, 0xa3, 0xbb, 0x75, 0x17, 0xc9, 0x2c, 0xb1, 0xd3, 0x22, 0xe4, - 0x01, 0x45, 0x82, 0x81, 0xdb, 0xa8, 0xc5, 0xcc, 0x29, 0xb7, 0x1f, 0x81, - 0x33, 0x78, 0x8a, 0x0b, 0x2a, 0x5b, 0xe8, 0xf3, 0x17, 0x5f, 0xba, 0xbb, - 0xec, 0xb6, 0xda, 0x89, 0xd1, 0x62, 0x9a, 0x63, 0x42, 0x31, 0x93, 0x12, - 0x2c, 0xc6, 0x2d, 0xb1, 0x50, 0x95, 0x89, 0x8d, 0xd3, 0x59, 0x65, 0xd9, - 0x55, 0xa8, 0xda, 0xd7, 0x4c, 0xf5, 0xd4, 0x76, 0x2c, 0x38, 0x80, 0x31, - 0x85, 0x14, 0xf8, 0x02, 0x59, 0x8e, 0xac, 0xab, 0x70, 0xc1, 0xa6, 0x3c, - 0xab, 0xe0, 0x31, 0x9c, 0x92, 0x0f, 0xd3, 0x22, 0xc8, 0x9f, 0xdf, 0xe5, - 0x43, 0xb2, 0x48, 0xb7, 0x0b, 0xf4, 0xe7, 0xb6, 0xe6, 0x6b, 0xc4, 0xa3, - 0xa9, 0x7d, 0xbf, 0x6c, 0x69, 0xca, 0xad, 0x03, 0x2c, 0xca, 0xb7, 0xcb, - 0xd4, 0x2c, 0x90, 0x1a, 0xd7, 0x51, 0xd5, 0x6c, 0xe1, 0xce, 0x90, 0x26, - 0xab, 0xcb, 0xc0, 0x14, 0x65, 0xe5, 0x58, 0xdd, 0xfe, 0x82, 0x58, 0x67, - 0x71, 0x71, 0x0f, 0x3c, 0xb1, 0xf5, 0x2e, 0x47, 0x8a, 0x68, 0xc7, 0x31, - 0x55, 0x97, 0xfa, 0x3a, 0xd8, 0x9d, 0x61, 0x91, 0x50, 0x58, 0x41, 0xc6, - 0x02, 0x0c, 0x8e, 0x37, 0xc8, 0xa2, 0x1c, 0x54, 0x13, 0x20, 0xac, 0xd7, - 0x3b, 0x2e, 0x00, 0xe3, 0xd2, 0xb6, 0xac, 0xa4, 0x67, 0xaf, 0xc5, 0x64, - 0xdb, 0xfc, 0xb1, 0xd9, 0x69, 0x15, 0x6f, 0x6b, 0xd5, 0x1c, 0x96, 0x02, - 0xed, 0x96, 0x42, 0x83, 0x8e, 0x41, 0xc9, 0x5c, 0xfa, 0xc9, 0x9d, 0x12, - 0x6f, 0x65, 0x54, 0xb2, 0xbb, 0x8d, 0x7f, 0x70, 0x8e, 0x4c, 0xd1, 0x1c, - 0xb5, 0x56, 0xb8, 0x5f, 0x34, 0x67, 0x68, 0x31, 0x0c, 0x20, 0xb3, 0x25, - 0x77, 0x8e, 0x46, 0x47, 0x20, 0xec, 0xa1, 0x7a, 0x5d, 0x8b, 0xc4, 0x8b, - 0xeb, 0xc2, 0xb1, 0x64, 0xb3, 0xe3, 0x14, 0x33, 0x86, 0x11, 0xc5, 0xa0, - 0x27, 0xfb, 0x7a, 0xb9, 0xca, 0x17, 0xba, 0x12, 0x56, 0xda, 0x8e, 0x87, - 0xd4, 0xf2, 0x69, 0x70, 0x43, 0xbc, 0x97, 0x27, 0x1c, 0x35, 0x7b, 0x6d, - 0x29, 0x6b, 0x10, 0xf3, 0xf4, 0x1e, 0xe1, 0x7f, 0xb8, 0xe3, 0x19, 0x40, - 0x21, 0xde, 0xaf, 0x9a, 0xd6, 0xcf, 0xd6, 0xa6, 0x8e, 0xad, 0x48, 0x80, - 0x76, 0x20, 0xc0, 0xdd, 0xc5, 0x01, 0x5c, 0x52, 0x66, 0xe3, 0x92, 0xb6, - 0x05, 0x42, 0x29, 0x0e, 0x72, 0xfe, 0xbd, 0x70, 0x11, 0xc2, 0xb2, 0xca, - 0x5b, 0x54, 0xdf, 0x7a, 0x8b, 0xba, 0x7d, 0x38, 0xb1, 0xa6, 0xf8, 0xf1, - 0x1e, 0x3d, 0xd0, 0xda, 0xa2, 0x85, 0x75, 0x24, 0x2a, 0x7b, 0x4c, 0x58, - 0x15, 0x24, 0xdc, 0x21, 0x33, 0xbb, 0x4e, 0x63, 0x2b, 0x4f, 0x6a, 0xca, - 0x1a, 0x2c, 0xa5, 0x99, 0xa1, 0xc4, 0x52, 0x7a, 0xdb, 0xc7, 0x94, 0x7f, - 0x1e, 0xd6, 0x30, 0x3c, 0x80, 0x00, 0x1a, 0x64, 0xa8, 0xc3, 0x25, 0x4a, - 0x81, 0x77, 0x91, 0xbf, 0xca, 0x2f, 0x4d, 0x85, 0x66, 0x1d, 0x70, 0x92, - 0x15, 0x77, 0xdc, 0x7a, 0xea, 0x4d, 0xdc, 0x96, 0xc6, 0xf0, 0xc3, 0x41, - 0xf4, 0x97, 0x1e, 0x9c, 0x68, 0x60, 0x92, 0x6f, 0x65, 0xac, 0xd2, 0x63, - 0x6e, 0x50, 0xdc, 0x26, 0xb4, 0x41, 0x04, 0x5a, 0xf4, 0x88, 0x16, 0xae, - 0xb9, 0x24, 0x3c, 0x10, 0x2e, 0x0e, 0xd3, 0x4d, 0x9a, 0x13, 0x46, 0xf5, - 0x2b, 0x04, 0xa3, 0xfa, 0xcc, 0xa4, 0xa2, 0x0c, 0xba, 0x34, 0xb6, 0x2a, - 0xcf, 0x6b, 0xbc, 0xad, 0x73, 0xdf, 0x68, 0x0c, 0x6c, 0x61, 0xc1, 0xdc, - 0x57, 0x36, 0x2c, 0x40, 0xf5, 0x52, 0x5a, 0x81, 0x48, 0x36, 0x34, 0x7b, - 0x68, 0xb6, 0x04, 0x6f, 0x70, 0x89, 0x26, 0xe3, 0x46, 0x7c, 0x43, 0x84, - 0x57, 0x4b, 0xf5, 0x3c, 0x20, 0xf3, 0xac, 0x3e, 0xbd, 0xd0, 0x9d, 0x87, - 0x12, 0x45, 0xf7, 0x5a, 0x06, 0xe6, 0x3e, 0x2b, 0xe5, 0xe1, 0x1a, 0x50, - 0xc4, 0xaa, 0x2d, 0x0a, 0x29, 0xb2, 0x98, 0xa0, 0x64, 0xd9, 0x0f, 0x3a, - 0xbf, 0xd9, 0xda, 0xf9, 0x6e, 0xf6, 0xcb, 0xb6, 0x85, 0x96, 0x65, 0xc1, - 0xcb, 0xae, 0xd8, 0xe9, 0xe5, 0x7a, 0x6e, 0xf9, 0x29, 0x84, 0x32, 0x77, - 0xae, 0x2d, 0x0d, 0x7b, 0x44, 0x84, 0x50, 0xdd, 0x9d, 0x05, 0xf0, 0x6a, - 0x19, 0xf1, 0x4d, 0x33, 0x9d, 0xcb, 0x35, 0x0e, 0xaa, 0x4a, 0xf3, 0x86, - 0xe0, 0xa9, 0xc2, 0x0f, 0x81, 0x01, 0xb0, 0xc8, 0x55, 0x11, 0x8e, 0xed, - 0x40, 0x47, 0x0e, 0x2b, 0x9f, 0xba, 0x77, 0x00, 0x77, 0xe1, 0xf5, 0x09, - 0x6f, 0xc5, 0x41, 0xc5, 0x54, 0xa2, 0x32, 0x30, 0xd3, 0x23, 0x27, 0x7b, - 0x6e, 0x56, 0xed, 0xb5, 0x92, 0x7d, 0x4d, 0xb7, 0xf6, 0x6d, 0x75, 0x90, - 0x43, 0xf9, 0xbc, 0x91, 0xf8, 0x4a, 0x9f, 0xd6, 0x25, 0x32, 0x62, 0x63, - 0x4a, 0xbe, 0x2d, 0xd1, 0x1b, 0x38, 0xa8, 0x78, 0x30, 0xf7, 0x59, 0x46, - 0x34, 0x30, 0x95, 0xab, 0x4d, 0xb5, 0x2d, 0x9b, 0xa7, 0xee, 0x85, 0xbc, - 0x73, 0x94, 0x21, 0x65, 0xa5, 0xd5, 0xf4, 0xc0, 0xa4, 0x24, 0x50, 0x44, - 0xa8, 0x2a, 0x9e, 0xba, 0xac, 0x26, 0xae, 0xb0, 0x47, 0x97, 0xa1, 0x29, - 0x4f, 0xb1, 0x69, 0xcf, 0xbe, 0xb9, 0x2b, 0xaf, 0xd2, 0x5b, 0x31, 0x15, - 0x5c, 0x75, 0xed, 0xac, 0x3b, 0xf2, 0x8f, 0x72, 0x6c, 0x66, 0x47, 0x97, - 0x18, 0xc3, 0x76, 0x53, 0xc0, 0x3e, 0xe6, 0x0b, 0x05, 0x5f, 0x7f, 0xe0, - 0x5a, 0x64, 0x6b, 0x32, 0x26, 0xb2, 0xab, 0x06, 0xf0, 0x0b, 0x68, 0xcc, - 0xe9, 0x4e, 0x9e, 0x02, 0x3d, 0xfa, 0x0e, 0xa8, 0x1d, 0xc0, 0x1a, 0xdc, - 0xde, 0xae, 0xa6, 0x60, 0xa9, 0x67, 0x3d, 0x9c, 0xf6, 0x8e, 0x68, 0x89, - 0x48, 0xde, 0x74, 0x1c, 0x9c, 0xee, 0x91, 0x11, 0x8a, 0xee, 0x61, 0x23, - 0xff, 0x66, 0x4b, 0xf3, 0xf7, 0xc1, 0x6b, 0x9d, 0x15, 0x84, 0xd9, 0x9e, - 0xc5, 0x6a, 0x62, 0x73, 0xaf, 0x67, 0x09, 0x91, 0xff, 0x7f, 0x37, 0xcd, - 0x03, 0x98, 0x3b, 0x84, 0xa9, 0xe5, 0x0f, 0xca, 0x51, 0xe2, 0x76, 0x4c, - 0x18, 0xd9, 0xf6, 0x82, 0x5b, 0xa7, 0xe0, 0xff, 0x7d, 0xa2, 0x6b, 0x51, - 0x40, 0x3a, 0xc4, 0x76, 0xb6, 0xb9, 0x10, 0x55, 0x17, 0x03, 0x31, 0x75, - 0xe5, 0x15, 0xb6, 0x33, 0xf1, 0xd6, 0xb7, 0xa2, 0x75, 0x62, 0xe3, 0x50, - 0xb2, 0xd8, 0x43, 0x9e, 0x5b, 0xbf, 0x7f, 0x6c, 0x7b, 0x38, 0x84, 0x0a, - 0x3a, 0x96, 0x61, 0x7e, 0x3a, 0x18, 0xca, 0x09, 0x79, 0xf5, 0x3e, 0xfe, - 0x4e, 0x36, 0x69, 0xf8, 0x8b, 0x2d, 0x1a, 0x18, 0x32, 0x90, 0x77, 0xc7, - 0xf1, 0x00, 0x57, 0x3f, 0x65, 0x28, 0xb3, 0x18, 0x2c, 0x4e, 0x80, 0x66, - 0x87, 0xb6, 0xdd, 0x21, 0x75, 0xe4, 0xb4, 0x9d, 0xba, 0x6c, 0x13, 0x67, - 0x8a, 0x70, 0xd5, 0x7d, 0xf2, 0x61, 0x11, 0xdf, 0xdd, 0x7d, 0x16, 0x2c, - 0xff, 0x0f, 0xa7, 0xa2, 0x7f, 0xb7, 0xd9, 0xe5, 0xb1, 0x5d, 0xb9, 0x8f, - 0xae, 0x5b, 0xc3, 0x77, 0xb6, 0x03, 0x1e, 0xa6, 0x45, 0x18, 0x9d, 0x56, - 0x9e, 0xc1, 0x6b, 0xac, 0xe0, 0x14, 0xf0, 0xcf, 0x1a, 0xa4, 0x3d, 0xd8, - 0xc0, 0x8c, 0x20, 0x40, 0x93, 0xc6, 0x67, 0x86, 0x1e, 0x71, 0x97, 0xe5, - 0x03, 0x0a, 0xf3, 0xd2, 0xb8, 0xc2, 0x5e, 0xa6, 0x09, 0xa5, 0x08, 0xf7, - 0x5e, 0xbb, 0x0c, 0xb5, 0xd5, 0x9d, 0xc0, 0x48, 0x4c, 0x1d, 0x9b, 0xb1, - 0x23, 0xc1, 0x51, 0xd9, 0x54, 0xb6, 0x4b, 0xfa, 0x8d, 0x4f, 0x65, 0x31, - 0x7b, 0xa8, 0x32, 0x1b, 0x7d, 0x16, 0xc7, 0x89, 0x60, 0xfa, 0xbc, 0x2e, - 0x76, 0xfa, 0xf6, 0x21, 0xc2, 0xbc, 0x70, 0x64, 0x62, 0x01, 0xe1, 0x66, - 0xcb, 0x15, 0x3e, 0x96, 0x83, 0xe7, 0xe1, 0xb6, 0x9d, 0x9c, 0x41, 0x4f, - 0xb3, 0x67, 0xe7, 0x82, 0x74, 0x34, 0xb0, 0x8f, 0x6c, 0x20, 0x0c, 0x9a, - 0x76, 0xed, 0x0d, 0x63, 0xa5, 0x33, 0x06, 0x03, 0xdb, 0x5c, 0x6f, 0x74, - 0xea, 0xad, 0xa3, 0x7c, 0x7a, 0x76, 0xa1, 0x0e, 0xe3, 0xfe, 0xfa, 0x07, - 0xcc, 0xc6, 0x1b, 0xd7, 0x3c, 0x63, 0xeb, 0x00, 0xc0, 0x44, 0xee, 0x7c, - 0xd2, 0x6b, 0x83, 0x5c, 0xc5, 0x10, 0xb9, 0xb1, 0xbd, 0xf7, 0x89, 0x6d, - 0x03, 0x39, 0xe0, 0x8c, 0x62, 0x54, 0x57, 0x9b, 0x45, 0x5a, 0x39, 0x24, - 0xc7, 0x84, 0x5b, 0x95, 0xfc, 0xc9, 0x53, 0x8e, 0x75, 0xce, 0x04, 0xba, - 0xc7, 0x54, 0xa0, 0xe6, 0x58, 0xf3, 0x4c, 0x1a, 0xe0, 0x4d, 0x64, 0x64, - 0xe7, 0xf0, 0x35, 0x3e, 0xe7, 0x10, 0x9b, 0xde, 0x23, 0x84, 0x2e, 0x82, - 0x19, 0x84, 0x30, 0xc1, 0x10, 0x8c, 0xee, 0xd7, 0xd8, 0x59, 0x66, 0x3d, - 0x9f, 0xf7, 0x9a, 0x73, 0x68, 0xd7, 0xb8, 0x34, 0x88, 0x8a, 0x21, 0xfe, - 0x4f, 0xad, 0xe0, 0x34, 0x34, 0x8b, 0x87, 0x61, 0x90, 0xed, 0xb4, 0xb7, - 0x37, 0xbb, 0xb8, 0x21, 0x27, 0x76, 0x23, 0x30, 0x5c, 0x34, 0xbb, 0xa0, - 0x9a, 0xaa, 0x66, 0x5a, 0x6a, 0x03, 0x9e, 0xf7, 0xe0, 0x00, 0x8a, 0xbc, - 0xd8, 0xf2, 0x85, 0x2a, 0xdd, 0x3a, 0xbe, 0xe5, 0x82, 0x04, 0x1b, 0x90, - 0x58, 0x6c, 0x0d, 0x8f, 0x05, 0x3e, 0xd7, 0x76, 0x47, 0xe9, 0x71, 0x02, - 0xda, 0x65, 0xfb, 0xb0, 0x7b, 0xaa, 0x91, 0x2e, 0x6f, 0xdf, 0x34, 0xe0, - 0xbd, 0xfe, 0x3a, 0xcb, 0x2a, 0x73, 0xfc, 0xe1, 0xee, 0x03, 0x6a, 0x8b, - 0x78, 0x24, 0x6a, 0x3f, 0x24, 0xd3, 0xc4, 0xcc, 0x8b, 0x05, 0x55, 0x03, - 0x74, 0xa0, 0x80, 0xf1, 0x58, 0xbe, 0x97, 0x15, 0x4d, 0x55, 0x38, 0x79, - 0xa1, 0xa9, 0x90, 0x7a, 0x15, 0x50, 0xfd, 0x3d, 0x14, 0x08, 0x8a, 0xf9, - 0x88, 0x3e, 0xef, 0xf3, 0x16, 0x15, 0xd7, 0xb0, 0x82, 0xb6, 0xf6, 0xaf, - 0xbc, 0xeb, 0xef, 0x75, 0x96, 0x1f, 0x6e, 0x93, 0xbf, 0xc9, 0x7a, 0x6b, - 0x09, 0x60, 0x5f, 0x53, 0xec, 0x72, 0x97, 0x0c, 0x2d, 0xb1, 0x69, 0xf8, - 0x7a, 0x91, 0x0f, 0xe8, 0x30, 0x09, 0x7d, 0xb0, 0x18, 0x76, 0x7e, 0x17, - 0xcd, 0xdc, 0xe1, 0xfe, 0xba, 0xbf, 0xc5, 0x71, 0xf5, 0x76, 0x96, 0x13, - 0x35, 0x2a, 0xd6, 0x07, 0x1c, 0xa6, 0x5c, 0xd5, 0x85, 0xad, 0xca, 0x41, - 0x94, 0x6b, 0x22, 0x52, 0x4b, 0xda, 0x27, 0x1d, 0x24, 0x39, 0x76, 0x7d, - 0x49, 0xb4, 0x88, 0x39, 0x8f, 0xc1, 0x6a, 0x59, 0x3e, 0x6c, 0x5f, 0x20, - 0x42, 0x95, 0x87, 0xfb, 0x45, 0x0b, 0xa4, 0x31, 0xed, 0xdd, 0x08, 0xad, - 0xbd, 0x3b, 0xb8, 0x89, 0xb8, 0x50, 0xe5, 0xb6, 0x4b, 0x19, 0x96, 0xe9, - 0x1e, 0x8b, 0x3a, 0xc4, 0x07, 0x84, 0xb3, 0x68, 0x48, 0x38, 0x6e, 0x80, - 0x9b, 0x33, 0x7f, 0x7e, 0xc1, 0xe4, 0x44, 0xf4, 0x06, 0xbc, 0xa9, 0x89, - 0x58, 0x13, 0x8d, 0xab, 0x1d, 0x6f, 0x7d, 0x5e, 0x4b, 0x9c, 0x69, 0x96, - 0xbc, 0xb6, 0xc5, 0x1f, 0xac, 0x99, 0xf7, 0x36, 0x57, 0xca, 0x7f, 0x94, - 0xa7, 0x5d, 0x01, 0xa7, 0x9b, 0x9d, 0x87, 0x64, 0xcf, 0xe5, 0x18, 0x37, - 0x3b, 0x08, 0xb6, 0x3f, 0x14, 0x99, 0x08, 0x8f, 0x5a, 0xba, 0x79, 0x5b, - 0x57, 0x6c, 0xcd, 0x14, 0xde, 0x9a, 0x07, 0x08, 0xee, 0xe9, 0x59, 0xdd, - 0xf1, 0x2f, 0xb6, 0x44, 0xed, 0xaf, 0x49, 0xfb, 0x31, 0x25, 0x2b, 0x6d, - 0x6e, 0xaf, 0xf2, 0x21, 0x9f, 0x0e, 0x2d, 0xe1, 0x8d, 0x29, 0x6d, 0x37, - 0x07, 0xc8, 0x68, 0xf5, 0x82, 0x48, 0xdf, 0xb6, 0xa0, 0x40, 0x99, 0x12, - 0x7f, 0x03, 0xea, 0x13, 0xa3, 0x7a, 0x2c, 0x71, 0x43, 0x8d, 0xf2, 0xf8, - 0x31, 0x57, 0x08, 0x3c, 0xad, 0x4a, 0xc7, 0x30, 0x80, 0x19, 0x9b, 0x40, - 0x0d, 0x4d, 0x53, 0xaf, 0x0c, 0x2b, 0x61, 0x96, 0x1f, 0xab, 0x0f, 0x81, - 0x4a, 0x86, 0xe9, 0xb5, 0x6d, 0x05, 0x05, 0x31, 0x73, 0x28, 0x02, 0xa3, - 0x79, 0x6e, 0x60, 0x52, 0x1c, 0x4e, 0x0a, 0xd0, 0x1d, 0x0e, 0xf6, 0x07, - 0xc0, 0xef, 0x21, 0x71, 0x68, 0xf7, 0xa2, 0xb7, 0x85, 0x0a, 0x85, 0x41, - 0x3e, 0xf6, 0x08, 0x6d, 0x16, 0x3a, 0x90, 0x0e, 0x1b, 0x03, 0xcb, 0x3b, - 0x78, 0x62, 0xa8, 0x3d, 0x77, 0xf2, 0x2e, 0xb0, 0xdc, 0xa6, 0x2b, 0xa4, - 0x9e, 0x1d, 0x23, 0x46, 0xd5, 0xb2, 0x5c, 0xba, 0x2d, 0x8d, 0x17, 0xfe, - 0x6c, 0x0a, 0x05, 0xac, 0xa5, 0x71, 0x22, 0x5d, 0x96, 0xad, 0x22, 0xf0, - 0x62, 0x83, 0x46, 0x28, 0x65, 0xd6, 0x95, 0x82, 0xb0, 0x79, 0x29, 0x4b, - 0xeb, 0x38, 0x0c, 0x90, 0x9d, 0xbe, 0x64, 0x78, 0x64, 0xe6, 0x55, 0xd6, - 0x46, 0x7d, 0x49, 0xe9, 0xbb, 0x2d, 0x10, 0x2c, 0x83, 0x0a, 0x32, 0x70, - 0xd8, 0x6f, 0xcb, 0xaa, 0xef, 0xb0, 0x0c, 0x3a, 0x04, 0x54, 0x21, 0x6a, - 0x1d, 0xac, 0x41, 0x35, 0x01, 0x79, 0xad, 0x14, 0x32, 0x1b, 0x38, 0x62, - 0x86, 0xf1, 0xbc, 0x7e, 0x0b, 0x79, 0x4b, 0xff, 0xa1, 0x24, 0x16, 0x46, - 0xfe, 0x9a, 0xba, 0x80, 0x21, 0xc1, 0x39, 0xef, 0xe3, 0xca, 0xf3, 0x42, - 0x6c, 0xd6, 0xf8, 0xd8, 0xe0, 0xfd, 0xea, 0x89, 0xfa, 0xb7, 0xed, 0x10, - 0x90, 0x32, 0x5a, 0x8d, 0x22, 0x33, 0x1e, 0xf3, 0x61, 0x77, 0xed, 0x0d, - 0x57, 0x19, 0x63, 0x5a, 0x4a, 0x05, 0xfc, 0x26, 0x66, 0x8f, 0x00, 0x09, - 0xbd, 0x4b, 0xee, 0x7a, 0xee, 0x38, 0x29, 0x6d, 0x79, 0x8f, 0x02, 0x49, - 0xd0, 0x88, 0xb5, 0x9c, 0x2b, 0x64, 0xa4, 0x84, 0xbb, 0xa5, 0xec, 0x78, - 0x6d, 0xef, 0xa7, 0xf2, 0xfd, 0xda, 0x04, 0x79, 0x42, 0x87, 0xad, 0xd1, - 0x7d, 0x3e, 0xe4, 0xa3, 0xdc, 0xf6, 0xdc, 0xf9, 0x2a, 0x54, 0xd1, 0x20, - 0xc4, 0x4c, 0x93, 0x5b, 0xc7, 0x6e, 0xce, 0x99, 0x91, 0x08, 0xdf, 0x06, - 0xdb, 0xf3, 0x50, 0x92, 0x08, 0x28, 0xa4, 0xd4, 0x11, 0x00, 0x5c, 0xb9, - 0xbe, 0x72, 0x26, 0xb6, 0x07, 0x31, 0x61, 0xcc, 0x6b, 0xdd, 0xd3, 0xe4, - 0x22, 0x92, 0x2b, 0x9b, 0xdc, 0x6b, 0xda, 0x81, 0x2e, 0x49, 0x13, 0x5b, - 0xcf, 0xca, 0x3a, 0x44, 0x1d, 0x28, 0x99, 0x27, 0x7a, 0xb7, 0x91, 0xd3, - 0xf7, 0x2a, 0x5d, 0x49, 0x80, 0x01, 0xfa, 0x7a, 0x8b, 0x7b, 0x4e, 0x65, - 0x04, 0x9e, 0x59, 0x1e, 0xa0, 0xd2, 0x22, 0x3e, 0x29, 0xc4, 0x67, 0x8f, - 0x47, 0xcb, 0x8b, 0x3e, 0x94, 0x83, 0x88, 0x6d, 0x12, 0x78, 0x84, 0x59, - 0x3a, 0xe1, 0xeb, 0x67, 0x87, 0x64, 0xe2, 0x35, 0x14, 0xae, 0x52, 0x74, - 0x80, 0x5c, 0x2f, 0x9c, 0x03, 0xb2, 0x29, 0xa1, 0x65, 0xbe, 0x17, 0x4d, - 0x3a, 0xc8, 0xf1, 0x0d, 0x15, 0xd6, 0x8c, 0x29, 0x60, 0xcb, 0x49, 0x43, - 0x98, 0x66, 0xdb, 0xe0, 0x20, 0xc5, 0x34, 0xfe, 0x15, 0x21, 0x69, 0x27, - 0xe6, 0x24, 0x70, 0x1a, 0xb6, 0x07, 0x3f, 0xb8, 0xc6, 0x98, 0xc0, 0xc2, - 0xdb, 0xa5, 0x80, 0x64, 0x04, 0xea, 0x56, 0xe6, 0x7f, 0x5a, 0x9a, 0xa7, - 0x52, 0x4f, 0x90, 0x79, 0xf9, 0x31, 0x41, 0x64, 0xc2, 0xd7, 0x03, 0x9b, - 0x88, 0xdb, 0x4d, 0xe2, 0xb8, 0xf1, 0x67, 0x5c, 0x97, 0x72, 0xd1, 0xb1, - 0x18, 0x99, 0xa2, 0x54, 0x68, 0x75, 0xeb, 0x40, 0xb1, 0x6a, 0xf0, 0xdb, - 0xe4, 0x2b, 0x68, 0xb6, 0x71, 0x10, 0x48, 0xe4, 0x0a, 0x94, 0x9d, 0x6a, - 0x2f, 0x80, 0xf2, 0x4a, 0x4f, 0x6a, 0xa9, 0xdd, 0x45, 0x7d, 0x39, 0xd8, - 0xc7, 0xe6, 0x94, 0x7f, 0x38, 0xa9, 0xf7, 0x73, 0x2b, 0x16, 0xed, 0x1a, - 0x7b, 0x4e, 0xac, 0x90, 0x87, 0xfa, 0xd7, 0x92, 0xbc, 0xf8, 0xff, 0xdb, - 0xfb, 0x9a, 0x26, 0xc9, 0x71, 0xe4, 0xca, 0xbf, 0x52, 0x16, 0x5b, 0x87, - 0x0e, 0xb3, 0xc8, 0x59, 0xe2, 0x1b, 0x3c, 0x95, 0xed, 0xce, 0x8e, 0xa4, - 0x91, 0x4c, 0xad, 0x9e, 0xee, 0x9e, 0x6e, 0x4d, 0x47, 0xc5, 0x71, 0x0f, - 0xba, 0xcc, 0x5e, 0x74, 0x58, 0xb3, 0x65, 0xe9, 0xb7, 0x2f, 0xfc, 0x03, - 0x20, 0x83, 0x74, 0x67, 0x30, 0x22, 0x32, 0xb3, 0x22, 0x3b, 0x4b, 0x66, - 0xa3, 0xae, 0xaa, 0x20, 0x41, 0x90, 0x80, 0x03, 0x0e, 0xf7, 0xe7, 0xef, - 0xd9, 0x2c, 0x86, 0x6b, 0x58, 0x5d, 0x81, 0xe0, 0x01, 0x70, 0x68, 0x08, - 0xf9, 0xa4, 0xc3, 0xe0, 0xe2, 0xab, 0x07, 0x39, 0x1f, 0xf9, 0x1e, 0x18, - 0xd8, 0x43, 0x0e, 0x37, 0xc4, 0x66, 0xda, 0xd8, 0x0b, 0x41, 0xd8, 0xf7, - 0x66, 0x1c, 0xa2, 0xa4, 0xf8, 0xb1, 0x6e, 0x89, 0x37, 0x33, 0xfc, 0x46, - 0x22, 0x25, 0x44, 0x07, 0x10, 0xd9, 0xf8, 0x42, 0x2c, 0xd3, 0x3b, 0xd0, - 0x71, 0xde, 0x42, 0x78, 0x93, 0xcf, 0xf3, 0xce, 0x95, 0x7f, 0x77, 0x3e, - 0x33, 0xd6, 0xac, 0x38, 0xc0, 0x21, 0xe0, 0x09, 0x0e, 0x4c, 0x23, 0x7a, - 0x54, 0xaa, 0xb3, 0xe5, 0xc8, 0x96, 0x49, 0x76, 0x09, 0x2e, 0x2e, 0xa6, - 0x96, 0x87, 0x3e, 0xf7, 0x2b, 0x98, 0x30, 0x49, 0x44, 0x97, 0x7a, 0xfb, - 0x66, 0x3b, 0xfa, 0x8d, 0x30, 0xf8, 0x86, 0x15, 0xe2, 0x87, 0x6d, 0x84, - 0xc1, 0xe6, 0x4e, 0xcb, 0x6d, 0xa3, 0xf9, 0x76, 0xd8, 0x82, 0xff, 0xf5, - 0x2f, 0xcf, 0x0e, 0x54, 0xe3, 0x28, 0x1b, 0x14, 0xef, 0x83, 0x07, 0xd2, - 0x81, 0x3f, 0x5d, 0xc5, 0xe8, 0x28, 0xc4, 0x55, 0x03, 0x29, 0x43, 0xee, - 0x8b, 0x97, 0x8d, 0x51, 0x3c, 0xcd, 0x34, 0x4a, 0x73, 0x4e, 0xc0, 0x9d, - 0xed, 0x62, 0xcf, 0x55, 0x73, 0xb5, 0x80, 0xa5, 0x85, 0x7a, 0xa8, 0x22, - 0x4b, 0x35, 0xb5, 0x3e, 0xda, 0x6f, 0x38, 0xb6, 0xa9, 0x6d, 0xfc, 0x05, - 0x70, 0x6c, 0x57, 0xab, 0x7c, 0xcc, 0x0e, 0xd7, 0x97, 0x12, 0x0e, 0xdc, - 0xde, 0xfb, 0x73, 0x3a, 0x45, 0x2a, 0x4d, 0x2a, 0xe9, 0xbb, 0xd1, 0xeb, - 0xb4, 0xa1, 0x56, 0x08, 0x94, 0x73, 0x30, 0x81, 0x49, 0xe2, 0x17, 0xc0, - 0xd7, 0x98, 0x27, 0x9d, 0xf8, 0xc8, 0x05, 0x71, 0xf5, 0x47, 0x59, 0xad, - 0x29, 0x3f, 0x91, 0x28, 0x94, 0x23, 0xef, 0x1c, 0x57, 0xe7, 0xff, 0x1f, - 0x6e, 0xee, 0xdf, 0x66, 0x2f, 0x40, 0x67, 0x69, 0x65, 0x4a, 0x1d, 0xf1, - 0xb6, 0xd1, 0xdb, 0xe4, 0x41, 0xdf, 0x6a, 0x34, 0xef, 0xcc, 0x52, 0x64, - 0x6a, 0xc9, 0xfb, 0x3d, 0xd0, 0xe8, 0x7d, 0x6f, 0xd4, 0xed, 0x00, 0x7f, - 0x95, 0x71, 0x34, 0x62, 0x4b, 0x0d, 0x4b, 0xa7, 0xb6, 0xb6, 0x11, 0x37, - 0xfa, 0xcd, 0x8f, 0xbb, 0xc1, 0xf6, 0x7e, 0x7a, 0x65, 0xe1, 0x87, 0x32, - 0xa0, 0x6f, 0xc8, 0x95, 0x93, 0xb9, 0x2a, 0x81, 0xaf, 0xf6, 0x76, 0xcc, - 0x4a, 0x05, 0xac, 0x1c, 0x4d, 0x93, 0x93, 0x36, 0x54, 0xf1, 0x0e, 0xd2, - 0xd9, 0xad, 0x18, 0x4c, 0xb3, 0x08, 0x6b, 0xa4, 0xaa, 0x01, 0x88, 0x9c, - 0x20, 0x42, 0xdb, 0x74, 0xc3, 0x31, 0x8d, 0xa9, 0xb7, 0x9a, 0x1c, 0x34, - 0x48, 0xc1, 0xe4, 0x40, 0xb1, 0xb1, 0x47, 0xda, 0x66, 0x4c, 0x76, 0x92, - 0x0c, 0x37, 0xb8, 0x8c, 0x69, 0x7f, 0x59, 0x7f, 0xba, 0x2f, 0x9e, 0x9e, - 0xf0, 0x64, 0xe0, 0x82, 0xad, 0x78, 0x71, 0x8d, 0x0c, 0x56, 0x82, 0xb2, - 0x06, 0xfe, 0x0e, 0xa8, 0xe2, 0x9e, 0x06, 0xef, 0xf6, 0x63, 0x2d, 0x23, - 0x56, 0x2e, 0x41, 0xb4, 0x38, 0x72, 0x7a, 0x95, 0x83, 0x75, 0x1d, 0xc9, - 0xd6, 0x6b, 0x59, 0xd4, 0x62, 0x0f, 0x0e, 0x1e, 0xf5, 0x95, 0x8a, 0x86, - 0x5c, 0x08, 0x9d, 0xf6, 0x11, 0xe0, 0xb7, 0x06, 0x45, 0x05, 0xf6, 0xcc, - 0xf0, 0xb2, 0x0c, 0xb2, 0xa0, 0xb1, 0x95, 0xb4, 0xce, 0xc0, 0x6f, 0x53, - 0x31, 0xd9, 0x9b, 0x6d, 0xfa, 0x6c, 0x3c, 0x75, 0x8e, 0xbf, 0xd0, 0xb5, - 0x32, 0xd3, 0xbb, 0x4d, 0x52, 0x21, 0x89, 0xbc, 0x5b, 0x59, 0x8d, 0xd9, - 0xd8, 0x3c, 0xe1, 0x57, 0x58, 0x51, 0x1e, 0x18, 0x42, 0x9e, 0x62, 0x55, - 0x47, 0x45, 0x05, 0x16, 0xae, 0x78, 0xb0, 0x47, 0xaa, 0xed, 0x43, 0x4a, - 0x06, 0x2c, 0xd2, 0xf7, 0xc9, 0x8c, 0x33, 0x18, 0xcd, 0xcb, 0xa3, 0x94, - 0xe9, 0xaa, 0x44, 0x8b, 0x8c, 0xea, 0x24, 0xf4, 0x5a, 0xdf, 0xd0, 0x29, - 0x18, 0x4c, 0x47, 0x1e, 0xb7, 0xcf, 0x08, 0x72, 0x43, 0xe8, 0x66, 0x4f, - 0x19, 0xf7, 0xc9, 0x03, 0x11, 0x90, 0x5a, 0x53, 0x2e, 0xfe, 0xc8, 0x5c, - 0x46, 0x24, 0x7a, 0x8a, 0xc9, 0x97, 0xa7, 0x75, 0xc5, 0x89, 0x60, 0xc3, - 0x16, 0x2a, 0x47, 0xd0, 0x63, 0x58, 0x33, 0xf6, 0x45, 0x36, 0x7a, 0x51, - 0xe0, 0xa1, 0xba, 0xb9, 0x4e, 0xa8, 0x04, 0xff, 0x4a, 0x52, 0x2c, 0x3b, - 0x44, 0xda, 0x74, 0xf4, 0x99, 0x55, 0xab, 0x16, 0x38, 0x23, 0x13, 0x4f, - 0xd3, 0x83, 0x75, 0x50, 0xcb, 0x84, 0x90, 0x18, 0xc4, 0x99, 0x80, 0x6b, - 0xb2, 0x46, 0x4c, 0xba, 0xeb, 0x6c, 0x5d, 0x0f, 0xce, 0x5c, 0xdc, 0x09, - 0x94, 0x42, 0x4c, 0x6f, 0xf0, 0x25, 0x53, 0x7c, 0x5b, 0xd0, 0x62, 0xb0, - 0x40, 0x22, 0xf2, 0x20, 0xf2, 0x2a, 0xaf, 0xf3, 0x44, 0x18, 0x0b, 0x99, - 0x32, 0xcf, 0xa1, 0x90, 0x31, 0x2d, 0x1a, 0x3d, 0xc1, 0x68, 0xaa, 0xc6, - 0xef, 0x40, 0x0e, 0xd7, 0x65, 0x16, 0xd9, 0xb4, 0xc0, 0x9e, 0x20, 0x1b, - 0x35, 0x43, 0x6b, 0x1c, 0xb1, 0xd9, 0x04, 0x58, 0x3f, 0x30, 0xb6, 0x02, - 0xec, 0x47, 0x9d, 0x05, 0xb5, 0x56, 0x14, 0x78, 0xf2, 0x58, 0x09, 0x9b, - 0xe9, 0x9f, 0xc0, 0xa2, 0x3b, 0x7d, 0xa5, 0x88, 0xe9, 0xb2, 0x5d, 0xc1, - 0x52, 0x14, 0x01, 0x08, 0x56, 0x8c, 0xde, 0x55, 0xdd, 0x47, 0x30, 0xff, - 0x75, 0xc0, 0x6b, 0x4a, 0x17, 0x8d, 0x6e, 0xa3, 0xfc, 0xf1, 0xb4, 0x85, - 0xc5, 0x87, 0xe9, 0xf5, 0x26, 0xfa, 0x6d, 0x4d, 0xbc, 0x96, 0xe9, 0x6f, - 0xbe, 0x07, 0xa6, 0xd6, 0xa1, 0x8f, 0xcd, 0xcc, 0x4d, 0xbf, 0x6e, 0xdf, - 0x0b, 0xf3, 0x96, 0xcc, 0x94, 0xe9, 0x7a, 0xc8, 0xa7, 0x62, 0x4e, 0xce, - 0x11, 0xab, 0xbf, 0xbf, 0xa4, 0xc2, 0x24, 0x24, 0x71, 0xcb, 0xdc, 0x2a, - 0x8f, 0x7e, 0x0c, 0xab, 0xdf, 0xf9, 0x63, 0x17, 0x4e, 0xaa, 0x9b, 0xe4, - 0x95, 0xed, 0xe3, 0xee, 0x35, 0xe0, 0x57, 0x45, 0x80, 0xde, 0x4c, 0x30, - 0xa6, 0x65, 0x99, 0x4e, 0xf9, 0x0c, 0xc5, 0x7d, 0xab, 0xa0, 0x5b, 0x95, - 0x36, 0x34, 0x93, 0xb6, 0xa4, 0xfd, 0x4e, 0x66, 0x0b, 0x83, 0x06, 0x8c, - 0x21, 0x35, 0x15, 0x92, 0x52, 0x19, 0xfa, 0xb6, 0x0d, 0xad, 0xb1, 0x0a, - 0x9d, 0x9b, 0xcf, 0xa3, 0xeb, 0x98, 0xbc, 0x9e, 0x95, 0xfe, 0x0a, 0x25, - 0x92, 0xcf, 0x80, 0x84, 0x5b, 0x82, 0xd2, 0x04, 0x00, 0xdc, 0x74, 0xab, - 0xbe, 0x4a, 0x68, 0xe5, 0xca, 0x00, 0x30, 0x00, 0x14, 0xd2, 0xfb, 0xc5, - 0x1e, 0xfc, 0xfb, 0xaa, 0x02, 0x1a, 0xc0, 0xa7, 0xb6, 0x84, 0xb7, 0x80, - 0xf8, 0x5d, 0x39, 0x10, 0x00, 0x33, 0x4f, 0x18, 0x32, 0x51, 0x81, 0x66, - 0xe4, 0x7f, 0xb7, 0xb4, 0xb1, 0x1b, 0xa0, 0xea, 0x30, 0xc4, 0x7c, 0x08, - 0x67, 0x76, 0x16, 0x43, 0x43, 0x72, 0x96, 0xc4, 0x02, 0x59, 0x00, 0x39, - 0x60, 0x01, 0xc7, 0xa3, 0x8f, 0xa9, 0x15, 0xb2, 0x21, 0xf9, 0x0f, 0x00, - 0xe3, 0x43, 0x3e, 0x51, 0x1b, 0x89, 0xd4, 0xd4, 0x7a, 0x3a, 0xda, 0x92, - 0x02, 0x02, 0xde, 0xfb, 0x44, 0x17, 0x3e, 0x45, 0xbe, 0xf0, 0xe8, 0x40, - 0xf4, 0x9d, 0xb0, 0xd8, 0xf8, 0xd8, 0x9e, 0xd0, 0xd8, 0xf0, 0x38, 0x3a, - 0x88, 0x00, 0xb1, 0x38, 0x3d, 0x81, 0x1c, 0x0e, 0xc3, 0xf0, 0x6e, 0x0a, - 0x4a, 0x63, 0x23, 0x10, 0xd4, 0x76, 0xd8, 0xc1, 0x48, 0x95, 0x76, 0xb5, - 0x0b, 0x28, 0x2c, 0x89, 0x3b, 0x0e, 0x83, 0xc0, 0x89, 0x50, 0x08, 0x77, - 0x21, 0xba, 0xd5, 0xd2, 0xc3, 0xc3, 0xb1, 0x0a, 0xf9, 0xe2, 0xd1, 0x08, - 0x9e, 0x08, 0xaf, 0x97, 0xbf, 0x63, 0x81, 0xb8, 0x98, 0xf9, 0xc3, 0xc4, - 0x89, 0x1e, 0x07, 0x3e, 0x2c, 0xd6, 0x67, 0xb9, 0xc4, 0x72, 0xf2, 0x3e, - 0x55, 0xde, 0x69, 0x83, 0xfe, 0x18, 0x3f, 0xc5, 0x13, 0xa7, 0x24, 0x3a, - 0x68, 0x44, 0xcf, 0x0a, 0x2f, 0x11, 0xfb, 0xf1, 0x8b, 0x59, 0x7a, 0x7e, - 0x65, 0x10, 0x91, 0xab, 0xa4, 0x45, 0x69, 0x2b, 0x0a, 0x69, 0x2e, 0x06, - 0x1c, 0xf6, 0x01, 0x7d, 0xd0, 0xdf, 0xda, 0x70, 0x3f, 0xfd, 0xde, 0x87, - 0x5b, 0x20, 0xf0, 0x37, 0xda, 0x80, 0x2f, 0x78, 0x87, 0x28, 0xd6, 0x9a, - 0xb3, 0x3a, 0x75, 0x5e, 0xcf, 0xa5, 0x2d, 0x27, 0x5e, 0xb5, 0x09, 0xb7, - 0xb1, 0x89, 0xa0, 0x37, 0x11, 0x9e, 0xd9, 0xb1, 0x86, 0x65, 0xf7, 0x80, - 0xea, 0x07, 0x40, 0x33, 0x09, 0x9b, 0xe9, 0x79, 0xcc, 0xb8, 0xc3, 0xa1, - 0xea, 0x3c, 0xe8, 0xb7, 0x10, 0x37, 0x7d, 0x87, 0x1b, 0x97, 0xf9, 0x78, - 0x76, 0xdd, 0x44, 0x0d, 0x26, 0x4c, 0x12, 0x38, 0x3a, 0xde, 0xb9, 0x9a, - 0x25, 0xee, 0x75, 0x46, 0x14, 0x5a, 0xd9, 0xe8, 0x0b, 0x13, 0xe1, 0x92, - 0x43, 0x46, 0x58, 0xb2, 0x86, 0x80, 0x85, 0x07, 0x55, 0xea, 0x1c, 0xc3, - 0x24, 0x68, 0x6c, 0x2b, 0xcf, 0x32, 0xfb, 0xd5, 0x9e, 0x77, 0xde, 0x9f, - 0xed, 0xd3, 0x66, 0xba, 0xb0, 0x30, 0x0e, 0x51, 0x6a, 0x53, 0x7f, 0x05, - 0xa9, 0xc5, 0xb5, 0x57, 0xe1, 0x37, 0xe1, 0x65, 0x63, 0xfe, 0xcc, 0xd3, - 0xef, 0x7d, 0x00, 0x66, 0x7e, 0xd2, 0xec, 0xfb, 0x6f, 0xfc, 0xe6, 0x42, - 0x23, 0x57, 0x7d, 0xf2, 0xaf, 0xe1, 0x18, 0x7d, 0x1d, 0x57, 0x4c, 0xa6, - 0x68, 0x6f, 0x82, 0x3c, 0x00, 0x7f, 0xbf, 0x07, 0xf1, 0x8e, 0x08, 0x32, - 0x0e, 0xf0, 0x0e, 0x08, 0xb7, 0xc5, 0xbf, 0xe9, 0x02, 0x5f, 0x9c, 0x13, - 0xeb, 0x77, 0xb3, 0x07, 0x88, 0xad, 0x1b, 0xde, 0x80, 0xab, 0x8e, 0x14, - 0xd6, 0xe2, 0x79, 0x28, 0xed, 0x6d, 0xcf, 0x0c, 0xb5, 0xc6, 0x89, 0x92, - 0x26, 0x50, 0xed, 0x56, 0x7f, 0xd3, 0xeb, 0x95, 0x8c, 0xd8, 0x8b, 0x65, - 0xb1, 0xd2, 0xce, 0xa0, 0xf8, 0x67, 0xa7, 0xd6, 0x79, 0x9a, 0xb6, 0x0f, - 0xac, 0x6f, 0x03, 0x26, 0xae, 0xb4, 0x11, 0x37, 0xb5, 0xf1, 0xa2, 0xd3, - 0xec, 0xac, 0xaf, 0xc1, 0x6b, 0x5b, 0x56, 0xf9, 0x49, 0xdd, 0xb2, 0x60, - 0xaa, 0x1d, 0xe2, 0x56, 0x86, 0xa8, 0x71, 0x91, 0xf3, 0xe8, 0x23, 0x69, - 0xd1, 0x96, 0xb1, 0xbe, 0x27, 0x49, 0x44, 0xcd, 0x4e, 0x5e, 0x61, 0xc6, - 0x1b, 0x25, 0x5a, 0x47, 0x33, 0x59, 0x9b, 0x96, 0x75, 0x49, 0xe3, 0xbd, - 0x86, 0x66, 0xdb, 0x53, 0xf5, 0x75, 0xf2, 0xb2, 0x2d, 0x5c, 0xeb, 0xc0, - 0x35, 0xea, 0x3a, 0x19, 0xae, 0x5f, 0x5a, 0x7b, 0xfa, 0xe8, 0x9e, 0x78, - 0x99, 0xe2, 0x6b, 0xcf, 0x96, 0x39, 0x73, 0xe9, 0x15, 0x8c, 0x70, 0x90, - 0x35, 0xe1, 0xe8, 0x2f, 0x7f, 0x35, 0x13, 0xde, 0xe9, 0xf9, 0xf3, 0x37, - 0x39, 0x0f, 0x95, 0xaf, 0x60, 0x95, 0x5c, 0x44, 0x8e, 0x6c, 0xf5, 0xc1, - 0x1b, 0xfc, 0xce, 0x12, 0x19, 0x1d, 0xba, 0x55, 0xbd, 0xd3, 0x41, 0xf0, - 0x46, 0xb0, 0xee, 0x45, 0xe6, 0x06, 0xb3, 0x10, 0xaa, 0xcf, 0x2b, 0x3a, - 0xcf, 0x8a, 0x98, 0xd8, 0x5a, 0x3d, 0xfa, 0xaa, 0x1a, 0xd9, 0x6b, 0xad, - 0x30, 0x2f, 0x7a, 0x0f, 0x0c, 0xfe, 0xc1, 0x86, 0x7c, 0x0b, 0x62, 0x69, - 0x75, 0x5d, 0x98, 0x84, 0x87, 0x06, 0x1a, 0xad, 0xa9, 0x19, 0x23, 0x15, - 0xc0, 0xa5, 0xb8, 0x52, 0x7e, 0x94, 0x40, 0xef, 0xab, 0x59, 0xe2, 0xf7, - 0xb2, 0xd6, 0x45, 0xbc, 0xcb, 0x12, 0x23, 0x87, 0x86, 0x4d, 0x1a, 0x58, - 0xf5, 0x82, 0xd3, 0xaa, 0x54, 0xcd, 0x0e, 0x91, 0xd9, 0x4f, 0xb5, 0xb2, - 0xda, 0xe0, 0xf9, 0x16, 0xeb, 0xa1, 0x38, 0x4d, 0x0c, 0x52, 0x93, 0xa6, - 0xfb, 0x04, 0xc7, 0xe2, 0x70, 0xfa, 0x04, 0x98, 0x0b, 0x60, 0x26, 0x31, - 0x00, 0xf2, 0xb0, 0xd4, 0x68, 0xa8, 0x35, 0xd9, 0x18, 0x4c, 0xa0, 0xd6, - 0xe0, 0xaa, 0x8e, 0x03, 0x07, 0xf5, 0xb1, 0xd6, 0x25, 0x2a, 0xee, 0x3b, - 0x1a, 0xcf, 0x27, 0x7f, 0xe7, 0xa1, 0x9c, 0x3c, 0xe3, 0xc1, 0x18, 0x42, - 0x51, 0xc5, 0xa7, 0xa5, 0x28, 0x42, 0xeb, 0xaa, 0x6d, 0x1d, 0xa4, 0xee, - 0x80, 0x1a, 0x1d, 0xfd, 0x3d, 0xd4, 0x2c, 0x36, 0x10, 0xa3, 0x10, 0x17, - 0xec, 0xd8, 0x3d, 0x8e, 0x2a, 0xb4, 0x76, 0x7c, 0xc0, 0x88, 0x84, 0x8b, - 0x94, 0x12, 0x3f, 0xbb, 0x30, 0x8e, 0x17, 0x06, 0x62, 0x4b, 0x28, 0x1d, - 0xcb, 0x83, 0xb7, 0x93, 0x6b, 0xd2, 0xa4, 0xb1, 0x10, 0x7b, 0x0e, 0x43, - 0x8d, 0x5f, 0xae, 0xe3, 0x17, 0x73, 0xd0, 0xde, 0xb1, 0xbd, 0xd0, 0x4a, - 0x0e, 0xcc, 0x58, 0x41, 0x55, 0x18, 0xf5, 0x3e, 0x3a, 0x88, 0x0f, 0x58, - 0x86, 0x86, 0x88, 0xcb, 0x9b, 0x79, 0xa1, 0x10, 0x39, 0xd2, 0x97, 0x6b, - 0xeb, 0x72, 0x16, 0x65, 0xce, 0xbf, 0xd2, 0x9a, 0x88, 0x81, 0x0f, 0x57, - 0x5d, 0xd9, 0xb8, 0x52, 0x81, 0x19, 0x2b, 0x2a, 0x01, 0x8c, 0xeb, 0x60, - 0xa3, 0xbf, 0xd6, 0xe3, 0xca, 0x8b, 0x95, 0x6a, 0xb9, 0xc4, 0x51, 0x54, - 0x4b, 0x70, 0xb8, 0xe2, 0xa6, 0x15, 0x52, 0xe0, 0xb8, 0xcf, 0xf9, 0xe2, - 0xea, 0x28, 0xf8, 0x57, 0x65, 0x8c, 0x2e, 0xde, 0x96, 0xba, 0xf7, 0xe9, - 0xe5, 0x7c, 0x2f, 0x2b, 0x66, 0x8c, 0x65, 0x79, 0xd2, 0x04, 0x9a, 0xb7, - 0x25, 0x31, 0x67, 0x1f, 0x3b, 0x47, 0x01, 0x55, 0x60, 0xa9, 0x80, 0xb8, - 0x21, 0x06, 0x24, 0xf3, 0x05, 0xa0, 0x8c, 0xc0, 0x80, 0xcf, 0x65, 0xf5, - 0x13, 0xa5, 0x9f, 0xd4, 0xeb, 0xb5, 0x0a, 0xe9, 0x99, 0xf8, 0x10, 0x77, - 0x2e, 0x6a, 0x8f, 0x70, 0x31, 0x26, 0xf3, 0x95, 0x68, 0xab, 0x37, 0xdf, - 0x03, 0x03, 0x7b, 0x88, 0x39, 0x3d, 0x1b, 0xfb, 0x12, 0x1a, 0xcc, 0x1f, - 0x3e, 0xda, 0x3f, 0x34, 0xd6, 0x6a, 0x0a, 0xef, 0xd2, 0xf8, 0xbc, 0x3b, - 0x97, 0x44, 0xe6, 0x9c, 0xef, 0xec, 0xed, 0x22, 0x8d, 0x8d, 0xe6, 0xac, - 0x23, 0x05, 0x09, 0x4a, 0x41, 0x20, 0x87, 0x8d, 0x41, 0xe6, 0x1c, 0x43, - 0xac, 0x89, 0x89, 0xf3, 0x10, 0xc4, 0x81, 0xe6, 0x91, 0x2c, 0x67, 0x72, - 0x0d, 0xe6, 0x07, 0x12, 0x42, 0x4f, 0xc1, 0xdc, 0xd6, 0x48, 0xd0, 0x14, - 0x8b, 0xcb, 0x14, 0xf0, 0x5a, 0xcf, 0x47, 0xcb, 0xc2, 0x91, 0xa4, 0xf6, - 0x20, 0xdd, 0xd0, 0x65, 0xf9, 0x86, 0x5e, 0xbd, 0xa1, 0x97, 0x6e, 0x78, - 0x40, 0x3b, 0xfb, 0x13, 0xd4, 0x36, 0x3c, 0x9f, 0x9d, 0xe9, 0xc9, 0xe0, - 0xae, 0x1f, 0xd0, 0x2b, 0x9c, 0x9e, 0x18, 0xba, 0x8b, 0x1b, 0x62, 0x97, - 0xdf, 0x9d, 0x6d, 0xca, 0x3c, 0xf2, 0xc6, 0x6d, 0xdf, 0xce, 0x96, 0x84, - 0x4c, 0x7c, 0x5a, 0xe8, 0xe2, 0x00, 0x0e, 0x6f, 0x46, 0xba, 0x2a, 0x57, - 0x71, 0x92, 0x3a, 0xe9, 0x53, 0x17, 0x63, 0xd7, 0x2f, 0xbd, 0xa8, 0x79, - 0xeb, 0xae, 0xd2, 0x4c, 0x8a, 0xfb, 0x4d, 0x9e, 0x03, 0x66, 0xc4, 0x46, - 0x1e, 0xce, 0x34, 0x5e, 0xcf, 0x04, 0xff, 0xa1, 0x6c, 0x75, 0xe9, 0x86, - 0xf2, 0x22, 0x29, 0xd6, 0xc6, 0x18, 0x4a, 0x33, 0x43, 0x61, 0x89, 0x5c, - 0x16, 0xee, 0xdd, 0x99, 0x96, 0x4c, 0x51, 0x6f, 0xce, 0x38, 0x00, 0xe9, - 0x4f, 0x40, 0x88, 0xd3, 0x98, 0x02, 0x8d, 0x60, 0x1c, 0xf3, 0x47, 0x00, - 0xd3, 0x17, 0xc2, 0x35, 0x0e, 0xc6, 0x96, 0x1b, 0x0e, 0x65, 0x43, 0x2b, - 0x73, 0xfc, 0x30, 0xf7, 0x2d, 0x2b, 0xa9, 0x07, 0xe0, 0xc0, 0x19, 0x3b, - 0xe7, 0x04, 0x9e, 0xdb, 0xa1, 0xf2, 0x94, 0x41, 0x01, 0xad, 0x63, 0x41, - 0x92, 0xf2, 0xa7, 0x8a, 0xcc, 0x2c, 0xde, 0x0b, 0x1e, 0x47, 0x3d, 0xa6, - 0xbc, 0xf3, 0x34, 0xdf, 0x30, 0xe0, 0xb6, 0xea, 0x13, 0xed, 0xaa, 0x21, - 0x51, 0x6a, 0x9d, 0xf7, 0xde, 0x0e, 0x2b, 0x38, 0xe8, 0x21, 0x07, 0xba, - 0x36, 0x95, 0x53, 0xb1, 0xb9, 0x98, 0x25, 0xd8, 0xcd, 0xde, 0x55, 0x7c, - 0x39, 0x5e, 0x65, 0x12, 0xf3, 0x43, 0x91, 0x82, 0xb7, 0x1f, 0x28, 0xb1, - 0x3f, 0x3a, 0xc0, 0x70, 0x9e, 0xee, 0x03, 0x86, 0x23, 0x6c, 0x4e, 0x84, - 0x63, 0xc7, 0xa0, 0x42, 0x66, 0x38, 0x01, 0xa9, 0x1c, 0xe2, 0xe7, 0xc9, - 0xa4, 0x91, 0x18, 0x09, 0x8d, 0xc0, 0x5c, 0x83, 0x99, 0x02, 0x8f, 0x11, - 0x9f, 0x45, 0x61, 0x69, 0xfc, 0x26, 0x98, 0xf7, 0xa7, 0x1f, 0xf7, 0x8d, - 0x58, 0x30, 0x1d, 0x89, 0xab, 0x03, 0x9f, 0xe7, 0x32, 0x23, 0x1e, 0x3c, - 0x3f, 0x23, 0x66, 0xc6, 0xc9, 0x47, 0xe9, 0x72, 0xac, 0xfe, 0xa7, 0x7f, - 0x80, 0x78, 0x0d, 0x82, 0xe5, 0xe1, 0x2b, 0xfa, 0x8a, 0x34, 0x20, 0x36, - 0x42, 0xee, 0x4f, 0x9f, 0x8f, 0xa3, 0x86, 0xa7, 0xab, 0x0f, 0xa0, 0xab, - 0x80, 0x1d, 0xc0, 0x62, 0x15, 0x4d, 0xa6, 0x37, 0xa0, 0xe3, 0x05, 0xdf, - 0xc9, 0x18, 0x7a, 0x8b, 0x40, 0x05, 0xcf, 0x79, 0x3b, 0x47, 0x40, 0x59, - 0xcf, 0xef, 0xc7, 0xf1, 0x15, 0x00, 0xe1, 0xc2, 0x13, 0xc7, 0x46, 0xd1, - 0x53, 0xc2, 0xfa, 0xea, 0x3d, 0x74, 0xa1, 0x4b, 0x53, 0x3a, 0x48, 0x78, - 0x23, 0x2a, 0xe6, 0xa9, 0x4c, 0x81, 0x34, 0x0b, 0xb8, 0x23, 0x5d, 0x2b, - 0xbd, 0x69, 0x09, 0x23, 0xf4, 0xcb, 0x2a, 0x14, 0x1f, 0x6b, 0x5c, 0xe0, - 0xbb, 0xf7, 0xdd, 0x28, 0x31, 0xa6, 0xba, 0x55, 0xb9, 0x13, 0x63, 0xb4, - 0x79, 0x99, 0x53, 0xaa, 0x70, 0xdd, 0x62, 0x2f, 0x4a, 0xa4, 0x36, 0x85, - 0x1e, 0xfe, 0x37, 0xcb, 0xb1, 0x9c, 0xd9, 0xd7, 0x63, 0xaf, 0xeb, 0xb7, - 0xed, 0x05, 0x20, 0x96, 0xe0, 0x30, 0x9c, 0xd1, 0x3f, 0x3b, 0x29, 0x1e, - 0x05, 0xe9, 0x67, 0x6b, 0x8e, 0x40, 0xca, 0x36, 0xdd, 0x57, 0x1a, 0xde, - 0xef, 0x20, 0x71, 0x4e, 0x63, 0xa8, 0xf1, 0x0c, 0x00, 0x8c, 0x00, 0x1a, - 0x9a, 0x95, 0xdb, 0x34, 0xfe, 0xa4, 0x8e, 0x02, 0xa1, 0x06, 0x4e, 0xca, - 0x36, 0xeb, 0x84, 0x0c, 0x56, 0x1a, 0x13, 0x4e, 0x22, 0x43, 0x52, 0xed, - 0x24, 0x5e, 0xb7, 0x7e, 0x7f, 0xa8, 0x5c, 0x4f, 0x02, 0x37, 0x9e, 0x76, - 0x7f, 0xca, 0x97, 0x08, 0x01, 0x53, 0x7e, 0xa8, 0x98, 0x4c, 0xf9, 0xaa, - 0x6b, 0x36, 0x97, 0x34, 0x24, 0xce, 0xcc, 0xe4, 0xee, 0xde, 0x83, 0xff, - 0xac, 0x30, 0xd1, 0x55, 0x7e, 0xb1, 0x5b, 0xce, 0x9e, 0x5a, 0x50, 0x55, - 0x56, 0x62, 0xc1, 0xb8, 0x0c, 0xc7, 0x66, 0xd2, 0xa9, 0xee, 0xf3, 0xbc, - 0x05, 0x20, 0x77, 0x85, 0xc3, 0x98, 0x4f, 0x47, 0x47, 0xd3, 0xae, 0xfc, - 0x7f, 0xa8, 0x75, 0xe5, 0xaa, 0xa6, 0xf2, 0x77, 0x5c, 0xe3, 0x8f, 0xdc, - 0x61, 0xdc, 0x2a, 0xd6, 0x30, 0xd4, 0x59, 0xee, 0x84, 0xe1, 0x35, 0x50, - 0xe4, 0xcc, 0xcc, 0xbf, 0x5b, 0xe5, 0x25, 0x98, 0x00, 0x87, 0xd0, 0x85, - 0x17, 0x2d, 0x2e, 0x7c, 0x7d, 0xeb, 0x7a, 0x9d, 0x27, 0xc2, 0xe7, 0x13, - 0x59, 0xea, 0xa9, 0xda, 0x1d, 0xfc, 0xd7, 0x96, 0x43, 0x85, 0x3f, 0xe7, - 0x5a, 0x74, 0xb8, 0x01, 0xe0, 0x52, 0x16, 0xbf, 0x83, 0x4c, 0x57, 0xbb, - 0x63, 0x27, 0x81, 0x90, 0xa5, 0x28, 0xaa, 0x1e, 0x39, 0x36, 0x8a, 0xdc, - 0xcc, 0xf4, 0x13, 0x0a, 0x3f, 0x32, 0xc7, 0xcb, 0x11, 0xaa, 0x14, 0xd5, - 0x54, 0x87, 0x11, 0x57, 0x9a, 0x45, 0x86, 0x0b, 0x5c, 0x3e, 0x75, 0x49, - 0x98, 0x68, 0x09, 0xaf, 0x35, 0x52, 0x6d, 0x4c, 0xaa, 0xba, 0x94, 0x4b, - 0x01, 0xe5, 0x2f, 0x00, 0xf2, 0xa1, 0x91, 0x19, 0xaf, 0xc5, 0xb6, 0xfa, - 0x2e, 0x6e, 0x6c, 0xeb, 0xb5, 0x2c, 0x12, 0xd3, 0x4e, 0x09, 0x12, 0x4f, - 0xe1, 0xd2, 0x02, 0x15, 0xb4, 0xf1, 0x80, 0xd9, 0x76, 0x70, 0xd7, 0x6b, - 0x37, 0x99, 0x2a, 0xbb, 0x72, 0x29, 0xc7, 0x62, 0x68, 0xad, 0x85, 0x70, - 0xbb, 0x47, 0x12, 0xee, 0x8e, 0x0e, 0x3b, 0x1e, 0xff, 0x40, 0x2a, 0xe2, - 0x01, 0x1c, 0x5d, 0x98, 0x53, 0xd0, 0xa6, 0x04, 0x65, 0x79, 0x3a, 0x57, - 0x2a, 0x5f, 0xa9, 0x86, 0x38, 0x9a, 0x48, 0x53, 0xd8, 0x06, 0x02, 0x05, - 0x43, 0x22, 0xd4, 0x53, 0x99, 0x02, 0x29, 0xbb, 0x44, 0x11, 0x62, 0xc3, - 0x32, 0xc7, 0xf9, 0xfc, 0xfc, 0x1c, 0x2b, 0xb1, 0xad, 0x70, 0x03, 0xdf, - 0x91, 0x66, 0x77, 0x08, 0x49, 0x21, 0xe3, 0x05, 0x47, 0x08, 0x7b, 0xeb, - 0x97, 0x94, 0x90, 0x50, 0x29, 0xd5, 0x3e, 0x2b, 0xcc, 0xc4, 0xb3, 0x3b, - 0x72, 0x37, 0xf4, 0x2b, 0x3e, 0x47, 0x79, 0xbc, 0x6a, 0x4d, 0x51, 0xb3, - 0x26, 0x71, 0xbd, 0x2a, 0x7d, 0xab, 0x5d, 0x16, 0xcc, 0x1b, 0xf0, 0x51, - 0x67, 0xed, 0x2c, 0x4f, 0x8a, 0xc6, 0x77, 0x7c, 0x58, 0xa4, 0x09, 0x40, - 0x03, 0xf3, 0xb9, 0xf2, 0x98, 0xf3, 0x74, 0xc0, 0x61, 0xfa, 0x3c, 0x52, - 0x84, 0xd3, 0xdc, 0xc0, 0x51, 0x9b, 0x24, 0xb3, 0x71, 0xa2, 0xd0, 0x18, - 0xe2, 0xbf, 0x06, 0xfe, 0x57, 0xbe, 0x94, 0x45, 0x30, 0xa8, 0x12, 0x19, - 0xa7, 0x51, 0x3e, 0x49, 0xe8, 0x6c, 0x3f, 0x56, 0xb7, 0x4e, 0x7b, 0x7d, - 0xf7, 0x7a, 0x2d, 0x72, 0x50, 0xf2, 0xce, 0xdf, 0x4e, 0x5d, 0x5b, 0xbc, - 0x9e, 0x20, 0x56, 0x85, 0x57, 0x78, 0x3a, 0x72, 0x33, 0x64, 0x06, 0xd4, - 0x87, 0x5a, 0x1a, 0x8e, 0x6f, 0x5f, 0x55, 0x47, 0xb4, 0x63, 0x9b, 0x7c, - 0x68, 0x5b, 0x3e, 0x0b, 0x16, 0xfa, 0x40, 0x10, 0x78, 0x84, 0x94, 0xa6, - 0xf5, 0x20, 0xbb, 0xef, 0xe2, 0xc6, 0x6a, 0x6d, 0x95, 0xc3, 0xa8, 0xb1, - 0x0a, 0xad, 0x36, 0x61, 0x01, 0xeb, 0xad, 0x36, 0x61, 0xb7, 0x34, 0x61, - 0x58, 0x19, 0x93, 0x54, 0x9c, 0x26, 0x65, 0xe8, 0x52, 0x58, 0xb4, 0x5c, - 0x6d, 0x45, 0x46, 0xf3, 0xb3, 0x26, 0xb3, 0xce, 0x95, 0x94, 0xb7, 0x74, - 0x29, 0x54, 0x82, 0x7c, 0x65, 0xcd, 0x56, 0xda, 0x80, 0x09, 0x77, 0xf0, - 0x37, 0x04, 0xf4, 0x8f, 0x7e, 0xa6, 0xcf, 0xac, 0x9f, 0x6c, 0xf0, 0xd2, - 0x69, 0x84, 0x91, 0x15, 0x85, 0xdb, 0xca, 0xb4, 0x51, 0x8f, 0xc4, 0x91, - 0x50, 0xf4, 0x3d, 0x0e, 0x9c, 0xb9, 0xfd, 0x56, 0xc9, 0x1e, 0xb3, 0xa9, - 0xa4, 0x1f, 0x14, 0xf5, 0x31, 0xb4, 0xa2, 0x4c, 0x36, 0x50, 0x69, 0x42, - 0x54, 0x5f, 0x5d, 0x5e, 0x2b, 0xb3, 0xa9, 0x22, 0x98, 0xca, 0xe9, 0x40, - 0x1c, 0x48, 0x18, 0x49, 0x99, 0xa1, 0xd3, 0xb4, 0x83, 0x12, 0x09, 0x96, - 0x60, 0xd9, 0x0b, 0xb9, 0x79, 0xc5, 0xe7, 0x4b, 0x8d, 0xae, 0x08, 0x15, - 0x4e, 0x72, 0xdb, 0xb7, 0x2e, 0x7c, 0x92, 0xbc, 0x82, 0x6e, 0x36, 0x55, - 0x64, 0x64, 0xc0, 0x8a, 0x1a, 0x82, 0x1e, 0xe3, 0x76, 0x4d, 0x3e, 0x61, - 0x15, 0x37, 0x33, 0x04, 0x14, 0x65, 0x95, 0x0f, 0x83, 0xc3, 0x4b, 0x7f, - 0x8b, 0x84, 0xb6, 0x66, 0x70, 0x12, 0x95, 0x7c, 0xd3, 0x5f, 0x50, 0xc7, - 0x78, 0xbc, 0x8d, 0xeb, 0x85, 0xf0, 0x2f, 0x7a, 0x50, 0x92, 0x80, 0xcb, - 0xdd, 0xec, 0x9b, 0x49, 0xbd, 0x87, 0x2f, 0x04, 0x42, 0x6d, 0x8e, 0x64, - 0xd6, 0x02, 0x86, 0xd2, 0x9e, 0xb0, 0x08, 0x48, 0xf5, 0x4f, 0xfb, 0xac, - 0x23, 0x7c, 0x1f, 0xf9, 0x68, 0xf5, 0x7a, 0x47, 0xb8, 0x1f, 0x80, 0xd4, - 0x3b, 0x5d, 0xeb, 0x16, 0x9a, 0x73, 0x9f, 0x88, 0xeb, 0xc8, 0xb1, 0x28, - 0x4c, 0x09, 0x16, 0xd5, 0xf5, 0x23, 0xce, 0x6f, 0xe1, 0x88, 0x65, 0x3e, - 0x4d, 0x4c, 0xa0, 0xce, 0x2b, 0x49, 0x66, 0x60, 0xda, 0xd8, 0xec, 0xf9, - 0xc2, 0x0c, 0xa9, 0xf5, 0x28, 0xef, 0xec, 0x64, 0x29, 0x13, 0x17, 0xfa, - 0xa0, 0xf2, 0xbe, 0xcf, 0x1b, 0x92, 0xf8, 0x1e, 0xbc, 0x1f, 0xf2, 0x0a, - 0x6e, 0xa6, 0xfc, 0x2e, 0x51, 0x2f, 0x85, 0x63, 0x68, 0x02, 0x43, 0x42, - 0xd5, 0x58, 0x78, 0x07, 0xb2, 0xa1, 0x57, 0x98, 0xe3, 0x8f, 0x90, 0x40, - 0xf4, 0xb7, 0x45, 0x54, 0xbe, 0x11, 0x61, 0x7f, 0x2f, 0x33, 0x36, 0xd5, - 0x63, 0xe5, 0x86, 0xdc, 0xdf, 0x2c, 0x15, 0xb1, 0xab, 0xfa, 0x28, 0x92, - 0xaf, 0xe0, 0xbb, 0xce, 0xce, 0x29, 0x39, 0x8d, 0x55, 0x1f, 0xb5, 0xfb, - 0x36, 0xd1, 0x27, 0x13, 0xfd, 0xaf, 0x00, 0x0a, 0xdb, 0x4e, 0xfb, 0x7e, - 0xdf, 0x5c, 0x7c, 0x83, 0x33, 0x59, 0xac, 0xf9, 0x88, 0x63, 0xe6, 0x0e, - 0xd2, 0xc3, 0x53, 0x70, 0xe4, 0x75, 0x95, 0x6f, 0x4a, 0xdd, 0x1b, 0x16, - 0x90, 0x7b, 0x2e, 0x47, 0x1b, 0xea, 0xd3, 0xd0, 0x11, 0x25, 0xd9, 0x1f, - 0x7e, 0xb0, 0xf5, 0x1d, 0xb2, 0x84, 0x88, 0xd3, 0xdc, 0x49, 0xf1, 0x87, - 0x2c, 0x3c, 0x94, 0x61, 0xe7, 0x23, 0x78, 0x9e, 0xf3, 0x95, 0x6e, 0xf4, - 0x79, 0x29, 0xdf, 0x7c, 0x6a, 0x49, 0xee, 0x63, 0x25, 0x14, 0x45, 0xe5, - 0xba, 0x54, 0x0f, 0xdc, 0x42, 0x10, 0xc0, 0x1a, 0x39, 0x56, 0x1f, 0x18, - 0x19, 0x86, 0x1e, 0x75, 0x57, 0x7d, 0xed, 0xb5, 0x12, 0x93, 0x79, 0xf8, - 0xb0, 0xde, 0x2e, 0x45, 0x0e, 0x25, 0x08, 0xf6, 0x02, 0xf1, 0x7f, 0xcb, - 0xc4, 0xdb, 0x25, 0xb5, 0xf0, 0x3a, 0x6d, 0x89, 0xc1, 0x5e, 0x61, 0x99, - 0xbf, 0x15, 0xcb, 0xf4, 0x8d, 0x66, 0x28, 0x9a, 0xbd, 0xea, 0x18, 0xca, - 0x2c, 0x43, 0x97, 0xca, 0xb8, 0xca, 0xe4, 0x19, 0x6a, 0x46, 0xbc, 0xca, - 0x6f, 0xf4, 0x98, 0x91, 0xd9, 0xa8, 0xb9, 0xb5, 0xac, 0x60, 0xb9, 0x20, - 0xb5, 0x35, 0x26, 0x28, 0x97, 0x49, 0x45, 0xcb, 0x35, 0x99, 0x3d, 0xd1, - 0x00, 0x30, 0xb0, 0x82, 0x72, 0xff, 0xdd, 0x90, 0x85, 0x28, 0xdf, 0xa8, - 0x46, 0x83, 0x71, 0x3e, 0x25, 0x1c, 0x6a, 0x71, 0x66, 0x6f, 0x63, 0x5e, - 0x59, 0xbe, 0x51, 0x2f, 0xa4, 0x29, 0xb7, 0xa6, 0x5c, 0xf1, 0x8d, 0xba, - 0x21, 0xf9, 0x3d, 0x68, 0x5e, 0x42, 0x98, 0x71, 0x2d, 0x90, 0x08, 0x65, - 0x42, 0x51, 0x9f, 0xd2, 0x36, 0xaa, 0x33, 0xfa, 0xed, 0x2d, 0xaa, 0xff, - 0x26, 0xea, 0x88, 0x62, 0x5d, 0x49, 0xd5, 0x0a, 0xad, 0x2b, 0x5c, 0xe5, - 0xc7, 0x3e, 0x6c, 0xa2, 0x65, 0x12, 0xca, 0xeb, 0xda, 0xd9, 0x5d, 0x0c, - 0xd3, 0x39, 0xe9, 0xab, 0xce, 0x2d, 0xfe, 0x68, 0xda, 0x4a, 0x3f, 0xa7, - 0xe6, 0xfa, 0xfc, 0x59, 0x57, 0xa9, 0x11, 0xd5, 0x0b, 0x97, 0xc1, 0xba, - 0x2e, 0xd5, 0x3c, 0xfb, 0x10, 0xf4, 0xf4, 0xa5, 0x42, 0xa8, 0xda, 0xeb, - 0xf4, 0xe1, 0xfd, 0x86, 0x40, 0xdf, 0x8b, 0xce, 0x92, 0x9b, 0x56, 0xbd, - 0x7f, 0x03, 0x01, 0xc3, 0x78, 0x43, 0x99, 0xdd, 0xb8, 0x1a, 0xcc, 0x94, - 0xa9, 0xec, 0x59, 0x54, 0xad, 0xc9, 0x37, 0xcb, 0xbc, 0x8a, 0x69, 0x16, - 0x84, 0x0b, 0x13, 0x44, 0xc4, 0x42, 0xf2, 0x0a, 0x65, 0xbd, 0xdf, 0x97, - 0x63, 0xff, 0x83, 0x5c, 0x78, 0x57, 0x29, 0x98, 0x6e, 0xa7, 0x62, 0x35, - 0x1c, 0x2c, 0x06, 0xe9, 0x56, 0xf0, 0x7c, 0x06, 0x0b, 0x5c, 0x38, 0x08, - 0xa8, 0x75, 0x04, 0x7c, 0x27, 0xf8, 0x1d, 0x20, 0x07, 0xe2, 0x31, 0x10, - 0xf2, 0xce, 0x20, 0xab, 0x31, 0xfe, 0xad, 0x6c, 0x5c, 0xae, 0x3f, 0xed, - 0x5b, 0x09, 0x5d, 0xe0, 0x1c, 0x45, 0x25, 0x75, 0x05, 0xe8, 0x41, 0x45, - 0xb5, 0xe5, 0x53, 0xcd, 0x7e, 0xb4, 0x4b, 0x0c, 0xea, 0xdc, 0xda, 0x46, - 0xe0, 0xe8, 0x28, 0x5f, 0xf6, 0x04, 0x45, 0x73, 0x40, 0x2b, 0x7e, 0xec, - 0x08, 0x44, 0xdf, 0x45, 0x22, 0xe7, 0xe9, 0xe2, 0x53, 0x65, 0x88, 0xc5, - 0x2e, 0x62, 0xb0, 0x84, 0x99, 0x5a, 0x49, 0x43, 0xb5, 0x15, 0xde, 0x71, - 0x90, 0x8f, 0x70, 0x11, 0x21, 0x9e, 0xca, 0x8e, 0xd0, 0xef, 0x19, 0xe2, - 0xd3, 0xf5, 0xf4, 0x50, 0xcb, 0x14, 0x13, 0x10, 0x2a, 0x07, 0x18, 0x62, - 0x07, 0x6f, 0xca, 0x5c, 0x3a, 0x18, 0x5a, 0x4b, 0xd8, 0x75, 0x82, 0xc2, - 0x21, 0xc8, 0xac, 0xaf, 0x2a, 0xca, 0x70, 0x25, 0x16, 0x05, 0xc0, 0x9b, - 0x31, 0xd3, 0x4e, 0x87, 0x52, 0xac, 0xf8, 0x5e, 0x9c, 0x9c, 0xeb, 0xa8, - 0xea, 0xd0, 0x1d, 0x1d, 0x66, 0x2f, 0x3c, 0x3e, 0xc0, 0x13, 0x47, 0x50, - 0x7b, 0x10, 0x95, 0x6f, 0x64, 0xaa, 0x26, 0x67, 0x57, 0x60, 0xad, 0x5c, - 0x60, 0x13, 0x3b, 0x25, 0x24, 0x08, 0x4f, 0x66, 0xb0, 0x86, 0x12, 0x1c, - 0x0d, 0x1c, 0x97, 0x20, 0x82, 0xdb, 0xd4, 0x7b, 0x23, 0xd7, 0x50, 0x3e, - 0x8d, 0x83, 0x16, 0x2a, 0xe9, 0x46, 0xf5, 0x77, 0x45, 0x15, 0x2f, 0xd9, - 0xb9, 0x5c, 0xc1, 0x81, 0x6c, 0x21, 0xab, 0xfd, 0x8e, 0xc4, 0x0c, 0x61, - 0xe0, 0xcb, 0x68, 0x1d, 0xb1, 0xb4, 0xa2, 0x67, 0x06, 0x21, 0xa3, 0x7f, - 0x91, 0x1c, 0x2f, 0x36, 0xfd, 0x78, 0x0b, 0x6e, 0xb1, 0xe8, 0x43, 0xe8, - 0x6e, 0xac, 0x56, 0xd0, 0x78, 0x2c, 0x4d, 0x4d, 0xe2, 0x9e, 0x7b, 0x4d, - 0x02, 0x19, 0x01, 0x97, 0xf5, 0xbd, 0xb3, 0x55, 0x54, 0xae, 0x15, 0x32, - 0xbe, 0x9d, 0x21, 0x37, 0x16, 0x30, 0x6b, 0xc9, 0x85, 0xcf, 0x08, 0x73, - 0x36, 0xa4, 0x77, 0x0d, 0xc9, 0x00, 0x4a, 0x5d, 0x26, 0x72, 0xf5, 0x7d, - 0x24, 0x7c, 0xb3, 0xd7, 0xf3, 0x97, 0x62, 0xe5, 0xac, 0x92, 0x0e, 0xa0, - 0x74, 0x88, 0xe0, 0x80, 0x5c, 0x03, 0x27, 0xb9, 0x3d, 0x55, 0xd9, 0x05, - 0xfd, 0xfe, 0x4d, 0xdc, 0xd6, 0x7a, 0x25, 0x6f, 0xa5, 0x30, 0x5f, 0xbf, - 0x9f, 0x55, 0xc0, 0x95, 0x26, 0xe4, 0x54, 0xd4, 0x8d, 0xb6, 0xfa, 0xa7, - 0x62, 0xab, 0xa6, 0x8c, 0x0e, 0xd1, 0xa9, 0x21, 0xd4, 0x22, 0x25, 0x80, - 0x2f, 0xd7, 0xac, 0xc1, 0xee, 0xc3, 0xff, 0xf8, 0xfb, 0xff, 0xfe, 0xbf, - 0xff, 0xe7, 0x43, 0x3b, 0x18, 0x6e, 0x4e, 0x1d, 0x8c, 0x55, 0x0e, 0x50, - 0x44, 0xf4, 0x11, 0x49, 0xab, 0xc6, 0x3c, 0xe6, 0xd3, 0x04, 0x7a, 0x32, - 0x77, 0x83, 0x3c, 0x11, 0xcb, 0x59, 0x2c, 0xfa, 0x5b, 0xde, 0x3c, 0x5d, - 0x27, 0xc2, 0x1c, 0x5c, 0x21, 0xdd, 0x70, 0x96, 0x59, 0xd0, 0x0f, 0x9b, - 0xfd, 0xbb, 0xcc, 0x28, 0xfc, 0x20, 0x96, 0x32, 0xf9, 0xf3, 0xe4, 0xe4, - 0x06, 0x27, 0x2c, 0x2e, 0x9c, 0x30, 0xcf, 0x1e, 0xd1, 0xd1, 0x8f, 0x7c, - 0xf2, 0x7a, 0x8e, 0xa1, 0xf3, 0x12, 0x8b, 0x7d, 0xae, 0xfe, 0xb5, 0x08, - 0x65, 0x4f, 0xef, 0x4f, 0xe5, 0xf7, 0x0a, 0xdb, 0x86, 0x92, 0xa5, 0xdc, - 0xbf, 0x42, 0xd5, 0xa0, 0x47, 0xb7, 0x33, 0xcf, 0xcf, 0x3a, 0x97, 0xef, - 0xc7, 0x9b, 0xfd, 0x0b, 0x6c, 0xd6, 0x3b, 0x54, 0x53, 0x50, 0x92, 0x59, - 0x0b, 0x97, 0x2a, 0x7e, 0x2d, 0xd3, 0xd3, 0x4a, 0x9d, 0xee, 0x3d, 0xfb, - 0xa0, 0x9b, 0xcb, 0x02, 0x0e, 0x96, 0xf1, 0x9e, 0xa1, 0xba, 0xf7, 0xd1, - 0x33, 0x23, 0x66, 0xa2, 0x1a, 0x12, 0xda, 0x6c, 0x06, 0xd7, 0x95, 0x83, - 0x40, 0x68, 0x4c, 0x52, 0xc5, 0x5b, 0x4f, 0xeb, 0x42, 0x0f, 0x52, 0xa4, - 0x63, 0xbe, 0x95, 0xf3, 0x23, 0x5a, 0x55, 0x4b, 0x50, 0xfd, 0x6e, 0x91, - 0xe3, 0x62, 0xc1, 0xaf, 0x9a, 0xd7, 0xd0, 0xd8, 0x6f, 0xce, 0x55, 0x9e, - 0x87, 0xcc, 0x3b, 0xd4, 0x4d, 0x04, 0x97, 0x0a, 0x30, 0x74, 0xfa, 0x39, - 0x89, 0x09, 0x08, 0xe6, 0xaf, 0x0a, 0xf3, 0xe9, 0x10, 0x53, 0x40, 0x9c, - 0x1c, 0xa9, 0xf2, 0xac, 0x9a, 0xfe, 0x46, 0x2a, 0xf9, 0x26, 0x64, 0xcd, - 0x34, 0xad, 0x36, 0x5d, 0xf2, 0xc2, 0x6b, 0x9c, 0xa4, 0x1c, 0x75, 0xde, - 0x9d, 0x23, 0xfe, 0x4f, 0x2a, 0xf2, 0x1b, 0xaa, 0x34, 0xec, 0x17, 0xa4, - 0xf8, 0xe1, 0x14, 0x88, 0x1b, 0x51, 0xe0, 0xb9, 0x66, 0x7a, 0xa8, 0xb6, - 0x71, 0x43, 0xc6, 0x27, 0x32, 0x70, 0xb9, 0x95, 0x7e, 0x9c, 0x00, 0x7d, - 0xb8, 0xc8, 0xc4, 0x90, 0xbd, 0x7d, 0x37, 0xe1, 0xa7, 0xe7, 0x8c, 0x10, - 0x21, 0x78, 0x2d, 0x81, 0x6a, 0x19, 0xff, 0x63, 0x9f, 0x28, 0x0e, 0x62, - 0x89, 0x06, 0x20, 0x23, 0x7a, 0x83, 0x21, 0x38, 0x43, 0xc6, 0xa2, 0x38, - 0xcb, 0x71, 0x4b, 0x6f, 0xdb, 0x88, 0x2f, 0xe6, 0xa7, 0xe4, 0xea, 0xd7, - 0xee, 0x8a, 0xbd, 0x84, 0xe3, 0xb1, 0xc1, 0xf0, 0x0c, 0x05, 0x1b, 0x02, - 0x07, 0x1b, 0xf0, 0xa8, 0x4e, 0x41, 0x94, 0xc0, 0x4c, 0x1f, 0xd8, 0x61, - 0x5f, 0xf3, 0x57, 0x10, 0xbe, 0xc1, 0x9e, 0x07, 0x3a, 0x8a, 0x38, 0x0e, - 0x6c, 0x90, 0x7e, 0x69, 0xbf, 0x42, 0xec, 0xdc, 0x77, 0x22, 0xa0, 0x7a, - 0x49, 0x88, 0xd8, 0xaa, 0xe0, 0x84, 0x31, 0x69, 0x35, 0x20, 0x8b, 0x43, - 0x49, 0x1b, 0x94, 0x37, 0xb3, 0x02, 0x6d, 0xbe, 0x07, 0xe6, 0xf8, 0x21, - 0xba, 0x6b, 0x81, 0x45, 0xf6, 0x12, 0xcc, 0xdc, 0x4a, 0xae, 0xbb, 0x15, - 0xdd, 0x7c, 0xf1, 0xd2, 0xb3, 0x95, 0x68, 0x1e, 0x5a, 0x45, 0x1d, 0x1e, - 0x37, 0xb8, 0x7e, 0xf0, 0x91, 0x0b, 0x54, 0xa9, 0x32, 0xee, 0xe8, 0xc2, - 0xa9, 0x87, 0x09, 0x05, 0x59, 0xab, 0xc8, 0x15, 0xa9, 0x76, 0xf0, 0x7e, - 0x5f, 0x36, 0x4a, 0x8b, 0xe1, 0xa5, 0x88, 0x3c, 0x6a, 0x3e, 0x00, 0x22, - 0x99, 0x1b, 0xea, 0x4a, 0x4b, 0xa9, 0x34, 0xc5, 0xac, 0x59, 0xa8, 0x4f, - 0x1d, 0x20, 0xd2, 0x76, 0xf2, 0x43, 0x28, 0xff, 0xe8, 0xfa, 0x48, 0x3f, - 0xd8, 0x21, 0xba, 0xd2, 0x68, 0x0f, 0x3a, 0x4a, 0xf0, 0x00, 0xe0, 0xf2, - 0xaa, 0x0f, 0x31, 0xe5, 0x29, 0x11, 0x1f, 0x83, 0x6c, 0xa0, 0xf4, 0x28, - 0x7a, 0x24, 0x9c, 0x00, 0x2d, 0xc2, 0xf3, 0xca, 0x14, 0xd6, 0x5e, 0x36, - 0xc8, 0xcb, 0xae, 0xf3, 0xfc, 0xec, 0x72, 0x8e, 0x83, 0xb7, 0x83, 0x72, - 0x5b, 0x07, 0x3d, 0xf7, 0xb1, 0xe7, 0x1f, 0x7a, 0xb4, 0xb3, 0xf2, 0x16, - 0x21, 0xee, 0xf1, 0x67, 0x2f, 0x1e, 0xd2, 0xdc, 0xd3, 0xa6, 0xfa, 0x00, - 0xbc, 0xee, 0xd2, 0x41, 0x6d, 0x85, 0xc2, 0xc9, 0x4c, 0x00, 0xf1, 0xed, - 0x5e, 0xb0, 0xac, 0x8b, 0x85, 0x09, 0x67, 0xfc, 0x94, 0xed, 0x06, 0x73, - 0x98, 0x9f, 0xf5, 0x64, 0x2e, 0xde, 0x77, 0xb7, 0x37, 0xfd, 0x8b, 0xba, - 0x37, 0x51, 0x4d, 0x52, 0x2b, 0xa5, 0x37, 0x8c, 0x5a, 0xed, 0x1a, 0xfd, - 0xae, 0x87, 0xad, 0x09, 0x96, 0xfc, 0xef, 0x50, 0x56, 0x84, 0x37, 0x01, - 0x4a, 0x54, 0x96, 0x03, 0xff, 0x16, 0xe8, 0xea, 0xb8, 0x59, 0x69, 0x51, - 0x26, 0xb0, 0x08, 0xbb, 0x9f, 0xc0, 0xed, 0x91, 0x39, 0x1f, 0x28, 0xe6, - 0xb0, 0x7e, 0xa9, 0x92, 0x01, 0x4d, 0xb1, 0xf3, 0x44, 0x44, 0x83, 0xc1, - 0x6a, 0x03, 0xc8, 0x54, 0x33, 0xd5, 0xba, 0xac, 0xc4, 0xfb, 0x0e, 0xb6, - 0x0b, 0xde, 0xee, 0x3c, 0xf1, 0xdf, 0x43, 0x00, 0xd6, 0x07, 0x56, 0x37, - 0x0b, 0xf8, 0x03, 0x44, 0xcc, 0x63, 0x77, 0x44, 0x61, 0xa5, 0x04, 0x26, - 0x19, 0x4f, 0x4c, 0x50, 0x6f, 0x2b, 0x3f, 0xbd, 0x25, 0xf8, 0x3e, 0xaa, - 0xa2, 0x21, 0xc4, 0x1e, 0xd2, 0x02, 0x1c, 0xca, 0xb5, 0x04, 0x75, 0x2c, - 0x17, 0x25, 0xde, 0xa2, 0x68, 0x4f, 0x75, 0x81, 0xca, 0xd0, 0xb1, 0x76, - 0x72, 0x3f, 0x76, 0x0f, 0x51, 0x0f, 0x50, 0x23, 0x6e, 0xa3, 0x5a, 0x3f, - 0x55, 0x77, 0x52, 0x89, 0xff, 0x17, 0xbf, 0xe1, 0xc2, 0xf9, 0x67, 0x32, - 0x41, 0xdf, 0x72, 0x04, 0x1c, 0xf4, 0xe6, 0xac, 0x83, 0x57, 0xf7, 0x43, - 0xa7, 0xec, 0x63, 0x4a, 0x51, 0xf8, 0xcd, 0xd1, 0xb5, 0xaf, 0x90, 0x5f, - 0x04, 0x52, 0x7f, 0x35, 0x2c, 0x69, 0x6d, 0xe7, 0xe1, 0xff, 0x9e, 0x07, - 0x62, 0x51, 0x4c, 0xec, 0xd0, 0xdb, 0xab, 0x4b, 0xb1, 0x50, 0x5b, 0x69, - 0x56, 0xcb, 0xad, 0x2a, 0x30, 0x2d, 0x56, 0xca, 0x95, 0x78, 0x98, 0x59, - 0x54, 0x27, 0x4d, 0x0f, 0xe3, 0x10, 0x15, 0x3e, 0xbb, 0x9c, 0x19, 0x0e, - 0xc8, 0xde, 0x9e, 0xec, 0x15, 0x06, 0x77, 0x69, 0xf9, 0x8f, 0xf3, 0x32, - 0xa8, 0xb2, 0xfd, 0x42, 0x52, 0xce, 0x87, 0x62, 0x7d, 0x98, 0x14, 0x21, - 0xb2, 0xd2, 0x40, 0xe6, 0x09, 0x29, 0xab, 0x1d, 0xd7, 0xce, 0x5c, 0xba, - 0x0e, 0xa6, 0xb4, 0xda, 0x87, 0x90, 0x57, 0xbe, 0x0e, 0x5b, 0x9f, 0x74, - 0x9f, 0x3b, 0xfb, 0x4e, 0x0b, 0x4a, 0x16, 0x0d, 0x93, 0x62, 0xcc, 0x92, - 0x0d, 0x7e, 0xb9, 0xf3, 0xdc, 0xf4, 0x99, 0x4d, 0xfd, 0x1e, 0x57, 0xdf, - 0x78, 0xc7, 0x9d, 0x62, 0xf0, 0xb6, 0xbe, 0xdf, 0xb6, 0x97, 0x5d, 0x1f, - 0xc0, 0x6d, 0xc3, 0x4c, 0x83, 0x6c, 0xae, 0xb8, 0xf4, 0xaa, 0x6b, 0xa7, - 0x6f, 0xf9, 0x08, 0x1e, 0x41, 0x53, 0x12, 0xc5, 0x01, 0xd3, 0x76, 0xaf, - 0x1a, 0xbd, 0x89, 0x95, 0x89, 0x24, 0xb5, 0x1c, 0x71, 0x1d, 0xd6, 0xba, - 0xaf, 0xb1, 0x72, 0x20, 0x8e, 0x31, 0xed, 0x70, 0x55, 0xaa, 0xc5, 0x63, - 0xa1, 0xa5, 0x8b, 0x9c, 0x05, 0xc6, 0x91, 0xdf, 0xb8, 0xe1, 0x19, 0x14, - 0x9a, 0x56, 0xb7, 0x3b, 0xa0, 0x3a, 0xd9, 0x37, 0x57, 0x41, 0x84, 0xf1, - 0x19, 0x93, 0x6d, 0xc8, 0x59, 0x38, 0x39, 0x3d, 0x87, 0xb7, 0x23, 0xd6, - 0x60, 0xd7, 0x44, 0x22, 0xad, 0x49, 0xc5, 0xed, 0x89, 0xb4, 0x17, 0x6f, - 0x48, 0x8f, 0x71, 0xe5, 0xb5, 0x94, 0x90, 0xb6, 0x5c, 0xb0, 0xca, 0x25, - 0xd7, 0x38, 0x4e, 0x98, 0x2d, 0x23, 0x4e, 0x20, 0xcb, 0xac, 0x30, 0xb1, - 0x15, 0x00, 0x82, 0xa1, 0x51, 0x92, 0x83, 0x98, 0x6e, 0x7a, 0xa4, 0xd8, - 0xdb, 0xf3, 0x31, 0xbd, 0x38, 0x3e, 0xa6, 0x6f, 0x06, 0xb5, 0xdc, 0xb2, - 0x24, 0x9f, 0x40, 0x54, 0x90, 0x83, 0x79, 0xcf, 0x78, 0x87, 0x88, 0xb5, - 0xd1, 0x98, 0x24, 0xcf, 0xfd, 0x69, 0x4d, 0xb7, 0x26, 0x5c, 0x93, 0x65, - 0xbb, 0x99, 0xc3, 0x7b, 0x97, 0x3a, 0x84, 0x19, 0x34, 0xf9, 0xcc, 0x5b, - 0xf1, 0x8f, 0x35, 0xdf, 0x26, 0xf7, 0xe4, 0xa5, 0xf8, 0x7a, 0x5d, 0xaf, - 0x3a, 0x52, 0xaa, 0x8c, 0x1e, 0x4c, 0xc9, 0x83, 0xbf, 0x01, 0x89, 0xa4, - 0xac, 0xb1, 0xc4, 0xb9, 0x7f, 0x44, 0xba, 0x29, 0x3f, 0x8f, 0xc9, 0xd5, - 0xad, 0x0e, 0x2f, 0xea, 0x2f, 0x85, 0xe5, 0xa5, 0x32, 0xec, 0x67, 0x9a, - 0xd4, 0x9a, 0xd4, 0x64, 0xeb, 0x82, 0x40, 0x5a, 0xb3, 0x7c, 0x9d, 0x05, - 0x3c, 0x72, 0x19, 0x3e, 0x88, 0x78, 0xba, 0x3f, 0x9b, 0xf1, 0x4c, 0xc0, - 0xd5, 0xf1, 0x9c, 0x3f, 0x76, 0x59, 0x4d, 0x50, 0x08, 0x9a, 0x79, 0x92, - 0x56, 0x9e, 0xa7, 0x70, 0x14, 0x61, 0x5b, 0xf9, 0xa3, 0x5c, 0xf5, 0x2d, - 0xa4, 0x8a, 0x6f, 0xca, 0x55, 0x88, 0x28, 0xcd, 0xe8, 0x47, 0x3c, 0xca, - 0xf3, 0xed, 0x2f, 0xb9, 0xf3, 0xba, 0xc9, 0x78, 0xc5, 0x78, 0xef, 0x5e, - 0x90, 0x45, 0x8c, 0x26, 0x88, 0x3c, 0x29, 0x07, 0x82, 0xc5, 0x02, 0x3c, - 0xcf, 0x2f, 0x1a, 0x35, 0xc7, 0x63, 0x64, 0xda, 0x51, 0x40, 0x29, 0x05, - 0x5d, 0xb9, 0xfa, 0x5b, 0xc1, 0xd2, 0x78, 0x0f, 0x0c, 0xd7, 0x21, 0x74, - 0xf9, 0x7a, 0x99, 0x94, 0x20, 0x96, 0x18, 0x9f, 0x59, 0x2b, 0xb7, 0xf2, - 0xfe, 0x72, 0xed, 0x72, 0xf5, 0x5e, 0xa8, 0x82, 0xb1, 0x1b, 0xc2, 0xfe, - 0x5a, 0x91, 0x47, 0x82, 0x4a, 0x7f, 0xd7, 0x4f, 0xc3, 0x1f, 0xc2, 0x86, - 0x9a, 0x93, 0xb0, 0xb7, 0x53, 0xc3, 0xaf, 0xd1, 0x26, 0x8b, 0xe6, 0x39, - 0x37, 0x78, 0x8f, 0xf1, 0x88, 0x88, 0xa4, 0x4d, 0x79, 0xfd, 0x09, 0xc5, - 0x9f, 0xa8, 0x4f, 0x58, 0xc4, 0x12, 0x56, 0x6f, 0xec, 0x95, 0x1b, 0x6f, - 0x99, 0x23, 0xbb, 0x40, 0x7d, 0x07, 0x9f, 0x17, 0xbb, 0xbf, 0xad, 0xef, - 0xe1, 0xde, 0x2e, 0xc0, 0x9c, 0x39, 0x00, 0xb9, 0x0b, 0x1e, 0x69, 0xce, - 0x85, 0xf2, 0xce, 0xfe, 0x66, 0xee, 0xb4, 0x87, 0x36, 0x9a, 0x30, 0xe4, - 0xbb, 0xb7, 0x63, 0x52, 0x3f, 0xa9, 0x41, 0x4d, 0xa0, 0x07, 0x05, 0xcd, - 0xcc, 0xeb, 0x20, 0x70, 0x6a, 0x19, 0x95, 0x85, 0x83, 0x92, 0x07, 0x53, - 0x1d, 0xbc, 0x3d, 0x62, 0x0d, 0xb2, 0x85, 0x50, 0x1b, 0x82, 0x85, 0xcb, - 0x41, 0x33, 0xae, 0xa0, 0x4a, 0xad, 0x55, 0xd0, 0x6f, 0xf3, 0xe7, 0x84, - 0x63, 0x54, 0xb9, 0x46, 0x76, 0xa1, 0x4a, 0x34, 0xaf, 0xfa, 0xc3, 0x66, - 0xc5, 0x35, 0x37, 0xb2, 0x6f, 0xfe, 0x1c, 0x55, 0xf3, 0x3b, 0x93, 0x56, - 0x9e, 0x9b, 0xbe, 0xbe, 0x74, 0x18, 0x4c, 0x95, 0x43, 0x9f, 0xae, 0x17, - 0xfe, 0xb2, 0x00, 0x6b, 0xde, 0x9f, 0x6b, 0x32, 0x8b, 0x9a, 0x84, 0x59, - 0x2a, 0x74, 0xaa, 0x23, 0x7a, 0xc9, 0x7f, 0x0d, 0x42, 0x64, 0x6f, 0xca, - 0x7f, 0x78, 0x41, 0x3f, 0xfa, 0xfd, 0xed, 0xa5, 0x3f, 0x2b, 0xaa, 0x12, - 0x18, 0x10, 0xa1, 0xa4, 0xc6, 0x45, 0x7b, 0x97, 0xb5, 0xb3, 0x08, 0x3a, - 0x03, 0xb9, 0xb3, 0x2a, 0xcc, 0x0b, 0xe7, 0x9e, 0xd0, 0x1c, 0xfc, 0x48, - 0x32, 0x33, 0x66, 0xa6, 0x68, 0x6b, 0x43, 0xbc, 0xcc, 0xdf, 0xb3, 0xd8, - 0xc3, 0xe8, 0x89, 0xae, 0x29, 0x07, 0xfa, 0xdc, 0xe9, 0x05, 0x40, 0x4a, - 0x23, 0x40, 0xd0, 0x63, 0xd7, 0xf6, 0x4f, 0xb1, 0xe0, 0x31, 0x52, 0xe9, - 0x11, 0x05, 0x78, 0x62, 0xe3, 0x1e, 0x1a, 0x12, 0xff, 0x80, 0xb5, 0x0a, - 0x70, 0x0e, 0xf4, 0x89, 0xa2, 0x44, 0x49, 0x5f, 0xe0, 0x52, 0x94, 0x9f, - 0x91, 0xa1, 0xd8, 0x90, 0xc4, 0xe7, 0x81, 0xdf, 0x78, 0x65, 0x89, 0xcc, - 0x0a, 0x7d, 0x7f, 0xce, 0x10, 0xb1, 0xf4, 0x63, 0x79, 0xa8, 0x70, 0x6b, - 0xe5, 0x02, 0x99, 0xdd, 0xea, 0x56, 0x54, 0x71, 0xc7, 0x63, 0x15, 0xcc, - 0xa4, 0x83, 0x0b, 0xe6, 0x9e, 0x0a, 0xa1, 0x95, 0xac, 0x36, 0x4c, 0xa7, - 0x73, 0x1a, 0x9e, 0x71, 0x86, 0x6e, 0x28, 0x80, 0x64, 0x16, 0x58, 0x12, - 0x3a, 0x7e, 0x90, 0x8c, 0x25, 0xc2, 0xba, 0x60, 0x60, 0x99, 0xad, 0x0b, - 0xb4, 0x9c, 0x57, 0x80, 0x5d, 0xa9, 0x0d, 0x8e, 0xd8, 0x83, 0xdd, 0x8a, - 0xe4, 0x24, 0x28, 0x4e, 0x9a, 0xae, 0xeb, 0x50, 0x89, 0x70, 0xf7, 0xc3, - 0xaf, 0x8a, 0xc9, 0xdf, 0x4c, 0x7e, 0x61, 0x43, 0xb0, 0xe5, 0x7f, 0x98, - 0x28, 0x2c, 0xde, 0x5c, 0xe9, 0x66, 0xb1, 0xbf, 0x8c, 0x41, 0x54, 0x17, - 0xc0, 0xcb, 0xcb, 0x89, 0x29, 0x47, 0x2d, 0x44, 0x90, 0x6b, 0x9d, 0x0d, - 0x78, 0x80, 0x89, 0x59, 0xa2, 0xd1, 0x91, 0x4d, 0x71, 0xa5, 0xac, 0x25, - 0x49, 0x75, 0x76, 0x48, 0x68, 0x52, 0xfe, 0x19, 0xe6, 0x75, 0x57, 0x3c, - 0x49, 0x64, 0xce, 0x5b, 0x11, 0x9d, 0x89, 0x92, 0x94, 0xc6, 0x2d, 0x83, - 0xf7, 0xbb, 0xb8, 0x07, 0xa6, 0xc2, 0x21, 0x66, 0xd8, 0xcb, 0x0d, 0x1a, - 0xd8, 0x55, 0x76, 0xab, 0x58, 0xec, 0x7b, 0xdb, 0x40, 0x45, 0xc5, 0xdd, - 0x91, 0xd1, 0xcc, 0x23, 0x46, 0x6d, 0xb2, 0x5a, 0x5d, 0x15, 0x25, 0x17, - 0xe5, 0x2d, 0x00, 0x65, 0x63, 0x20, 0x6c, 0xc6, 0x7b, 0x2a, 0x10, 0xff, - 0x51, 0xb0, 0x0c, 0x01, 0x30, 0xb4, 0x0f, 0x32, 0xf1, 0x7d, 0x6a, 0xe9, - 0x7b, 0x8b, 0x00, 0x72, 0xa2, 0x0e, 0x1a, 0x35, 0xef, 0x89, 0x8c, 0x1e, - 0xe8, 0xad, 0x62, 0x62, 0x44, 0x18, 0x24, 0xb9, 0xab, 0x8e, 0x5d, 0x1e, - 0xc8, 0x47, 0x77, 0x48, 0xa8, 0x8d, 0x48, 0x9a, 0x21, 0x16, 0x0b, 0x36, - 0xd8, 0x00, 0xb2, 0xd0, 0x73, 0xaa, 0xa4, 0x15, 0xbd, 0x81, 0xb0, 0x1c, - 0x59, 0xbb, 0x23, 0xf4, 0x64, 0xb1, 0xff, 0x44, 0xfc, 0x7c, 0x35, 0x61, - 0x62, 0x12, 0xe6, 0xcf, 0x3c, 0x93, 0xdd, 0x63, 0xe7, 0x03, 0xb2, 0x55, - 0xc1, 0x15, 0x39, 0xe4, 0xc6, 0xda, 0xbf, 0xe6, 0x01, 0x9c, 0xad, 0x48, - 0xf5, 0x6b, 0x2d, 0xe8, 0x17, 0x89, 0xf3, 0xc8, 0x34, 0xf1, 0xce, 0xca, - 0xbc, 0x15, 0x74, 0x27, 0xa3, 0x8f, 0x46, 0x82, 0x0b, 0x3c, 0xb8, 0x31, - 0xdf, 0x1d, 0xcd, 0x2c, 0x87, 0x0b, 0x1c, 0x14, 0x6d, 0xed, 0xcc, 0x49, - 0x42, 0x16, 0xf4, 0x6c, 0x04, 0x87, 0xd0, 0x87, 0x6b, 0xcf, 0x04, 0xd3, - 0xcd, 0x7b, 0x96, 0x54, 0x16, 0xe6, 0x38, 0xa7, 0x56, 0x9f, 0x68, 0x8e, - 0x3f, 0x39, 0x39, 0xe5, 0x2c, 0x3a, 0x04, 0x12, 0x43, 0xfc, 0x3d, 0x0f, - 0x18, 0x1b, 0x9e, 0x17, 0xdd, 0x40, 0x14, 0xe3, 0x02, 0x37, 0xc1, 0xec, - 0x96, 0x6b, 0xa8, 0x1d, 0x04, 0xd8, 0x57, 0x82, 0x2f, 0x0e, 0x43, 0xa3, - 0xc5, 0xfa, 0xcf, 0x98, 0xe2, 0xb9, 0x8f, 0xf9, 0xd4, 0x1e, 0xba, 0x05, - 0x6d, 0x26, 0xd0, 0x22, 0x9e, 0xb5, 0xf1, 0x30, 0x21, 0x48, 0xfe, 0xfe, - 0x7a, 0x22, 0xc0, 0x76, 0xcf, 0x94, 0x08, 0x28, 0x6f, 0xfd, 0x17, 0xb9, - 0xe6, 0xba, 0xf9, 0x51, 0xb7, 0xd5, 0x1d, 0x40, 0x41, 0xb4, 0x7a, 0x06, - 0xf1, 0x52, 0x56, 0x61, 0xde, 0x02, 0x24, 0x8f, 0x75, 0x6d, 0x61, 0xb7, - 0x85, 0x5a, 0xe1, 0xbe, 0x3a, 0xdd, 0x47, 0x5e, 0xe6, 0x36, 0xdf, 0x03, - 0xc3, 0x7b, 0xe8, 0x6f, 0xa1, 0x1a, 0xab, 0xc2, 0xd3, 0x8a, 0x5e, 0xd1, - 0xd1, 0x9e, 0xa7, 0xcf, 0x1a, 0x7e, 0x5d, 0xab, 0x18, 0x70, 0x1a, 0x73, - 0xe8, 0xd9, 0x39, 0x3b, 0x1a, 0xdd, 0x75, 0x56, 0x4a, 0x4c, 0x9e, 0xcd, - 0xec, 0x36, 0xdf, 0x73, 0xaf, 0xc9, 0xfd, 0x28, 0x17, 0xe8, 0x5a, 0x16, - 0x18, 0xbe, 0x25, 0x54, 0x11, 0x55, 0x50, 0x5b, 0xf9, 0xc9, 0x44, 0xe1, - 0xcc, 0x11, 0x11, 0xa7, 0xc8, 0x71, 0x06, 0x57, 0x0b, 0x4e, 0x22, 0xd5, - 0xf5, 0x3b, 0x26, 0x0e, 0x20, 0xb6, 0x82, 0x9e, 0x80, 0x42, 0x13, 0x86, - 0x84, 0x0e, 0x69, 0x7d, 0xba, 0x44, 0xe4, 0x9c, 0x0e, 0xeb, 0xf9, 0xa1, - 0x5c, 0x65, 0xad, 0xa2, 0x3f, 0x36, 0xc6, 0x92, 0xb9, 0x95, 0x6a, 0x46, - 0x9e, 0x27, 0xcb, 0xdc, 0xd9, 0x1d, 0xb0, 0xd9, 0xb8, 0xb4, 0x96, 0x25, - 0xe8, 0x8d, 0xfc, 0x2c, 0x26, 0x08, 0xa0, 0x42, 0x02, 0x03, 0xe5, 0x02, - 0xd9, 0x43, 0x85, 0xab, 0xda, 0x90, 0x11, 0x43, 0x19, 0x2f, 0x6b, 0xb3, - 0x3f, 0x82, 0xc4, 0x5f, 0xbc, 0x1e, 0x39, 0x58, 0x27, 0xd0, 0x15, 0xf5, - 0x7a, 0xdc, 0xe8, 0x9d, 0x3b, 0x9f, 0xc1, 0x69, 0x06, 0x42, 0xcd, 0xf9, - 0xed, 0x24, 0x0b, 0x7e, 0x14, 0x79, 0xbe, 0x1b, 0xf3, 0x2f, 0x4a, 0x33, - 0xa4, 0xed, 0xd1, 0xc3, 0xb8, 0x24, 0x07, 0x62, 0xe2, 0x11, 0x46, 0xf1, - 0x54, 0x10, 0xcf, 0x80, 0xb5, 0x06, 0xe3, 0xbf, 0x97, 0xff, 0xd4, 0x9a, - 0x64, 0x3e, 0xc8, 0x90, 0x05, 0xf1, 0x15, 0x0e, 0xca, 0x74, 0xf0, 0x16, - 0xba, 0xfe, 0x0a, 0x12, 0x34, 0x2e, 0xb8, 0xab, 0x93, 0x62, 0xe8, 0x1b, - 0xfb, 0xb7, 0x18, 0x9b, 0x79, 0x1d, 0xa8, 0x0f, 0x08, 0x33, 0x38, 0x9d, - 0x33, 0x49, 0x26, 0x57, 0xbb, 0x0e, 0xe6, 0xf3, 0x95, 0x05, 0xb2, 0x61, - 0x66, 0x1d, 0xfc, 0x24, 0xb5, 0xb0, 0xfb, 0xf0, 0x1f, 0x7f, 0xff, 0xcf, - 0x2d, 0x45, 0xf3, 0xdb, 0x9c, 0x65, 0x98, 0xa2, 0x17, 0xa8, 0xd0, 0x16, - 0x9b, 0xb5, 0x7a, 0xc7, 0x16, 0x27, 0xd9, 0x9d, 0x70, 0xf7, 0x26, 0x73, - 0x90, 0x99, 0xd2, 0x24, 0xf0, 0x50, 0x0d, 0x59, 0xc6, 0x07, 0xf3, 0xae, - 0x5d, 0x52, 0xbd, 0xca, 0x24, 0x39, 0x19, 0xcf, 0x81, 0x77, 0xf9, 0x51, - 0xcc, 0x4c, 0x02, 0xe2, 0xb8, 0xd5, 0x54, 0x40, 0xa1, 0x05, 0x21, 0xf6, - 0x9f, 0x2a, 0x8d, 0xd4, 0xc1, 0x74, 0x5f, 0x58, 0x9b, 0x0b, 0xbf, 0xf1, - 0xa1, 0xdf, 0xc0, 0x0b, 0x3e, 0x8a, 0xc2, 0xb4, 0x02, 0x0b, 0x45, 0x5c, - 0x94, 0x0a, 0xe8, 0xa8, 0xec, 0x8f, 0xc8, 0xf1, 0x60, 0x71, 0x60, 0x92, - 0x23, 0xe4, 0x05, 0x3a, 0xd5, 0x67, 0x97, 0x15, 0xa8, 0x9c, 0x30, 0xd1, - 0x4b, 0xc0, 0xcb, 0x9b, 0xf8, 0x5c, 0xe5, 0x3a, 0x22, 0x52, 0x71, 0xba, - 0x16, 0xd3, 0x18, 0xf5, 0x2f, 0x74, 0xc3, 0x9e, 0xfc, 0x02, 0x27, 0x92, - 0x30, 0x9a, 0x4e, 0x48, 0x88, 0x2e, 0x5f, 0x62, 0x11, 0x14, 0x89, 0x63, - 0x41, 0x31, 0x6a, 0x45, 0xec, 0xd5, 0x03, 0xcb, 0x2e, 0x8a, 0xe0, 0x3f, - 0x51, 0x39, 0x86, 0x57, 0x38, 0x27, 0xd6, 0xf8, 0xb5, 0xb2, 0x86, 0xc5, - 0x07, 0x85, 0x75, 0x0d, 0x45, 0x90, 0x53, 0xae, 0x5d, 0x71, 0xab, 0xf4, - 0x91, 0x0f, 0x1e, 0xbd, 0x85, 0x29, 0x7b, 0x70, 0xf9, 0x7a, 0x29, 0x19, - 0xde, 0x40, 0xdb, 0x52, 0x44, 0x93, 0x76, 0x56, 0x57, 0x80, 0x18, 0x3c, - 0xd7, 0xef, 0x25, 0x9d, 0x37, 0x08, 0x5d, 0xb4, 0x64, 0x4a, 0x00, 0x1b, - 0x38, 0x47, 0x39, 0x9e, 0x4d, 0x50, 0x9a, 0x98, 0x34, 0x79, 0xc7, 0xa9, - 0x58, 0xe9, 0xa5, 0x04, 0x9d, 0x97, 0xd6, 0x72, 0x9c, 0x17, 0x3c, 0x08, - 0x24, 0x90, 0x55, 0x8f, 0xa9, 0xad, 0x6e, 0xf3, 0x97, 0x39, 0x8a, 0x69, - 0xde, 0x04, 0x61, 0x19, 0xe5, 0xf5, 0xf1, 0x37, 0xe9, 0x96, 0x6e, 0x52, - 0x5f, 0x27, 0xdc, 0xd5, 0xe5, 0x07, 0x5b, 0x46, 0x81, 0xae, 0xac, 0x2e, - 0x5d, 0x9d, 0x98, 0xeb, 0xe9, 0xd6, 0x73, 0x3d, 0xd7, 0x2c, 0x9f, 0x32, - 0xe3, 0xb3, 0xf3, 0x57, 0x61, 0xa5, 0x16, 0x36, 0x4b, 0xc7, 0x1e, 0x88, - 0xaa, 0x7a, 0x86, 0xc9, 0xd7, 0x42, 0x88, 0x72, 0xc8, 0x09, 0x18, 0x3e, - 0x23, 0xf6, 0xb7, 0x0e, 0x11, 0xd9, 0x18, 0x4c, 0xee, 0x0c, 0xac, 0x95, - 0x28, 0x61, 0x03, 0xda, 0x0a, 0x58, 0x29, 0x86, 0x12, 0xe9, 0x8c, 0xef, - 0xa4, 0xb9, 0x17, 0x73, 0xe5, 0x52, 0x33, 0x84, 0xb4, 0xb7, 0x48, 0x4b, - 0xe6, 0xb0, 0x70, 0x9e, 0x8e, 0x53, 0x24, 0xfd, 0x12, 0x6a, 0x1e, 0xf9, - 0x29, 0x71, 0x1e, 0x19, 0x0f, 0x36, 0x7a, 0xad, 0xb2, 0xeb, 0x14, 0x6f, - 0x4f, 0xab, 0x15, 0x1f, 0x13, 0xc5, 0xbd, 0x90, 0x29, 0xf6, 0x6a, 0x88, - 0x65, 0xac, 0x66, 0x5e, 0xde, 0xe6, 0x74, 0x5c, 0x4a, 0xee, 0x7a, 0xf1, - 0xb6, 0x9b, 0xe6, 0x58, 0xee, 0x34, 0xc6, 0x99, 0x31, 0x45, 0x7c, 0xeb, - 0x73, 0x60, 0x52, 0x1d, 0x12, 0x1e, 0xf1, 0x20, 0xf6, 0x78, 0xb6, 0xbe, - 0xd5, 0xbf, 0xed, 0xf2, 0x7f, 0x99, 0x55, 0x5e, 0x84, 0xf9, 0xd1, 0xea, - 0xe9, 0xa3, 0x7d, 0xaa, 0xda, 0x9d, 0x4f, 0xac, 0x4c, 0xf5, 0xb1, 0x42, - 0xb3, 0xcc, 0x34, 0x5c, 0x32, 0x17, 0x6f, 0x59, 0xc1, 0x1c, 0x97, 0x16, - 0x9f, 0x18, 0x73, 0x4c, 0x39, 0x42, 0x68, 0x35, 0x7f, 0xf8, 0x0e, 0x42, - 0x9e, 0x8b, 0x96, 0xd3, 0x36, 0x27, 0x32, 0x09, 0x6d, 0x9c, 0x26, 0xab, - 0xf8, 0x83, 0xf6, 0xef, 0x86, 0x71, 0x7e, 0x1e, 0xc1, 0x99, 0xd7, 0x59, - 0x60, 0x61, 0x56, 0xca, 0x79, 0xed, 0xce, 0x8e, 0x14, 0xe0, 0x1b, 0xe9, - 0xdb, 0x66, 0xa7, 0xd1, 0xa3, 0x6d, 0xe2, 0x7c, 0x43, 0x17, 0xd5, 0x70, - 0x51, 0x90, 0xb1, 0x1b, 0x58, 0x2b, 0xa2, 0x1a, 0x7d, 0xb2, 0xdb, 0x4e, - 0x6d, 0x77, 0x9f, 0x1d, 0xd5, 0x06, 0x36, 0x9d, 0x1b, 0x5f, 0x74, 0xe0, - 0x6f, 0x5b, 0x83, 0x7e, 0xdd, 0x1d, 0xca, 0x27, 0xbf, 0x9a, 0x3f, 0x41, - 0xcc, 0x0f, 0xc9, 0x2c, 0x0a, 0x33, 0x11, 0xdd, 0xcd, 0x68, 0x13, 0xe5, - 0xb4, 0x37, 0xaa, 0xd9, 0x6d, 0xa2, 0x83, 0xea, 0x1e, 0x04, 0xa6, 0xf2, - 0x6a, 0xf6, 0xfb, 0x93, 0x98, 0x4f, 0x31, 0xd5, 0x72, 0x07, 0x3a, 0x1b, - 0xa1, 0xdb, 0xd0, 0xdb, 0x4a, 0xa7, 0x12, 0x28, 0xc8, 0x44, 0xcc, 0x2f, - 0xf7, 0x30, 0xfc, 0x53, 0x89, 0x1d, 0xd4, 0x8c, 0x7d, 0xa2, 0x32, 0x74, - 0xcf, 0xc4, 0xac, 0x28, 0x03, 0xe7, 0xe1, 0x34, 0x9e, 0x99, 0xdc, 0x85, - 0xea, 0xbf, 0x50, 0x85, 0x5c, 0x33, 0x2a, 0x23, 0x86, 0x84, 0x28, 0x47, - 0x2d, 0x80, 0x62, 0x43, 0xa5, 0x09, 0x38, 0x13, 0x2e, 0x8f, 0x94, 0x0e, - 0xc7, 0x9e, 0xa9, 0x4f, 0x52, 0xea, 0xcc, 0x74, 0x1d, 0xf2, 0x75, 0x87, - 0x65, 0xda, 0xc8, 0xb3, 0xe0, 0x59, 0x7b, 0x0b, 0x91, 0x6f, 0x75, 0xf1, - 0xb1, 0x5a, 0x4e, 0xf9, 0xd5, 0x16, 0x92, 0x9f, 0x20, 0xcf, 0x13, 0xe3, - 0x0d, 0xc2, 0x9f, 0x58, 0x13, 0x7a, 0x29, 0xe4, 0x44, 0x97, 0xc9, 0xf5, - 0xe6, 0x17, 0x99, 0x39, 0xd4, 0xbb, 0xc3, 0x86, 0xbb, 0x05, 0x28, 0x6c, - 0x7f, 0xb6, 0xfc, 0xcd, 0xf2, 0xc2, 0xfd, 0x72, 0xd1, 0xdb, 0xc0, 0x1e, - 0x42, 0x5c, 0x91, 0xe7, 0x77, 0x2d, 0x2a, 0x9a, 0x85, 0xfc, 0x7b, 0x36, - 0x0f, 0x75, 0x28, 0x7b, 0xbd, 0x55, 0xee, 0x7f, 0xae, 0xb2, 0xd5, 0xf9, - 0x2d, 0x84, 0xfa, 0x22, 0xf5, 0x93, 0x39, 0x12, 0x6b, 0x13, 0x87, 0x11, - 0xa8, 0x42, 0x9d, 0x64, 0x65, 0x31, 0xf1, 0xf4, 0x54, 0x81, 0xa7, 0xb2, - 0x54, 0xcf, 0x42, 0xc8, 0x74, 0x9e, 0x97, 0x66, 0x0a, 0x00, 0x42, 0xee, - 0x75, 0xc0, 0xd2, 0xc3, 0xa2, 0xe0, 0x80, 0xf9, 0x09, 0xac, 0x17, 0x5e, - 0x61, 0x35, 0xa0, 0x2f, 0x78, 0xac, 0xb4, 0xb9, 0x81, 0x78, 0x50, 0x0c, - 0x05, 0xc0, 0x2c, 0xf3, 0xa1, 0x10, 0x8b, 0x34, 0x12, 0x6b, 0xd7, 0x66, - 0x98, 0x33, 0x2f, 0xd5, 0xd0, 0x54, 0xa6, 0x88, 0x1e, 0x36, 0xbc, 0xc2, - 0xe4, 0x96, 0xbc, 0x15, 0xd2, 0x74, 0xe6, 0xc8, 0x6e, 0x97, 0x28, 0x35, - 0x94, 0x2f, 0xbc, 0xef, 0x8b, 0xce, 0xa1, 0x7b, 0xd7, 0xd4, 0xc0, 0x49, - 0x5f, 0xf1, 0xd5, 0x82, 0x91, 0x5e, 0x0d, 0xe6, 0xdd, 0x21, 0xa2, 0x90, - 0x1d, 0x9c, 0xa7, 0xaf, 0x47, 0xfa, 0x69, 0x38, 0x9d, 0xf4, 0x38, 0x80, - 0xda, 0xd7, 0xb3, 0xe1, 0x3f, 0xca, 0x09, 0xb0, 0x11, 0x5e, 0xbd, 0x49, - 0x16, 0x63, 0x81, 0xfc, 0x40, 0x0a, 0x68, 0x2d, 0xcb, 0x54, 0x26, 0x39, - 0x24, 0x9a, 0x66, 0xb3, 0xdc, 0x1e, 0x43, 0x25, 0x1c, 0x12, 0xcf, 0x24, - 0x98, 0x85, 0x5d, 0xb2, 0xb0, 0x77, 0xda, 0xec, 0x81, 0xdf, 0x10, 0x28, - 0xfc, 0x66, 0x8c, 0x01, 0xf0, 0x7d, 0xc8, 0xf0, 0xdf, 0x27, 0x1d, 0x02, - 0x11, 0x1b, 0x2d, 0x2e, 0x0c, 0xde, 0xc1, 0x62, 0xfd, 0x38, 0x05, 0xf2, - 0x4f, 0x83, 0xe9, 0x3e, 0xad, 0x25, 0x07, 0xb6, 0xa8, 0xf8, 0x48, 0xc9, - 0x1f, 0x1f, 0xdf, 0x9f, 0x61, 0xfc, 0x2f, 0x79, 0x73, 0xbb, 0xb9, 0x92, - 0xc4, 0x54, 0xfe, 0x8e, 0xcf, 0x08, 0x91, 0x47, 0x64, 0x93, 0xee, 0x74, - 0xc3, 0x36, 0x20, 0x89, 0xb1, 0x20, 0xf3, 0xe1, 0x4a, 0x45, 0x18, 0x62, - 0x1e, 0xbe, 0xe1, 0xc2, 0xdb, 0x3d, 0x30, 0x8e, 0xc5, 0x46, 0xfa, 0x7b, - 0xf0, 0x9c, 0x9a, 0xc7, 0xc8, 0x8d, 0xbc, 0x3f, 0xbf, 0x4f, 0xd1, 0x16, - 0x78, 0x6a, 0x82, 0x75, 0xc4, 0x18, 0xe7, 0x6b, 0x86, 0xe5, 0xaa, 0x74, - 0xa5, 0x15, 0xec, 0xa6, 0x6b, 0xf2, 0xc9, 0x20, 0x0c, 0x67, 0xdc, 0x44, - 0x2a, 0x19, 0x4f, 0xb8, 0x60, 0x14, 0xa7, 0x0a, 0xc4, 0x06, 0xef, 0xcb, - 0xb2, 0x98, 0x1d, 0x45, 0xda, 0x39, 0x83, 0xd3, 0xa0, 0xd8, 0xac, 0xe1, - 0x22, 0xb5, 0x43, 0x3a, 0x2e, 0x86, 0xf4, 0x49, 0x90, 0x38, 0x82, 0x75, - 0x60, 0x48, 0x93, 0xc5, 0xb0, 0x6b, 0x58, 0x0b, 0x9f, 0xb0, 0x31, 0xcc, - 0x38, 0x41, 0x32, 0x60, 0xda, 0x18, 0x01, 0x90, 0x51, 0x8a, 0x9a, 0x60, - 0x54, 0xd4, 0xc1, 0x10, 0x59, 0x70, 0x85, 0x51, 0x53, 0xd8, 0x1e, 0xc8, - 0x94, 0x8c, 0xcd, 0x79, 0x16, 0x2a, 0x39, 0x6f, 0x0f, 0x11, 0x59, 0x74, - 0x8e, 0x2f, 0x7f, 0x08, 0x98, 0x37, 0xf0, 0x4f, 0x55, 0x27, 0xde, 0x56, - 0x61, 0x15, 0xc2, 0x33, 0xf5, 0xec, 0x76, 0x4e, 0x5a, 0x0d, 0xdf, 0x8d, - 0x52, 0xe9, 0x26, 0x9c, 0x88, 0x08, 0xce, 0xe2, 0x75, 0xe4, 0xbf, 0x7a, - 0x56, 0x97, 0x89, 0x28, 0x4a, 0x43, 0x2f, 0xed, 0xce, 0x1c, 0x57, 0x33, - 0xb6, 0xc7, 0x6a, 0x2a, 0x6e, 0xd6, 0x45, 0x4c, 0x9a, 0x58, 0x6e, 0x0c, - 0x32, 0xcb, 0x81, 0xf0, 0x62, 0x4f, 0x4c, 0xbf, 0xf1, 0xe4, 0xa6, 0x6f, - 0x6f, 0x7d, 0xa2, 0xae, 0xba, 0x10, 0xa7, 0x5d, 0xcd, 0x75, 0xde, 0x4c, - 0xb4, 0xb0, 0xea, 0x81, 0x82, 0x3f, 0x05, 0xf6, 0x1a, 0x4e, 0x80, 0xc4, - 0x00, 0xcb, 0x83, 0xef, 0xe8, 0x61, 0x1e, 0xf4, 0xdd, 0xf2, 0x89, 0x35, - 0x60, 0x3a, 0x52, 0xbb, 0x1e, 0xdb, 0x97, 0x00, 0x5e, 0x02, 0xaa, 0x50, - 0xa0, 0xf6, 0x41, 0xe2, 0x90, 0x95, 0xc5, 0x77, 0x1b, 0x3d, 0x8d, 0xdd, - 0x00, 0xea, 0xdd, 0x09, 0xd6, 0x31, 0x4f, 0x7c, 0xfb, 0x9e, 0x0d, 0x82, - 0x75, 0x63, 0x80, 0xec, 0xc4, 0xef, 0x9b, 0xa5, 0x38, 0xb1, 0xe6, 0xa0, - 0x97, 0xe3, 0x23, 0xd5, 0xfc, 0xe6, 0x2f, 0x8c, 0x75, 0x5d, 0xb4, 0x06, - 0x9e, 0x41, 0x91, 0x0c, 0x03, 0x3d, 0xc5, 0xcf, 0x99, 0x92, 0xf4, 0x88, - 0x25, 0x36, 0x2a, 0x85, 0x89, 0x59, 0x0b, 0xcd, 0x88, 0x7c, 0xbc, 0x37, - 0x33, 0xf1, 0x95, 0x55, 0xeb, 0xe0, 0xaf, 0x8e, 0x8d, 0xe4, 0x09, 0x27, - 0xcd, 0xfc, 0x4f, 0x67, 0x72, 0x87, 0x1c, 0xea, 0xcc, 0x62, 0x2e, 0x7b, - 0x5a, 0xf0, 0x7b, 0xd6, 0x80, 0xde, 0x10, 0xda, 0x3b, 0xd1, 0x6b, 0xe3, - 0x9f, 0x58, 0xb7, 0x9d, 0xf2, 0x86, 0xb0, 0x38, 0x20, 0x81, 0x19, 0x9e, - 0x88, 0x25, 0x05, 0x41, 0x0c, 0xb7, 0x08, 0x65, 0xc6, 0xe7, 0xcf, 0xa2, - 0xb0, 0x8e, 0x3d, 0x1d, 0xf9, 0x01, 0x67, 0xed, 0xeb, 0x8d, 0x2b, 0xa9, - 0xa0, 0xb5, 0x97, 0x41, 0x6d, 0x4f, 0x5a, 0x76, 0x8b, 0xd9, 0x33, 0x53, - 0x33, 0x2c, 0xae, 0x7b, 0xb4, 0x60, 0xcf, 0x9c, 0x61, 0xe5, 0x0d, 0xeb, - 0x8f, 0xcc, 0xf0, 0x4c, 0x3c, 0x65, 0x95, 0x4f, 0x87, 0x16, 0x8f, 0x3d, - 0xeb, 0x87, 0x23, 0x83, 0x26, 0x2e, 0x5e, 0x6d, 0x01, 0x10, 0xb2, 0xfd, - 0x67, 0xbd, 0x55, 0x46, 0xef, 0xab, 0x77, 0x32, 0x49, 0x23, 0xa5, 0x7f, - 0xd0, 0x24, 0xb4, 0x90, 0xd4, 0xfb, 0x26, 0xd9, 0xb4, 0x19, 0x6a, 0xab, - 0xbb, 0xfc, 0x59, 0xac, 0x30, 0x01, 0xca, 0xa2, 0x4d, 0xda, 0x01, 0xf2, - 0x1c, 0x70, 0x52, 0x97, 0xe9, 0x9e, 0x8b, 0x6d, 0xcd, 0x84, 0x9b, 0xb4, - 0xbb, 0xa4, 0x2f, 0x75, 0xf1, 0xcb, 0x7d, 0xf8, 0x18, 0xf0, 0x8d, 0x02, - 0x29, 0xc6, 0xc7, 0x34, 0x07, 0xa6, 0x5d, 0x63, 0xf6, 0x1f, 0x66, 0x66, - 0x7f, 0x83, 0xc1, 0x7f, 0xb8, 0xc3, 0xe0, 0xb7, 0x9b, 0xfa, 0x87, 0x6b, - 0x4c, 0xfd, 0x3a, 0x23, 0xff, 0xf0, 0xd5, 0x8c, 0x7c, 0xab, 0x79, 0x7f, - 0xf8, 0x3a, 0xe6, 0x7d, 0x8d, 0x61, 0x7f, 0x98, 0x19, 0xf6, 0x65, 0x93, - 0x3e, 0xcb, 0x90, 0x6f, 0xb1, 0xe6, 0x0f, 0x67, 0xd6, 0x7c, 0xb5, 0x1d, - 0x7f, 0x90, 0xec, 0xf8, 0xa2, 0x05, 0x7f, 0x38, 0xb7, 0xe0, 0xdb, 0x6c, - 0xf7, 0xc3, 0x25, 0xdb, 0x9d, 0xfb, 0x14, 0x9e, 0x00, 0x8d, 0xaa, 0x53, - 0xe1, 0xb5, 0x14, 0xf1, 0x83, 0x9c, 0xc3, 0x10, 0x1a, 0x77, 0xfe, 0x92, - 0xe8, 0xba, 0x4a, 0xa0, 0x1e, 0x1b, 0xfc, 0x08, 0xeb, 0x99, 0x36, 0x07, - 0x87, 0x28, 0x70, 0x79, 0x64, 0x39, 0x19, 0x57, 0x61, 0xe4, 0xc5, 0x8f, - 0x1b, 0x01, 0x05, 0x12, 0x7e, 0x6b, 0xde, 0xed, 0x4c, 0x58, 0xcc, 0xb9, - 0x27, 0x3a, 0x0a, 0xd4, 0x48, 0xf1, 0x2a, 0x59, 0xe7, 0x6d, 0x11, 0xf9, - 0xca, 0x84, 0x91, 0x9a, 0x04, 0xc8, 0xe5, 0x5a, 0x8c, 0x0d, 0xad, 0x99, - 0x4f, 0x2b, 0x19, 0x42, 0xa3, 0xa6, 0x08, 0x97, 0x6f, 0x66, 0xfa, 0x95, - 0x76, 0x14, 0x57, 0x7a, 0xde, 0xc8, 0x8b, 0x4e, 0xa1, 0x69, 0x67, 0x5d, - 0x0d, 0xa5, 0x4b, 0xdf, 0xcd, 0x69, 0xdf, 0x0d, 0x26, 0xc9, 0x21, 0x06, - 0x0c, 0xa6, 0x13, 0xe6, 0xf2, 0xca, 0x12, 0x31, 0x57, 0x23, 0xc5, 0x6a, - 0xd1, 0x57, 0x64, 0x56, 0x94, 0x73, 0x31, 0x28, 0x23, 0x91, 0x5c, 0x4b, - 0x89, 0xc3, 0x7c, 0x7e, 0x5f, 0xea, 0x9a, 0x5c, 0xae, 0x1a, 0xb1, 0x4c, - 0x67, 0xab, 0xdc, 0xc6, 0xd4, 0xdf, 0x43, 0x04, 0x71, 0x00, 0x31, 0xb9, - 0x22, 0xff, 0xbe, 0x32, 0xe5, 0xee, 0xea, 0x02, 0xcc, 0x03, 0x51, 0xa8, - 0xe6, 0x68, 0x39, 0xae, 0x21, 0x84, 0xa2, 0xe7, 0x0d, 0xf9, 0xc3, 0x3c, - 0xd3, 0xc6, 0x20, 0xdd, 0x4a, 0xb0, 0x5b, 0xfc, 0x8c, 0x26, 0xb5, 0x6a, - 0x45, 0x52, 0x2c, 0x13, 0xe6, 0x4c, 0x36, 0x47, 0xfd, 0xf9, 0xbb, 0xa5, - 0xea, 0xd1, 0x1b, 0x4a, 0x7d, 0xdd, 0x34, 0x3b, 0xb8, 0xc6, 0x4f, 0xfc, - 0x78, 0xd1, 0x1a, 0x2b, 0x24, 0xcb, 0xfe, 0x69, 0x77, 0xb0, 0x7d, 0xb7, - 0xb9, 0xf6, 0xf3, 0xbe, 0x99, 0xfc, 0xc6, 0x70, 0x76, 0x3f, 0xfd, 0x59, - 0x89, 0x64, 0xa6, 0x56, 0xf7, 0x5c, 0x83, 0x87, 0x72, 0xc0, 0x66, 0xde, - 0x6e, 0x38, 0x48, 0x1a, 0x0c, 0x5c, 0xcf, 0x35, 0x80, 0x70, 0x45, 0x13, - 0x85, 0xf0, 0x04, 0xc6, 0xa1, 0xff, 0x26, 0x94, 0x4c, 0xb9, 0x5e, 0x2b, - 0x55, 0x48, 0x9e, 0x83, 0x6a, 0x52, 0xd5, 0x84, 0xc6, 0x50, 0x26, 0x99, - 0x5e, 0xc0, 0x1e, 0xa0, 0x27, 0xeb, 0x29, 0xd9, 0xdd, 0x03, 0x0f, 0x99, - 0x4e, 0xd3, 0xa3, 0xee, 0x18, 0xe7, 0xf9, 0xb7, 0x1a, 0x98, 0x13, 0x8b, - 0xb0, 0x94, 0x58, 0xd6, 0x02, 0xd1, 0xd7, 0xa2, 0x7b, 0x54, 0xd5, 0xc9, - 0x85, 0x2e, 0xb2, 0x24, 0xc4, 0xab, 0x97, 0x62, 0xce, 0xbe, 0x6f, 0xe8, - 0x89, 0x52, 0x41, 0x1f, 0xad, 0xd0, 0x2b, 0xb2, 0x15, 0x30, 0xdf, 0x0e, - 0x2e, 0x5f, 0x1d, 0x84, 0xba, 0xee, 0x08, 0x41, 0x0c, 0x21, 0xc5, 0xe7, - 0xe6, 0xb9, 0x15, 0x68, 0xca, 0x25, 0x55, 0x95, 0xa7, 0x96, 0x6d, 0x5f, - 0xcc, 0x03, 0xf2, 0xcc, 0xaa, 0xd3, 0xaa, 0xcc, 0xa9, 0x41, 0xa9, 0x97, - 0x00, 0xfd, 0xc7, 0x0a, 0x98, 0x99, 0xf3, 0x4a, 0xf0, 0xcf, 0xc2, 0x8d, - 0xe1, 0xbc, 0x74, 0x75, 0x2e, 0xce, 0x50, 0x3f, 0xfc, 0x3b, 0x45, 0xdb, - 0xfc, 0xb3, 0xb4, 0x56, 0x31, 0xb9, 0xc1, 0xc0, 0x6c, 0x51, 0x8a, 0xe7, - 0xb0, 0x5c, 0xa6, 0xe6, 0x36, 0x98, 0x7a, 0xf5, 0xc4, 0x24, 0x51, 0x4c, - 0x0a, 0x2b, 0x1c, 0x4c, 0x8a, 0x40, 0xf3, 0x0d, 0x4e, 0xc9, 0xad, 0xcc, - 0x54, 0x24, 0x7f, 0xd8, 0xb6, 0xb6, 0xf0, 0x32, 0x76, 0x87, 0x72, 0xb3, - 0x85, 0x99, 0xa6, 0x36, 0x61, 0xb7, 0x34, 0x61, 0xba, 0x49, 0xe6, 0x84, - 0x19, 0x31, 0x54, 0xf0, 0x51, 0xb9, 0xda, 0x2e, 0x9c, 0x92, 0x45, 0x93, - 0x59, 0x57, 0xcc, 0xc9, 0x5b, 0xba, 0x34, 0x52, 0x32, 0x89, 0x6d, 0x04, - 0x75, 0xf9, 0xf9, 0xe7, 0xdd, 0xc1, 0x6f, 0xd7, 0x61, 0xbf, 0xcf, 0x46, - 0x9e, 0xcd, 0xc2, 0xda, 0x1c, 0xcf, 0x86, 0x59, 0xe6, 0x3a, 0x84, 0xea, - 0x60, 0x6e, 0x6d, 0x4f, 0xb0, 0xd9, 0xb2, 0x64, 0x68, 0x43, 0x52, 0x59, - 0xd2, 0xc4, 0xfe, 0x94, 0x01, 0x6b, 0xc5, 0xde, 0xf2, 0x69, 0x53, 0xfc, - 0x94, 0xf0, 0x2d, 0x45, 0xed, 0x2c, 0x02, 0xf6, 0xc6, 0xaa, 0x9b, 0x95, - 0xb9, 0xe2, 0x9b, 0xcb, 0xcc, 0x2e, 0xbc, 0x38, 0xec, 0x8d, 0x5a, 0xfd, - 0x78, 0xa4, 0xb5, 0xb4, 0x7c, 0x85, 0xc4, 0x8b, 0x73, 0x2b, 0xbf, 0x84, - 0x7a, 0x70, 0x28, 0x0e, 0x47, 0x72, 0xca, 0x7c, 0x9a, 0xde, 0x00, 0x91, - 0xa0, 0xf1, 0x06, 0xbe, 0x56, 0xf4, 0xbb, 0xe5, 0x6a, 0x22, 0xfe, 0xde, - 0x35, 0x4d, 0x53, 0x2b, 0xea, 0x6a, 0x12, 0x8e, 0xd4, 0x18, 0x2b, 0xc1, - 0xf7, 0xe7, 0x95, 0xba, 0xf2, 0xde, 0x68, 0x45, 0xb5, 0x33, 0x34, 0x8f, - 0x7a, 0xee, 0xdf, 0x56, 0x1b, 0x00, 0x9d, 0x4d, 0x63, 0x85, 0x03, 0x37, - 0x27, 0xbc, 0xf2, 0xc6, 0x12, 0xf3, 0x63, 0x78, 0x5a, 0xa9, 0x72, 0x0a, - 0x2f, 0x54, 0x6e, 0x40, 0x44, 0x9c, 0xb6, 0x26, 0x33, 0x31, 0x9b, 0xab, - 0xbb, 0x1b, 0xb1, 0xd7, 0xba, 0x01, 0x93, 0xf4, 0xe0, 0xed, 0xd5, 0xe5, - 0x9b, 0x76, 0x5f, 0x4e, 0xe7, 0x23, 0x22, 0x58, 0x80, 0xbc, 0x5a, 0xfc, - 0x5d, 0xd8, 0xc2, 0xdd, 0x13, 0xb3, 0xbd, 0x4f, 0x1a, 0x90, 0x04, 0x1d, - 0xf0, 0x42, 0x21, 0x21, 0xb1, 0xf0, 0x41, 0xce, 0xfc, 0x9c, 0xff, 0x7e, - 0xa6, 0x23, 0xb4, 0xf6, 0xf8, 0x35, 0x6f, 0xe9, 0xac, 0x15, 0xa5, 0x23, - 0xc7, 0xa8, 0x94, 0x3e, 0x09, 0xaf, 0x12, 0xc5, 0xfa, 0xcf, 0xbe, 0xeb, - 0xbb, 0xc5, 0x2d, 0x18, 0x10, 0xed, 0xfa, 0x1d, 0x4c, 0xc0, 0x49, 0x66, - 0x4d, 0x20, 0xc4, 0x81, 0xdf, 0xb5, 0x25, 0x0d, 0x7e, 0x9b, 0x23, 0x23, - 0x55, 0x16, 0x1c, 0x44, 0x95, 0x75, 0xa4, 0x22, 0xd9, 0x75, 0x43, 0x9d, - 0xd1, 0xfb, 0x9a, 0x36, 0xae, 0xaa, 0xce, 0x95, 0xec, 0x75, 0xed, 0xc1, - 0xb2, 0x15, 0x2e, 0x57, 0xad, 0x3e, 0x6a, 0x36, 0xd3, 0x8b, 0xe1, 0xc0, - 0xe7, 0xa8, 0xae, 0xff, 0x49, 0x96, 0xf7, 0xb1, 0xba, 0x01, 0xcf, 0x1b, - 0x82, 0x03, 0xd5, 0xbc, 0xbc, 0x1c, 0xaa, 0x23, 0x4e, 0x16, 0x65, 0x3d, - 0x5a, 0x53, 0x22, 0x31, 0x91, 0xb5, 0x8b, 0x8d, 0x9f, 0x57, 0xf5, 0xa5, - 0xab, 0x64, 0xb1, 0xe4, 0xd3, 0x31, 0xd0, 0x02, 0x69, 0xb2, 0x2a, 0xab, - 0x4e, 0x2c, 0x7e, 0x7a, 0x85, 0x72, 0x40, 0x34, 0xb4, 0xd7, 0xf9, 0x83, - 0xc3, 0xd7, 0x3c, 0x09, 0x3d, 0xdc, 0x3d, 0x30, 0xfe, 0x07, 0xeb, 0xae, - 0x26, 0xcc, 0x99, 0xda, 0xf8, 0xd9, 0x49, 0x85, 0x7f, 0x7f, 0x1c, 0x11, - 0xb0, 0xd7, 0x79, 0x22, 0x7c, 0x49, 0x59, 0x97, 0xa5, 0x0b, 0x1c, 0x16, - 0x11, 0x95, 0x8f, 0x17, 0xc6, 0xc4, 0x92, 0x94, 0x73, 0x5f, 0x2e, 0xf8, - 0x1e, 0x83, 0xfd, 0xe5, 0xb0, 0x80, 0x4e, 0x5c, 0x3b, 0x27, 0x48, 0x56, - 0x05, 0x57, 0xe7, 0x1c, 0x5d, 0x5a, 0x54, 0xf3, 0x2c, 0x5b, 0x8e, 0x20, - 0x55, 0xa6, 0xee, 0x91, 0xe5, 0xff, 0xcc, 0x3c, 0x3e, 0xf6, 0x1c, 0x4a, - 0x92, 0x09, 0xe9, 0xb2, 0xd5, 0xb3, 0x93, 0x44, 0x43, 0xf3, 0x0c, 0x8f, - 0xbd, 0xa9, 0xab, 0x50, 0x68, 0xae, 0x77, 0x35, 0xc0, 0xda, 0x6e, 0x4c, - 0xb7, 0xe8, 0x2a, 0x4c, 0x87, 0x83, 0x4b, 0xb2, 0x4a, 0x15, 0xac, 0x66, - 0x30, 0x48, 0xfb, 0x4f, 0x8d, 0x26, 0x81, 0x4e, 0xed, 0xf0, 0x8f, 0x1f, - 0xcf, 0xe4, 0x28, 0x44, 0x8b, 0xdb, 0x94, 0x58, 0x46, 0x2d, 0xef, 0x69, - 0x40, 0x1f, 0x9f, 0xb8, 0xb4, 0x58, 0x2a, 0x34, 0x3c, 0x4b, 0x33, 0xc6, - 0xd6, 0x99, 0x0f, 0xa4, 0x7c, 0xc5, 0xd9, 0x84, 0xd3, 0x4b, 0x76, 0x07, - 0xea, 0x95, 0xd7, 0x3b, 0x44, 0xb7, 0x2c, 0xba, 0xf4, 0x3e, 0x56, 0x97, - 0xef, 0xe5, 0xa4, 0x64, 0x0d, 0x5f, 0xdc, 0x00, 0xad, 0x76, 0x7c, 0x4e, - 0x31, 0x0c, 0x2d, 0xec, 0xf6, 0x83, 0xcd, 0x16, 0x71, 0x99, 0x94, 0x77, - 0x02, 0xdd, 0x6b, 0x3c, 0xb8, 0x44, 0x63, 0xf4, 0x80, 0x67, 0x67, 0x44, - 0x5e, 0x17, 0x62, 0xd0, 0xaa, 0x25, 0x42, 0xd6, 0xac, 0x51, 0xc5, 0x25, - 0x95, 0x2e, 0x61, 0xc3, 0xc9, 0x66, 0x1e, 0x25, 0x38, 0xb6, 0x22, 0x0c, - 0xf1, 0x3e, 0x85, 0xe3, 0xbe, 0x9c, 0x68, 0x01, 0xd4, 0xa1, 0x5b, 0xfa, - 0x33, 0xd2, 0xd9, 0xed, 0x5c, 0x5f, 0x63, 0x34, 0xc5, 0x73, 0x74, 0x8e, - 0x8a, 0xf2, 0xa0, 0x48, 0xca, 0x39, 0xa7, 0xf2, 0x6e, 0xe2, 0x8f, 0x7c, - 0x2a, 0x87, 0xe9, 0x70, 0xb0, 0xf6, 0x06, 0xae, 0x7d, 0xc9, 0x39, 0x5f, - 0xb7, 0x5b, 0x97, 0xfa, 0x8b, 0x38, 0x84, 0xd5, 0x16, 0xf2, 0x83, 0x24, - 0x09, 0x5f, 0xcf, 0x56, 0x65, 0x7a, 0xbc, 0x9a, 0xee, 0xbf, 0x53, 0x25, - 0x13, 0x9a, 0x00, 0x69, 0x76, 0x44, 0x0c, 0x13, 0xdd, 0x15, 0x21, 0x91, - 0xc1, 0xd6, 0x3e, 0x71, 0xfe, 0xa2, 0xac, 0xb5, 0xf8, 0xc7, 0x00, 0x8e, - 0x02, 0x32, 0x82, 0x07, 0xbd, 0x7c, 0xce, 0x0b, 0x91, 0x2f, 0x51, 0x58, - 0xdc, 0x84, 0xcf, 0x4c, 0x72, 0x85, 0x98, 0xe7, 0x0c, 0x08, 0xa0, 0x50, - 0x0f, 0x7c, 0xe5, 0xb1, 0xed, 0xf0, 0x37, 0x10, 0xb8, 0xe1, 0x13, 0xff, - 0x2d, 0x9d, 0x45, 0x43, 0xea, 0x0b, 0xec, 0xc9, 0x5b, 0xe7, 0x6b, 0x08, - 0xb4, 0x0c, 0xb5, 0xdd, 0x4d, 0x51, 0x76, 0x85, 0x6f, 0x6f, 0x1b, 0xf4, - 0xf8, 0x45, 0x67, 0xc9, 0x23, 0xdf, 0x03, 0x53, 0xf0, 0x60, 0xc3, 0x4d, - 0x6e, 0x7d, 0x75, 0x0e, 0x28, 0x29, 0xb2, 0x04, 0x21, 0x89, 0x2e, 0x04, - 0x94, 0x0c, 0x30, 0x32, 0x7e, 0xb9, 0x5c, 0xd0, 0x1d, 0x73, 0xe1, 0x6a, - 0x3f, 0x50, 0x30, 0xe4, 0x7c, 0x65, 0x51, 0x68, 0xf8, 0x68, 0x06, 0x6b, - 0x17, 0x87, 0xb9, 0x2a, 0xb6, 0x09, 0x65, 0x2b, 0xab, 0xec, 0x40, 0x00, - 0x3e, 0xeb, 0xfb, 0x2a, 0x93, 0xac, 0xac, 0x64, 0x7a, 0xa0, 0x02, 0xa7, - 0x38, 0x4d, 0x6e, 0xa8, 0xfe, 0xf7, 0x10, 0xd1, 0x4e, 0x7d, 0x3d, 0x69, - 0x3e, 0x0a, 0x02, 0xe2, 0xf5, 0x16, 0x37, 0x59, 0x7b, 0xaf, 0x92, 0x5e, - 0x6f, 0x2a, 0x7c, 0x14, 0x17, 0x17, 0x4b, 0x75, 0x10, 0x8e, 0xcb, 0x49, - 0x70, 0xf5, 0x02, 0xb2, 0x05, 0x20, 0x5d, 0x68, 0xbc, 0x70, 0x32, 0xbb, - 0xb1, 0xac, 0x0b, 0x92, 0x10, 0x7c, 0x48, 0xe2, 0xa1, 0x58, 0xd9, 0xa2, - 0xaf, 0x27, 0x7e, 0xb9, 0x00, 0xfe, 0x1e, 0x29, 0xad, 0xcf, 0xce, 0x35, - 0x51, 0xfb, 0x9e, 0x21, 0x2e, 0x72, 0x31, 0x91, 0x47, 0xfe, 0x10, 0xfa, - 0xed, 0x89, 0x90, 0x55, 0xdd, 0xdd, 0xa7, 0x46, 0x45, 0x4f, 0xca, 0xaf, - 0x30, 0xce, 0x97, 0xd4, 0x75, 0x97, 0x4c, 0x51, 0xe0, 0x8d, 0xc9, 0xf6, - 0x3c, 0x03, 0x44, 0x1f, 0x23, 0x66, 0x71, 0xdf, 0x99, 0xa9, 0x2a, 0xcc, - 0x99, 0xb7, 0x17, 0x63, 0xaa, 0x94, 0x62, 0x46, 0x66, 0x14, 0x43, 0xa7, - 0xc1, 0x92, 0xa8, 0x17, 0x17, 0x7f, 0x89, 0xe1, 0xcd, 0x94, 0xbe, 0x45, - 0xe5, 0x26, 0xf7, 0xc0, 0xc8, 0x1d, 0xca, 0xb2, 0x76, 0xcb, 0xf6, 0x7d, - 0x69, 0x43, 0xe3, 0x46, 0xde, 0x1f, 0x10, 0x40, 0xd1, 0xb9, 0x53, 0x8f, - 0x8a, 0xf3, 0x76, 0x16, 0x9a, 0x57, 0x56, 0xdb, 0x4e, 0x6a, 0x50, 0x5b, - 0x4e, 0x0b, 0x76, 0x98, 0x4b, 0x18, 0xea, 0x71, 0x60, 0x3f, 0x4c, 0x98, - 0x32, 0xd5, 0xd4, 0x45, 0x7e, 0x0b, 0xbc, 0xa7, 0xaf, 0x67, 0x1e, 0x3f, - 0x43, 0xd0, 0xba, 0xbf, 0x6f, 0x27, 0x7a, 0xbf, 0x8a, 0x55, 0x3f, 0xfd, - 0xa2, 0x88, 0x28, 0x54, 0xd1, 0x90, 0x36, 0x25, 0x63, 0xad, 0x5f, 0x2c, - 0x1f, 0xeb, 0xd3, 0x65, 0x0b, 0x29, 0x27, 0xb0, 0x05, 0x18, 0xdc, 0xa2, - 0xe2, 0x92, 0x9a, 0x8e, 0xd9, 0x02, 0x69, 0x39, 0xae, 0xa8, 0x99, 0x24, - 0x29, 0xb5, 0xa6, 0xaa, 0x99, 0xac, 0xbd, 0x8d, 0x2c, 0x6c, 0xb2, 0x7c, - 0xa1, 0x7e, 0x53, 0x63, 0xfd, 0xa6, 0xc6, 0x1e, 0xd0, 0xb4, 0x7e, 0x01, - 0xb9, 0x72, 0x77, 0x9b, 0x69, 0x79, 0xf9, 0xf0, 0x86, 0x33, 0xeb, 0x92, - 0xa3, 0x76, 0xc6, 0x0a, 0xac, 0x5e, 0xaa, 0x00, 0xd1, 0x5b, 0x30, 0xf8, - 0x3d, 0x59, 0xf1, 0xbf, 0xbf, 0x8c, 0x08, 0x7a, 0xb2, 0x26, 0x20, 0x30, - 0x0d, 0xf1, 0x8f, 0xf9, 0x68, 0x1d, 0xd5, 0xb1, 0xd7, 0x6a, 0x73, 0x91, - 0x80, 0xa9, 0xdc, 0xe3, 0xed, 0x36, 0xf1, 0x72, 0x6e, 0xdf, 0x20, 0xf3, - 0x8a, 0xa5, 0x63, 0x5e, 0x07, 0x64, 0xc0, 0x5c, 0x89, 0xef, 0x57, 0x99, - 0x9e, 0xca, 0xcd, 0xb6, 0x7b, 0x69, 0x95, 0x74, 0x31, 0x42, 0xbc, 0x45, - 0x25, 0xfd, 0xd9, 0x22, 0xc4, 0x5f, 0x4b, 0x25, 0xbd, 0x4c, 0xaa, 0x4d, - 0x2a, 0xe9, 0xf3, 0xbb, 0x6f, 0x9d, 0xff, 0x30, 0xa0, 0x6f, 0x47, 0xf7, - 0xe4, 0x27, 0x51, 0xea, 0x91, 0x34, 0x8d, 0x29, 0xc5, 0xbb, 0x91, 0x5f, - 0x56, 0x8b, 0xaf, 0x72, 0x7c, 0xf7, 0x13, 0x85, 0x3f, 0x00, 0x45, 0x51, - 0x8c, 0x0e, 0x03, 0xae, 0xf4, 0xcf, 0x88, 0xab, 0x60, 0xea, 0x0c, 0xc3, - 0x2c, 0x6f, 0x7b, 0x2c, 0xbe, 0xac, 0xe4, 0xdb, 0xd7, 0x11, 0x52, 0x52, - 0x8f, 0x96, 0x7d, 0x41, 0x81, 0x23, 0x8b, 0xf0, 0xb8, 0x5c, 0x6b, 0x50, - 0x3a, 0xdb, 0xaa, 0x50, 0xc4, 0xe9, 0xef, 0xa9, 0xa2, 0xee, 0x3c, 0x15, - 0xfa, 0x2d, 0x20, 0x5b, 0x0d, 0xeb, 0x6f, 0x40, 0x32, 0xe9, 0x9e, 0x83, - 0x50, 0x47, 0x14, 0x33, 0x34, 0x13, 0x3c, 0x16, 0xb5, 0x31, 0x21, 0x8e, - 0xee, 0xc5, 0x66, 0x16, 0x8d, 0xf4, 0xf3, 0x06, 0xde, 0xd7, 0x7e, 0xfa, - 0x9b, 0xc6, 0x1e, 0xbd, 0x1d, 0x09, 0x35, 0x77, 0x7d, 0xd7, 0x16, 0x6b, - 0x4b, 0x74, 0x6e, 0xf3, 0x63, 0x22, 0x01, 0x99, 0xd4, 0x4c, 0x69, 0x14, - 0xf7, 0xa6, 0x6e, 0x45, 0xaf, 0xaf, 0xab, 0x7e, 0xed, 0x63, 0x5b, 0xc8, - 0x6d, 0x56, 0xf5, 0x1b, 0xc8, 0x7d, 0xc9, 0x20, 0x0b, 0xf1, 0xb6, 0x2d, - 0xde, 0x2a, 0x8c, 0xf8, 0x0b, 0x38, 0x93, 0x2f, 0x39, 0x48, 0xf7, 0xce, - 0xfd, 0x9f, 0x45, 0xe6, 0xe5, 0xac, 0x84, 0x23, 0xe6, 0x8d, 0xf8, 0xb9, - 0xe3, 0xa5, 0x85, 0x31, 0x72, 0xdf, 0xf7, 0xbf, 0xc3, 0x69, 0xf8, 0x6a, - 0xd3, 0xbd, 0x0c, 0xd3, 0x2b, 0x56, 0x25, 0xde, 0x77, 0xf7, 0x57, 0x99, - 0xc6, 0x32, 0x2d, 0x67, 0x88, 0x77, 0x1e, 0x89, 0x22, 0xa2, 0xef, 0x12, - 0x44, 0xb2, 0x6b, 0xee, 0x3b, 0x74, 0x2b, 0x72, 0x8d, 0xbe, 0x4f, 0x46, - 0xc1, 0xb5, 0xca, 0x4d, 0x5b, 0x12, 0xcb, 0xb6, 0xc4, 0xa4, 0x01, 0xbc, - 0xe2, 0xe8, 0xe3, 0xa1, 0x7e, 0x36, 0xcb, 0x13, 0x23, 0x15, 0xb8, 0xc7, - 0x02, 0xb5, 0xe6, 0xe7, 0x29, 0x0f, 0xb7, 0xce, 0x6c, 0x7b, 0xf8, 0xed, - 0x27, 0x24, 0xe9, 0x94, 0xb1, 0xe9, 0x84, 0x74, 0xd7, 0xf1, 0xe4, 0xe5, - 0x4e, 0x48, 0x34, 0x66, 0x15, 0x95, 0xa3, 0x0e, 0xea, 0x22, 0xa6, 0x33, - 0x7e, 0x57, 0x98, 0x7c, 0xaf, 0x7b, 0x74, 0x2a, 0x3d, 0x7a, 0x3b, 0x47, - 0xa7, 0x9f, 0x65, 0x62, 0x50, 0x1b, 0xd3, 0x15, 0x40, 0xf3, 0x79, 0x00, - 0x9e, 0xea, 0x76, 0x81, 0x10, 0x61, 0xa0, 0xe2, 0xae, 0x72, 0x4c, 0xa9, - 0xfc, 0x7d, 0x32, 0xdc, 0x3c, 0x08, 0xbb, 0x2c, 0x42, 0xfd, 0x81, 0xa3, - 0x2e, 0x10, 0xfc, 0xab, 0xcc, 0xa3, 0x86, 0x53, 0xe1, 0x98, 0xbc, 0x14, - 0xe5, 0x8f, 0xee, 0x4d, 0x88, 0x91, 0xbd, 0xde, 0xe6, 0x04, 0x94, 0xa1, - 0x0e, 0x25, 0xe0, 0x07, 0x13, 0x57, 0x46, 0x53, 0xa6, 0xd3, 0xbd, 0x02, - 0x4d, 0xfa, 0xbe, 0xce, 0x25, 0x3f, 0xcb, 0x74, 0x34, 0xf6, 0x76, 0xbb, - 0x21, 0x79, 0x0b, 0x40, 0x46, 0x38, 0x28, 0xe3, 0x9b, 0x2e, 0xfe, 0xea, - 0x6c, 0xe7, 0x9c, 0xd6, 0x1c, 0xe5, 0xd9, 0x93, 0x4c, 0xc5, 0xda, 0x9a, - 0x6f, 0xbe, 0x59, 0xc9, 0xd4, 0x4a, 0xfe, 0x11, 0x80, 0x9b, 0x37, 0x9e, - 0x58, 0xae, 0x03, 0x5c, 0xdb, 0xf7, 0x17, 0x13, 0xff, 0x59, 0x64, 0x63, - 0x41, 0xc8, 0x64, 0x3e, 0xf4, 0x5f, 0x26, 0xc5, 0x9f, 0x1b, 0x23, 0x75, - 0x4b, 0x72, 0x4f, 0x96, 0xfe, 0x06, 0xd3, 0x21, 0xe2, 0x33, 0xe4, 0x51, - 0x05, 0x04, 0x4b, 0x24, 0xb6, 0x80, 0x15, 0x7e, 0xea, 0x4d, 0xd9, 0x2e, - 0x08, 0xf6, 0x79, 0xc4, 0xae, 0xcd, 0x38, 0x78, 0xc5, 0x62, 0xca, 0x4d, - 0xca, 0xc3, 0x66, 0x05, 0x48, 0x6d, 0xe4, 0xea, 0xb4, 0xc5, 0x7b, 0x9b, - 0x15, 0x05, 0x29, 0x23, 0xd7, 0x85, 0x3e, 0x87, 0x7c, 0xcc, 0x2d, 0xf7, - 0xec, 0x62, 0xc5, 0x95, 0x6e, 0xd7, 0x33, 0xed, 0x79, 0xfa, 0x1c, 0xae, - 0x17, 0x82, 0x99, 0x55, 0x5f, 0x0a, 0x65, 0x9f, 0x12, 0xd1, 0xa8, 0x7b, - 0x12, 0xc8, 0x07, 0xa5, 0xd0, 0x5e, 0x99, 0x0c, 0x08, 0xc3, 0x17, 0x14, - 0x64, 0x24, 0x2e, 0xa8, 0x65, 0x58, 0xcf, 0x54, 0x7d, 0x96, 0xf7, 0xb5, - 0x14, 0x88, 0xc4, 0x0f, 0x10, 0xd1, 0xbe, 0x42, 0x99, 0x1c, 0x22, 0xf5, - 0xee, 0x20, 0xaa, 0xad, 0xa0, 0xdc, 0xf8, 0x91, 0x51, 0xaf, 0xc8, 0x3b, - 0xe7, 0x58, 0x0e, 0x93, 0x40, 0x87, 0x01, 0x68, 0x6b, 0x86, 0x64, 0x89, - 0x99, 0xda, 0x97, 0xcd, 0xd5, 0x0f, 0x39, 0xed, 0xd5, 0xb5, 0x41, 0x14, - 0x50, 0xa6, 0x5e, 0x28, 0x3d, 0xf0, 0xe6, 0x08, 0xfc, 0xda, 0x40, 0xae, - 0x82, 0x55, 0x90, 0x78, 0xfc, 0x61, 0x66, 0xe8, 0x29, 0x82, 0x5a, 0xdc, - 0x96, 0xcd, 0x37, 0xc4, 0xd5, 0xf4, 0x1e, 0x98, 0x2e, 0x87, 0xbe, 0xb7, - 0x37, 0x68, 0x5a, 0x96, 0x23, 0xf9, 0x79, 0xcd, 0xb3, 0x00, 0x61, 0x6e, - 0xe5, 0xdb, 0xfe, 0x94, 0x86, 0xde, 0x40, 0xf1, 0xb0, 0x2a, 0x6f, 0xe9, - 0xeb, 0x04, 0xbd, 0xb4, 0xac, 0xf8, 0xa3, 0xf1, 0x65, 0xfc, 0x21, 0xe3, - 0x7b, 0x22, 0x5a, 0x4d, 0x38, 0xc3, 0x90, 0x22, 0x75, 0x60, 0x05, 0x5f, - 0xe9, 0x09, 0xce, 0x99, 0xc4, 0xab, 0x86, 0xc6, 0x77, 0x59, 0x2e, 0x29, - 0xff, 0x02, 0x17, 0xf2, 0x7f, 0xba, 0xfa, 0xdf, 0x4e, 0x6b, 0x75, 0x12, - 0x51, 0xd5, 0x3a, 0xec, 0x28, 0x4b, 0x41, 0x95, 0x47, 0x00, 0xce, 0x05, - 0xa3, 0x69, 0x62, 0xda, 0x03, 0xd4, 0x21, 0x41, 0xba, 0x69, 0x3f, 0xef, - 0xf9, 0xfb, 0x5a, 0xb7, 0x44, 0x86, 0x0c, 0xc0, 0xc9, 0x26, 0x9d, 0xa0, - 0x7c, 0xde, 0x96, 0x3f, 0x20, 0xa5, 0x96, 0xe0, 0xba, 0x10, 0xe0, 0xf6, - 0xc8, 0xcc, 0xa3, 0x38, 0xfa, 0x22, 0x63, 0x94, 0x33, 0x9d, 0x59, 0x64, - 0x26, 0xe0, 0x5e, 0xfd, 0x96, 0x64, 0xfb, 0x37, 0x24, 0x1b, 0xf3, 0xc2, - 0xcb, 0xc9, 0xbf, 0x14, 0x4f, 0xe2, 0x5b, 0xa4, 0x56, 0x9f, 0xe5, 0x1a, - 0xed, 0x80, 0x6f, 0xc8, 0x33, 0x62, 0x60, 0x11, 0x35, 0xe9, 0xe7, 0x8d, - 0x8a, 0xdc, 0x71, 0x96, 0x94, 0xa5, 0x1d, 0x95, 0x32, 0x42, 0x04, 0xd5, - 0xeb, 0x15, 0x00, 0xd6, 0x5c, 0xac, 0x00, 0xd8, 0x11, 0x15, 0x98, 0x9a, - 0x99, 0x4b, 0x32, 0xe9, 0xcd, 0x79, 0xc0, 0x55, 0xa7, 0x30, 0x12, 0x6a, - 0xb0, 0x16, 0x59, 0x79, 0xf5, 0x6e, 0x89, 0x3a, 0xed, 0x19, 0x0a, 0x18, - 0x76, 0x49, 0x7d, 0x62, 0x7a, 0xc6, 0x27, 0xc2, 0x6c, 0x38, 0xc4, 0xb4, - 0xdd, 0x5a, 0x2e, 0xe2, 0x39, 0xb9, 0xb2, 0x00, 0x79, 0xa7, 0x17, 0xc5, - 0xc4, 0x4a, 0xde, 0xaf, 0x32, 0xbd, 0xbd, 0xb3, 0xed, 0x46, 0x66, 0x2d, - 0xa8, 0x98, 0xcd, 0x1b, 0xc2, 0x4b, 0x8c, 0x63, 0xe1, 0x43, 0x32, 0x31, - 0x1f, 0x59, 0xc2, 0x93, 0x78, 0xf2, 0x4d, 0x33, 0xa7, 0x37, 0xe8, 0x5f, - 0xa8, 0xc4, 0xd8, 0xd3, 0xdf, 0xc1, 0x87, 0xce, 0x4d, 0x52, 0xc5, 0x00, - 0xd8, 0x25, 0xd0, 0x2f, 0x81, 0xd8, 0xab, 0x22, 0x22, 0xc4, 0x50, 0xa5, - 0x45, 0x35, 0x66, 0xa3, 0x84, 0xf8, 0xd7, 0x09, 0x97, 0xc5, 0xcc, 0xfa, - 0x8b, 0x8e, 0xdd, 0x23, 0xdf, 0x03, 0x13, 0xa3, 0x38, 0xc4, 0xee, 0x46, - 0x91, 0xf7, 0x0d, 0x91, 0xaa, 0x51, 0xfa, 0xdc, 0xe0, 0x01, 0xf9, 0xbb, - 0xfc, 0xe1, 0x9c, 0x60, 0x71, 0x7a, 0xdf, 0xac, 0xdc, 0x30, 0x92, 0xc4, - 0xb9, 0xa6, 0x6d, 0xb0, 0xe5, 0x99, 0x6e, 0xc0, 0xc8, 0xcd, 0xf4, 0xc9, - 0xef, 0xcb, 0xf0, 0x65, 0x42, 0x01, 0x3b, 0x9e, 0x8f, 0x6f, 0xb0, 0x7d, - 0xf2, 0xe6, 0x89, 0x50, 0x1b, 0x95, 0x8b, 0x80, 0x87, 0xab, 0x72, 0x07, - 0xd0, 0x86, 0x9e, 0x80, 0x91, 0xce, 0xea, 0xfa, 0x83, 0x4d, 0x05, 0x67, - 0xb1, 0xaa, 0x94, 0x03, 0x75, 0x5f, 0xf9, 0x59, 0xd7, 0x98, 0xbd, 0xac, - 0xc2, 0x0c, 0xd0, 0x19, 0x15, 0x7e, 0x91, 0x99, 0xc4, 0x60, 0x41, 0x26, - 0xa0, 0xe6, 0x40, 0xb3, 0xfc, 0x0c, 0x08, 0x01, 0xac, 0x3c, 0xc6, 0x48, - 0x8f, 0x79, 0x61, 0x3b, 0x06, 0xa6, 0x00, 0x13, 0x9f, 0x87, 0x29, 0x60, - 0x16, 0x5c, 0x7a, 0x67, 0x16, 0x23, 0x97, 0xf5, 0x77, 0xb5, 0xf4, 0xf5, - 0x76, 0xe5, 0xde, 0xb6, 0x57, 0xe6, 0xea, 0xa8, 0x0e, 0x40, 0xe0, 0xdd, - 0xa1, 0x0e, 0x97, 0x27, 0x5c, 0x74, 0xd0, 0xb5, 0x7b, 0xed, 0x45, 0xed, - 0x5e, 0xac, 0x86, 0xc5, 0x38, 0x41, 0x3e, 0xa2, 0x60, 0x87, 0x5e, 0x0a, - 0x9b, 0x4c, 0x90, 0x48, 0xd2, 0xa6, 0xad, 0x55, 0x20, 0x93, 0xc8, 0x1b, - 0x09, 0xe8, 0x00, 0x6b, 0x9f, 0xdb, 0x13, 0x7d, 0xb8, 0x7b, 0x60, 0x36, - 0x14, 0x9f, 0xf5, 0x7e, 0xbb, 0x3a, 0xab, 0x52, 0x35, 0x4f, 0x2c, 0x74, - 0xe7, 0x79, 0xcc, 0x37, 0x56, 0x4d, 0x24, 0xaa, 0x29, 0xe3, 0xc1, 0xd5, - 0x1c, 0xde, 0x19, 0xa3, 0xde, 0xbb, 0x2b, 0x5d, 0xff, 0x59, 0x2b, 0x5d, - 0x0f, 0x0d, 0x1f, 0x34, 0x78, 0xef, 0x95, 0xd5, 0x7b, 0xde, 0x68, 0x92, - 0x73, 0x43, 0x0c, 0xcd, 0x3e, 0x5a, 0x24, 0xbe, 0xcd, 0x27, 0x14, 0x05, - 0x26, 0xba, 0xcf, 0xf2, 0x6f, 0xf0, 0xa7, 0x98, 0xf0, 0x1f, 0x27, 0x38, - 0x6e, 0xb8, 0x6e, 0x20, 0x6a, 0x81, 0x7a, 0x79, 0x02, 0x25, 0x3e, 0xfa, - 0x73, 0xcf, 0x31, 0x64, 0x60, 0xea, 0xc2, 0x1b, 0x11, 0x06, 0x9e, 0x5a, - 0xd3, 0x1e, 0x9e, 0xb5, 0x57, 0x53, 0x44, 0x35, 0xe9, 0x34, 0x17, 0x3b, - 0x99, 0x77, 0x1e, 0xfc, 0x6c, 0x16, 0x0e, 0x04, 0xbd, 0x1f, 0x5b, 0x83, - 0x44, 0x08, 0x2c, 0x0f, 0x58, 0x03, 0x82, 0xbd, 0xa6, 0xf9, 0x3b, 0x44, - 0x13, 0x75, 0x52, 0xa0, 0x4a, 0xf1, 0x39, 0xcb, 0x4b, 0x2d, 0x9e, 0xb9, - 0x22, 0x38, 0xa2, 0xea, 0x8d, 0x2c, 0x0e, 0xc5, 0x6a, 0x13, 0x9a, 0xd4, - 0xc8, 0x57, 0x4a, 0x4b, 0x5d, 0xb1, 0xb6, 0xfc, 0x58, 0x7c, 0xef, 0xee, - 0x39, 0xaa, 0x7f, 0x2f, 0x64, 0x88, 0x21, 0xf9, 0x4f, 0x62, 0x13, 0x14, - 0x38, 0xf6, 0x2d, 0x79, 0x30, 0x32, 0x9e, 0xd3, 0x53, 0x8c, 0xbc, 0x0e, - 0x6d, 0x7a, 0x0e, 0xe8, 0xc3, 0x83, 0xb6, 0x97, 0x8a, 0x4f, 0x97, 0x5a, - 0x5c, 0x86, 0x8f, 0x83, 0x19, 0x8e, 0x79, 0xa5, 0x95, 0x62, 0xba, 0x74, - 0xab, 0x51, 0x53, 0x61, 0xe5, 0x12, 0x71, 0xd1, 0x03, 0x4d, 0x0c, 0x6d, - 0x16, 0x85, 0x15, 0xfb, 0x11, 0x57, 0xa4, 0x9d, 0xbe, 0x86, 0xc0, 0x4f, - 0x06, 0x3a, 0x71, 0xb6, 0x90, 0xcc, 0x66, 0x74, 0xbb, 0x7d, 0xc8, 0x41, - 0x9d, 0xdb, 0xb5, 0xa1, 0x67, 0x58, 0x15, 0xe5, 0xc2, 0xe8, 0x70, 0x27, - 0x66, 0x32, 0xc7, 0xcc, 0xcb, 0x61, 0x67, 0x06, 0x66, 0x8b, 0xde, 0xa3, - 0x92, 0x42, 0x77, 0x4c, 0x14, 0xed, 0xc7, 0x02, 0x33, 0x4b, 0xf1, 0x39, - 0x90, 0x6c, 0x22, 0xef, 0x3e, 0x11, 0x87, 0xcc, 0x7e, 0xc8, 0x16, 0x72, - 0x04, 0x3a, 0x9a, 0xab, 0x3c, 0xc1, 0xda, 0xad, 0x48, 0xc7, 0xd6, 0x9b, - 0x48, 0x44, 0xa1, 0x47, 0x2e, 0x93, 0xa3, 0x45, 0x98, 0xd4, 0x52, 0xa9, - 0x4f, 0xfd, 0xa9, 0xc1, 0x04, 0x00, 0x70, 0x19, 0xab, 0x08, 0x0b, 0xdc, - 0x5f, 0x3c, 0xb2, 0x8c, 0x42, 0xab, 0x7b, 0xe4, 0x34, 0xd2, 0x6e, 0x5b, - 0xed, 0x72, 0xff, 0x0d, 0x9c, 0x79, 0x25, 0x38, 0xf3, 0x8a, 0x85, 0xf3, - 0xe7, 0x57, 0xc6, 0x60, 0x96, 0x01, 0xfd, 0xca, 0x18, 0x4c, 0xe8, 0x42, - 0x34, 0xfd, 0xca, 0x8c, 0x2b, 0xbf, 0xaa, 0x33, 0x0e, 0xbe, 0x99, 0x52, - 0x0d, 0x9e, 0xfa, 0x6b, 0x4e, 0x35, 0xcb, 0x6c, 0x93, 0x1d, 0x25, 0xe5, - 0x6e, 0x3f, 0xb4, 0xc0, 0xfa, 0x57, 0x99, 0x03, 0x45, 0x52, 0xbc, 0x65, - 0x95, 0xf5, 0xa2, 0x27, 0x2f, 0x3a, 0x26, 0x8f, 0x7c, 0x0f, 0x0c, 0xed, - 0x21, 0xe6, 0xed, 0x60, 0xb3, 0x67, 0xb0, 0x88, 0x9b, 0xef, 0xfe, 0x2a, - 0x07, 0x82, 0x5f, 0xa5, 0xa9, 0x6f, 0x29, 0xef, 0x94, 0xbf, 0xe0, 0xa6, - 0x94, 0x47, 0xc0, 0x18, 0x07, 0xb0, 0xb6, 0xf0, 0xf8, 0x2a, 0xca, 0xd0, - 0xf5, 0x80, 0x60, 0x31, 0x0a, 0x4e, 0xa6, 0x41, 0x82, 0xef, 0xc8, 0xf6, - 0xce, 0xa0, 0x32, 0xf6, 0xb0, 0x3d, 0x5d, 0x49, 0xdb, 0x0f, 0x1c, 0x08, - 0xaa, 0xeb, 0x1d, 0x1a, 0xdb, 0x16, 0x32, 0xed, 0x41, 0x63, 0xa9, 0xdd, - 0x95, 0x5a, 0x94, 0xbb, 0xfc, 0xa5, 0x6e, 0x7a, 0x0e, 0x77, 0xb0, 0xb8, - 0x1f, 0x8e, 0xa9, 0xfd, 0xa8, 0xef, 0x52, 0x56, 0xc6, 0xa9, 0x2d, 0xf9, - 0xca, 0x51, 0x74, 0x50, 0xf5, 0xbe, 0x37, 0x41, 0xd3, 0x40, 0xae, 0xa4, - 0xf6, 0xfe, 0x76, 0x05, 0x03, 0x0b, 0xc4, 0x2a, 0xe5, 0xc4, 0xd2, 0x55, - 0x58, 0x55, 0x05, 0x6e, 0x8b, 0xaf, 0xd7, 0xb9, 0x2d, 0x74, 0xec, 0xb7, - 0xcc, 0xdc, 0x5d, 0xdf, 0xab, 0x9f, 0x43, 0xd5, 0x1b, 0x58, 0x26, 0xdc, - 0x04, 0x64, 0xd2, 0xc8, 0x91, 0x2a, 0x1c, 0xa9, 0x60, 0x22, 0x1f, 0x32, - 0x2a, 0x24, 0xa1, 0x57, 0x02, 0x95, 0xf8, 0xe0, 0x97, 0xf4, 0x7b, 0x3a, - 0x3f, 0xec, 0xfe, 0x5b, 0x8d, 0xd7, 0xaf, 0xc1, 0xd8, 0xba, 0x55, 0xf0, - 0x86, 0xed, 0x24, 0x18, 0x9b, 0x0d, 0xf9, 0x74, 0x51, 0x26, 0xd0, 0x76, - 0x3c, 0x30, 0x43, 0xe8, 0x88, 0xa8, 0x12, 0x62, 0x15, 0x5d, 0xe5, 0x0a, - 0x5c, 0x36, 0x0a, 0x19, 0xa2, 0x11, 0x0f, 0xa7, 0x81, 0x69, 0x9a, 0x2c, - 0x58, 0x39, 0xa8, 0x46, 0x3e, 0x32, 0x1b, 0x11, 0x28, 0x77, 0x6d, 0xfd, - 0xeb, 0x78, 0x67, 0x9a, 0x89, 0x26, 0x2e, 0xbb, 0x91, 0xd6, 0xf4, 0x08, - 0x5e, 0x7f, 0xed, 0xdc, 0x8d, 0x9f, 0x78, 0xc5, 0xcd, 0x7a, 0x09, 0x31, - 0x57, 0x98, 0x86, 0x62, 0x09, 0xed, 0xc6, 0x53, 0x84, 0xa0, 0xe2, 0xd2, - 0xd6, 0x39, 0x31, 0xae, 0x61, 0x65, 0x47, 0x17, 0x7d, 0x7c, 0xf4, 0xc7, - 0x13, 0xa1, 0x2c, 0xd5, 0xc8, 0x48, 0x14, 0xd7, 0x39, 0x69, 0x85, 0x5a, - 0xa1, 0x05, 0xde, 0xa6, 0xb0, 0x72, 0x39, 0x46, 0xb1, 0xde, 0x07, 0x80, - 0xfb, 0x75, 0x98, 0xfc, 0x5c, 0x11, 0x79, 0x55, 0x45, 0x7a, 0xef, 0x9d, - 0x53, 0xde, 0xa8, 0xc7, 0x50, 0x75, 0x91, 0x87, 0xc9, 0x70, 0xb0, 0x01, - 0xeb, 0x41, 0x90, 0x3c, 0xe4, 0x9a, 0x50, 0xc6, 0xd1, 0x4e, 0x94, 0x91, - 0xf5, 0x85, 0x05, 0x2e, 0x93, 0x44, 0x48, 0xd2, 0x66, 0x0d, 0x12, 0x51, - 0x8d, 0x25, 0x6f, 0xc6, 0xf3, 0x4d, 0x25, 0x4c, 0x9e, 0xbd, 0x5e, 0x18, - 0x78, 0xb8, 0x31, 0x38, 0xe3, 0x4f, 0x75, 0xe8, 0x07, 0x9c, 0x48, 0xfa, - 0x0c, 0xd8, 0x32, 0x99, 0x5e, 0x67, 0x4d, 0x2a, 0x5f, 0xe5, 0xaf, 0x62, - 0x51, 0xf1, 0xb1, 0xee, 0xd0, 0x1b, 0xe1, 0xb7, 0x0a, 0x90, 0x6d, 0xcc, - 0x96, 0x38, 0x52, 0x4f, 0xc3, 0xa8, 0x65, 0x44, 0x54, 0xe1, 0x8a, 0xc9, - 0x3b, 0x49, 0x13, 0x92, 0x1e, 0xa6, 0x3d, 0xa8, 0x2f, 0xbb, 0x56, 0x69, - 0xd8, 0x45, 0x92, 0x03, 0x44, 0x92, 0x52, 0x56, 0x74, 0x52, 0x9f, 0xd2, - 0xcb, 0x49, 0xcc, 0x1b, 0xf8, 0xcc, 0xe9, 0xd8, 0xee, 0x75, 0x39, 0xb6, - 0x46, 0x3b, 0xf3, 0x95, 0xb4, 0x1d, 0x51, 0x7b, 0x32, 0xac, 0x79, 0x70, - 0x93, 0x8f, 0x01, 0x73, 0xe2, 0xe0, 0xf2, 0x7a, 0x68, 0x73, 0xd7, 0xfd, - 0x97, 0x00, 0xb2, 0xdd, 0x86, 0x89, 0x3d, 0xba, 0x7c, 0xea, 0xc9, 0x73, - 0x86, 0x80, 0x3b, 0xd6, 0x04, 0xe6, 0x44, 0x20, 0x92, 0x8e, 0x42, 0xef, - 0x0e, 0xaa, 0x6b, 0xdb, 0x78, 0xf2, 0x50, 0xee, 0x0e, 0x17, 0x6e, 0x8d, - 0x34, 0xe7, 0x10, 0xda, 0x5d, 0xfe, 0x31, 0x29, 0xcd, 0x48, 0xda, 0x4a, - 0xdb, 0x35, 0x91, 0xce, 0xe7, 0x35, 0xb4, 0xbc, 0xb7, 0xf8, 0x7c, 0x9c, - 0xd6, 0xe9, 0x64, 0x91, 0x80, 0xf8, 0x44, 0x61, 0x34, 0x48, 0x35, 0x43, - 0x8d, 0xcf, 0x70, 0x2c, 0xb3, 0x03, 0xf0, 0x31, 0xf8, 0x4b, 0x46, 0x9f, - 0x1c, 0x78, 0x89, 0x2b, 0xcc, 0x96, 0x88, 0xc1, 0x6d, 0x73, 0xc1, 0x5a, - 0x36, 0xc1, 0x15, 0x87, 0xa9, 0xb4, 0x58, 0x7f, 0xd9, 0xdf, 0xfc, 0x24, - 0xf1, 0xa5, 0x4f, 0xd3, 0x57, 0x9d, 0x69, 0x52, 0x4e, 0x3b, 0x06, 0x95, - 0x9b, 0x66, 0xc4, 0x00, 0x41, 0xb7, 0x4e, 0xb5, 0xaf, 0x38, 0x10, 0xe8, - 0x2d, 0x46, 0xc8, 0x6d, 0x41, 0xd2, 0x7f, 0xec, 0x64, 0xbb, 0xca, 0xe1, - 0xe2, 0xe8, 0xb0, 0xca, 0xbb, 0x0c, 0x0c, 0x5d, 0xd6, 0xfa, 0x4d, 0xeb, - 0x03, 0xf4, 0xbc, 0x7d, 0x01, 0xbc, 0x1a, 0x83, 0xdc, 0xe7, 0xdf, 0x88, - 0xc0, 0x0b, 0x78, 0x8d, 0x2d, 0x5f, 0x69, 0x5b, 0xc7, 0x66, 0x37, 0xad, - 0x76, 0x93, 0xae, 0xa5, 0x8e, 0x3a, 0x40, 0x6b, 0x03, 0x8c, 0xe9, 0xca, - 0x2e, 0x3f, 0x92, 0xb3, 0xf9, 0x7a, 0x5b, 0x89, 0x58, 0x03, 0xb9, 0xd1, - 0xb1, 0xd4, 0x76, 0x11, 0x3c, 0x34, 0x42, 0x82, 0xbd, 0xba, 0x0b, 0xc4, - 0x6c, 0x3f, 0x15, 0xfb, 0xa2, 0xd8, 0x30, 0xa6, 0x63, 0xcb, 0x31, 0x9b, - 0xfc, 0x8a, 0x3d, 0x0b, 0xcc, 0x7d, 0x26, 0x88, 0x0b, 0x8d, 0xcb, 0x67, - 0x64, 0xd9, 0x07, 0x1d, 0x8d, 0xcf, 0x8d, 0xa9, 0xba, 0x26, 0xd0, 0xc4, - 0xe3, 0x9c, 0x93, 0x1c, 0x27, 0x7d, 0x23, 0x4a, 0x35, 0x39, 0x87, 0xe4, - 0xd8, 0x47, 0x53, 0x59, 0xde, 0x06, 0xd7, 0x61, 0xd2, 0x86, 0xc2, 0xe4, - 0x03, 0x29, 0x87, 0x13, 0x31, 0x54, 0xec, 0x74, 0x84, 0x5c, 0x32, 0xb2, - 0xef, 0x5c, 0x76, 0xa1, 0x32, 0x03, 0x57, 0x94, 0x1d, 0xd5, 0x5d, 0xaa, - 0xdd, 0xb6, 0x56, 0x04, 0xfa, 0xe8, 0xe0, 0x3a, 0x98, 0x67, 0xc5, 0x67, - 0x8d, 0xec, 0xb3, 0xa6, 0xab, 0x7c, 0xd6, 0xe9, 0x7a, 0x37, 0x83, 0xab, - 0xc1, 0x01, 0x18, 0x57, 0x75, 0x3c, 0x9b, 0x40, 0xd9, 0x03, 0xc6, 0x61, - 0x38, 0x1c, 0xb3, 0x1b, 0xa7, 0xa2, 0xa3, 0x8c, 0x48, 0x68, 0xab, 0x8e, - 0x70, 0xf5, 0x62, 0xb5, 0x9d, 0xee, 0x2d, 0x33, 0x1e, 0x7c, 0xc7, 0x4b, - 0x17, 0x95, 0xc6, 0x73, 0xa9, 0xee, 0x7e, 0xd9, 0x44, 0x39, 0xdc, 0x7b, - 0x71, 0xa5, 0x86, 0x53, 0x3f, 0x74, 0xcf, 0xfa, 0x77, 0xba, 0xf0, 0xc8, - 0x14, 0xda, 0x35, 0x4a, 0x77, 0x6b, 0x72, 0xac, 0x66, 0xc6, 0x9a, 0x40, - 0x41, 0x4d, 0x21, 0x59, 0x54, 0xb7, 0xa3, 0xfd, 0x01, 0x91, 0x3f, 0x1e, - 0x65, 0x06, 0x02, 0x6e, 0x51, 0x38, 0x86, 0x10, 0x97, 0x87, 0x1c, 0x19, - 0xe0, 0x0b, 0x32, 0x80, 0x07, 0xc6, 0x0c, 0x16, 0x49, 0x83, 0x4d, 0x9a, - 0x2a, 0x6b, 0x13, 0x11, 0xea, 0x5b, 0xa2, 0x57, 0xf4, 0xa8, 0xaf, 0x11, - 0xb0, 0x4e, 0x0d, 0x81, 0xb4, 0x84, 0x32, 0x89, 0x3c, 0xd9, 0x3a, 0x24, - 0xcc, 0xaf, 0x4d, 0x80, 0x4f, 0x57, 0x1a, 0x71, 0x04, 0xa2, 0xef, 0xb0, - 0x5a, 0xc7, 0x63, 0x89, 0x51, 0x69, 0x02, 0xc4, 0x15, 0x1c, 0x75, 0x04, - 0x7b, 0x9b, 0xe1, 0x94, 0xc2, 0xbe, 0xd2, 0x59, 0x4f, 0x30, 0xd0, 0x39, - 0xd8, 0x0e, 0x9a, 0xa8, 0x2f, 0x64, 0xb0, 0x0f, 0x08, 0xe6, 0x35, 0x50, - 0xd6, 0x82, 0x30, 0x27, 0x7c, 0x4e, 0xed, 0x4d, 0x5c, 0x7c, 0x1c, 0x5f, - 0xbf, 0x4e, 0xdd, 0x3c, 0x4d, 0x44, 0x2f, 0x29, 0xd2, 0xe6, 0x98, 0x68, - 0x7e, 0xd3, 0xc7, 0xc9, 0xc8, 0x23, 0x69, 0x4f, 0x63, 0x92, 0x8e, 0x3c, - 0x8d, 0xc9, 0x97, 0xf1, 0x54, 0xfd, 0x5e, 0xde, 0x37, 0x61, 0x97, 0x1c, - 0x7e, 0x17, 0x4f, 0xcd, 0x94, 0x4e, 0xf3, 0x37, 0x46, 0xdc, 0x43, 0xf9, - 0xca, 0xd8, 0xa9, 0xcc, 0x8d, 0xc5, 0x3c, 0xc9, 0x5e, 0x66, 0xfa, 0xbe, - 0x01, 0x7d, 0x36, 0x44, 0x65, 0x40, 0x7f, 0x28, 0xc4, 0x15, 0xb1, 0x05, - 0x6a, 0x09, 0x30, 0xcf, 0x24, 0x71, 0x62, 0x1c, 0xfd, 0x3a, 0xe9, 0x4d, - 0xa8, 0xef, 0x54, 0x86, 0x29, 0xd3, 0x27, 0x4a, 0x3d, 0x0d, 0x94, 0x8f, - 0xd4, 0x95, 0xf2, 0x29, 0xea, 0x77, 0x7e, 0x42, 0x01, 0xfa, 0x75, 0x6e, - 0xb1, 0xe2, 0x65, 0x84, 0x30, 0xcf, 0xb0, 0xd0, 0x84, 0xfc, 0x36, 0x17, - 0xbf, 0xcd, 0xc5, 0x47, 0x9d, 0x8b, 0xdf, 0x72, 0xde, 0x37, 0xf8, 0x2c, - 0x3f, 0x6d, 0xcb, 0x79, 0x9b, 0xf5, 0xb2, 0x99, 0xa7, 0x8f, 0x76, 0xd1, - 0xbb, 0x4d, 0x10, 0x1d, 0xd6, 0xed, 0x7b, 0xfa, 0xb8, 0x1c, 0x5f, 0xfc, - 0x44, 0x5b, 0x40, 0x3e, 0xac, 0xe8, 0x71, 0xe3, 0x26, 0x6f, 0xde, 0x98, - 0x4f, 0x21, 0xb3, 0xc8, 0xda, 0x56, 0xfa, 0x76, 0x5b, 0xc9, 0x1b, 0x03, - 0x98, 0x90, 0x91, 0x22, 0xad, 0x12, 0xae, 0x2f, 0x52, 0xe6, 0x59, 0x70, - 0x51, 0xfa, 0xd5, 0x6a, 0x99, 0xde, 0x8b, 0xcd, 0x2c, 0x23, 0xe7, 0x41, - 0x25, 0xd4, 0x12, 0xe9, 0xd6, 0x17, 0x71, 0xf3, 0x96, 0x62, 0x94, 0xb3, - 0xff, 0x17, 0x9b, 0x78, 0xd1, 0x99, 0x70, 0x9b, 0xbd, 0xfe, 0x0d, 0x64, - 0x74, 0x32, 0xe5, 0xea, 0x4c, 0x0d, 0x6c, 0x0d, 0x5d, 0xcd, 0xd5, 0x7d, - 0xf8, 0x8f, 0xbf, 0xff, 0xe7, 0x1f, 0x3e, 0xcc, 0x13, 0x76, 0x0a, 0x69, - 0x92, 0xca, 0xb8, 0xbe, 0x90, 0xed, 0xda, 0x92, 0xff, 0x52, 0x62, 0x58, - 0x4a, 0xc8, 0xad, 0x46, 0xc0, 0x1f, 0x2b, 0x01, 0xf6, 0x7a, 0x66, 0x2c, - 0xf3, 0xc5, 0x56, 0x42, 0xb3, 0x8d, 0xe1, 0x6d, 0xc1, 0x1b, 0x8b, 0xb5, - 0x82, 0x8e, 0xca, 0xe1, 0x7c, 0xab, 0x09, 0x80, 0x3d, 0x98, 0xb6, 0xf5, - 0xe8, 0x5b, 0x4d, 0x1d, 0x6c, 0xf9, 0xe4, 0xe2, 0x78, 0xd3, 0x8a, 0xe5, - 0x1c, 0xf2, 0xd0, 0xc0, 0xee, 0x6f, 0x91, 0x4e, 0x7d, 0x88, 0x15, 0x1d, - 0x40, 0x98, 0x02, 0x06, 0xda, 0xc1, 0xe6, 0x3d, 0xf4, 0xb5, 0x12, 0x0f, - 0x03, 0x8f, 0xc5, 0x0d, 0x02, 0x8a, 0x69, 0x76, 0x57, 0x90, 0x5b, 0xc2, - 0xb7, 0xba, 0x3b, 0x04, 0xa7, 0x43, 0x50, 0x2b, 0x62, 0x08, 0x9c, 0x4b, - 0xf9, 0xcc, 0x91, 0x0b, 0x7e, 0x5a, 0x8f, 0x8a, 0x5b, 0x81, 0x01, 0x0a, - 0x68, 0x14, 0x7a, 0x4c, 0xfe, 0x83, 0xaf, 0x65, 0x7f, 0x9f, 0xa9, 0xda, - 0x21, 0x24, 0x2e, 0x77, 0x00, 0xfc, 0x02, 0xf9, 0x95, 0x01, 0x9c, 0x1e, - 0xc3, 0xd5, 0x80, 0x7c, 0x19, 0x39, 0x7f, 0x10, 0x78, 0x4f, 0x35, 0x48, - 0x89, 0xe5, 0x80, 0x86, 0xba, 0x65, 0x20, 0x5c, 0x49, 0x5e, 0x5a, 0xfd, - 0x60, 0x21, 0xb5, 0xc4, 0x40, 0x7b, 0x3d, 0xba, 0x7e, 0xaf, 0x87, 0x44, - 0x62, 0x54, 0x03, 0x32, 0x0b, 0xce, 0xc6, 0x3a, 0x40, 0xe5, 0x7f, 0x7d, - 0x46, 0xe7, 0x16, 0x5e, 0x8d, 0xc2, 0x42, 0x03, 0x62, 0x36, 0xcb, 0x5b, - 0x20, 0xba, 0x96, 0x54, 0x50, 0xcd, 0x89, 0xdc, 0x42, 0x62, 0x8e, 0x0c, - 0xe5, 0xdb, 0xe1, 0x09, 0x9f, 0x99, 0xbd, 0x4d, 0x8b, 0xdc, 0x40, 0xf1, - 0x10, 0x10, 0x78, 0x18, 0x97, 0x26, 0xf1, 0xd8, 0x38, 0x4a, 0x3c, 0x82, - 0x1b, 0xc9, 0xb6, 0x8c, 0xbf, 0x1a, 0x14, 0x12, 0xa5, 0x0f, 0x0f, 0x31, - 0x68, 0x8b, 0xa8, 0x72, 0xec, 0x00, 0x29, 0x3f, 0xb6, 0xab, 0x23, 0xf7, - 0xd7, 0x50, 0xa5, 0x00, 0x7a, 0xaf, 0xe0, 0x76, 0xe6, 0x32, 0x6d, 0x86, - 0x60, 0x21, 0x5a, 0x54, 0x1e, 0xc1, 0x72, 0x92, 0xf0, 0xf9, 0x43, 0x1c, - 0xb2, 0xdb, 0xf3, 0x0b, 0xe0, 0x7e, 0x02, 0x5e, 0xa2, 0x41, 0x57, 0xb5, - 0x23, 0x47, 0xd5, 0xd3, 0x14, 0xc3, 0x41, 0x4b, 0xe8, 0xe7, 0x22, 0x13, - 0xc5, 0x11, 0x3b, 0x8f, 0x3c, 0x24, 0x14, 0x2f, 0x4b, 0xfc, 0x6c, 0xeb, - 0x91, 0x70, 0x0c, 0x6f, 0x0e, 0x9c, 0xa0, 0xa5, 0x29, 0x14, 0xbe, 0x23, - 0xb9, 0x36, 0xf2, 0xba, 0x29, 0x2a, 0x0a, 0xf3, 0x0f, 0x91, 0x2f, 0x0e, - 0xe2, 0xa0, 0xa9, 0xfa, 0xac, 0x34, 0x73, 0xbb, 0x84, 0xdf, 0xaf, 0x6f, - 0x6f, 0x65, 0x2c, 0x1e, 0x27, 0xf8, 0x4b, 0x99, 0x5a, 0x45, 0x01, 0xc1, - 0x3a, 0x0a, 0xdb, 0xd1, 0x17, 0x00, 0xff, 0x18, 0x0e, 0x2b, 0xd4, 0xaf, - 0x73, 0x20, 0x4c, 0x7b, 0x24, 0x80, 0x72, 0x90, 0x8a, 0x9d, 0x5a, 0xa2, - 0x03, 0x00, 0xbc, 0xac, 0xc1, 0x33, 0x0b, 0xe0, 0x68, 0x92, 0x21, 0xc0, - 0xea, 0xd0, 0x53, 0x53, 0xb6, 0xbe, 0x22, 0x62, 0x5b, 0xfb, 0xc0, 0x33, - 0x9d, 0x5e, 0x33, 0x52, 0xbd, 0xda, 0x10, 0x90, 0x57, 0xb0, 0xbd, 0x58, - 0xe9, 0x74, 0x42, 0xf2, 0x18, 0xfc, 0xa6, 0xf8, 0x59, 0x7c, 0xfb, 0x9e, - 0x11, 0x3c, 0x47, 0x6e, 0xe5, 0x3b, 0xd2, 0xe8, 0x2d, 0xfd, 0xb6, 0xa6, - 0x5c, 0xc9, 0x6e, 0xb8, 0x81, 0x3c, 0x57, 0xf1, 0x35, 0x71, 0xb0, 0xc7, - 0x38, 0x65, 0x38, 0xa2, 0xbd, 0xf4, 0xed, 0xcb, 0xa3, 0xbf, 0x5e, 0x07, - 0x16, 0x8e, 0x03, 0x78, 0xb0, 0x88, 0xa8, 0x8b, 0xd7, 0x25, 0x34, 0x11, - 0x0c, 0x40, 0xe3, 0x0d, 0xbe, 0xbe, 0x47, 0x8f, 0x8b, 0x47, 0xe0, 0xb3, - 0x4c, 0x22, 0x03, 0x44, 0x4b, 0x63, 0xf1, 0x06, 0x2c, 0x51, 0x81, 0x36, - 0x79, 0x32, 0x4f, 0xdf, 0x0b, 0x0e, 0x68, 0x99, 0x8f, 0x7d, 0xf4, 0x76, - 0x30, 0xa5, 0x21, 0xa4, 0x1d, 0x71, 0x28, 0xf1, 0x98, 0x04, 0x4d, 0xe2, - 0xe7, 0xe9, 0x69, 0x34, 0x71, 0x30, 0xe1, 0xf4, 0x45, 0xf2, 0x48, 0x0c, - 0xcf, 0xe5, 0xe7, 0x19, 0x8b, 0x9f, 0x18, 0xdb, 0xb7, 0x2d, 0x17, 0xe1, - 0xf7, 0xb8, 0x8e, 0x30, 0x6d, 0x63, 0xb0, 0x14, 0x92, 0xa7, 0x83, 0x56, - 0x47, 0xeb, 0x0b, 0xcf, 0x59, 0x30, 0xc6, 0x54, 0xe7, 0xec, 0x91, 0x25, - 0xd9, 0xcb, 0x07, 0xa0, 0x09, 0xcb, 0xb3, 0x29, 0xb6, 0x41, 0x34, 0x7c, - 0xc2, 0xb4, 0x38, 0x85, 0x1c, 0x9a, 0x12, 0xd0, 0xed, 0xe0, 0x4a, 0x06, - 0xdf, 0x94, 0x39, 0x5f, 0x30, 0x14, 0x3c, 0x1e, 0xee, 0xe8, 0x51, 0x4c, - 0xcc, 0x0f, 0x6b, 0x2a, 0x1d, 0x62, 0x12, 0x8d, 0x25, 0xad, 0x44, 0x54, - 0xe0, 0xec, 0x78, 0x32, 0x96, 0x8f, 0x98, 0x28, 0xa6, 0x0c, 0xa7, 0xd7, - 0x68, 0xb9, 0xfb, 0x70, 0x0e, 0xc3, 0x9c, 0x01, 0x4d, 0x0b, 0x0a, 0xe7, - 0x96, 0xef, 0x65, 0x71, 0x6c, 0x73, 0xc2, 0x3e, 0xd7, 0xd5, 0xac, 0xcc, - 0xdc, 0xbe, 0x6e, 0x02, 0x2a, 0xcc, 0x40, 0x0e, 0xf8, 0x3e, 0x9c, 0x77, - 0xf4, 0x7a, 0x5e, 0xd8, 0x6f, 0x50, 0xde, 0x9c, 0x6f, 0xe1, 0xfb, 0xe1, - 0x1d, 0x7e, 0x73, 0x01, 0x04, 0x37, 0xf5, 0xe1, 0xdd, 0x79, 0x48, 0xbf, - 0x88, 0x00, 0x00, 0xf6, 0x2b, 0x72, 0xca, 0xb4, 0x15, 0x97, 0xb5, 0xae, - 0xe7, 0x3f, 0xee, 0x21, 0xb3, 0x91, 0xab, 0x4a, 0xb2, 0xe9, 0xbe, 0x0c, - 0x8d, 0x29, 0x68, 0x24, 0xed, 0x2a, 0x1b, 0x02, 0x73, 0x13, 0x1c, 0xfa, - 0xb2, 0x76, 0x5f, 0xf4, 0xb2, 0x22, 0x43, 0x31, 0x97, 0x4a, 0x4e, 0xdd, - 0xf8, 0x64, 0xa1, 0x90, 0x11, 0x7e, 0x5c, 0x72, 0x5c, 0x2c, 0x20, 0x9d, - 0x52, 0x0f, 0xe3, 0xe7, 0x8a, 0x18, 0x75, 0xad, 0xa3, 0x2b, 0x29, 0xa0, - 0xf3, 0xc2, 0x12, 0xb9, 0xaf, 0xb9, 0xab, 0x9b, 0x53, 0xe4, 0x56, 0x9d, - 0xd4, 0xa6, 0x8c, 0x00, 0x89, 0x0b, 0x68, 0x55, 0x37, 0x7e, 0x7e, 0xd8, - 0xe9, 0x20, 0x5c, 0x81, 0x28, 0x3a, 0x86, 0x96, 0x0c, 0xb9, 0x67, 0x0f, - 0x0c, 0x01, 0xaa, 0xb4, 0x8b, 0xf8, 0x9a, 0x26, 0xab, 0xf9, 0x31, 0x38, - 0x0c, 0xd0, 0x72, 0x28, 0xfd, 0x18, 0xcb, 0x8f, 0x7d, 0x4b, 0x86, 0x2c, - 0x3a, 0xda, 0xf7, 0x62, 0x47, 0x45, 0xd8, 0x6c, 0xa6, 0x1e, 0x54, 0x14, - 0xd6, 0x00, 0x1b, 0xa7, 0xfe, 0x09, 0x7c, 0xde, 0xf4, 0x09, 0xe0, 0xbd, - 0x13, 0xed, 0x60, 0xbd, 0xae, 0x9a, 0x92, 0xb2, 0x88, 0x11, 0x5b, 0xf6, - 0x31, 0x04, 0x2d, 0xd5, 0x17, 0x82, 0x08, 0x92, 0x22, 0xe4, 0xe6, 0x2f, - 0x00, 0x88, 0xd8, 0xae, 0x64, 0x77, 0xdf, 0x22, 0x20, 0xde, 0x0d, 0x1f, - 0x4c, 0x8d, 0xac, 0x89, 0xdf, 0xf2, 0x6b, 0x01, 0x8a, 0x7e, 0x51, 0xe8, - 0xdd, 0xef, 0x56, 0xbc, 0xc2, 0xf9, 0x65, 0x8b, 0xcf, 0xe5, 0xbe, 0x6b, - 0x05, 0x42, 0xa9, 0xa5, 0x74, 0x29, 0x3b, 0x0f, 0x97, 0x14, 0x6f, 0x39, - 0x50, 0x16, 0x0d, 0x2b, 0xa9, 0xbb, 0xe6, 0xbb, 0x96, 0x5d, 0x3e, 0xa1, - 0x27, 0x30, 0xf4, 0xc5, 0x67, 0x8e, 0xe5, 0xba, 0xd2, 0xa6, 0x2e, 0x62, - 0x95, 0xbd, 0x8d, 0x0b, 0x91, 0x5d, 0xea, 0xa0, 0xdc, 0x37, 0x7c, 0x38, - 0x41, 0x52, 0x02, 0x66, 0x04, 0x73, 0x4f, 0x7b, 0x7e, 0xed, 0x00, 0xbb, - 0x3e, 0x7c, 0x48, 0x58, 0x7b, 0xb2, 0x77, 0x2b, 0x24, 0xe6, 0xdf, 0x62, - 0xb1, 0xf7, 0xc5, 0x62, 0x7f, 0x79, 0x6d, 0x0e, 0xf8, 0x32, 0xa0, 0x6f, - 0x87, 0x03, 0xfe, 0x97, 0x3f, 0x29, 0x81, 0xcf, 0x7b, 0x6b, 0x0d, 0xeb, - 0x21, 0x09, 0xce, 0xff, 0xb4, 0x11, 0x97, 0x6d, 0x88, 0xd1, 0xe0, 0x70, - 0xe8, 0x20, 0x6f, 0xbf, 0xc7, 0xf2, 0xfa, 0x3d, 0x82, 0xd0, 0x8d, 0x0e, - 0xde, 0xb3, 0x46, 0x82, 0x05, 0xcb, 0x36, 0xe2, 0xf1, 0x2c, 0x84, 0x31, - 0x96, 0x72, 0x2c, 0xa9, 0xfb, 0xa7, 0x02, 0x94, 0x5d, 0xc5, 0x04, 0x5e, - 0x28, 0x81, 0xbe, 0xa5, 0xe6, 0xf9, 0xc1, 0x3d, 0xf0, 0x32, 0x1b, 0x0e, - 0x21, 0xdf, 0x53, 0xe4, 0x9c, 0x16, 0xa9, 0x0b, 0x2a, 0x0c, 0xde, 0x7d, - 0xfc, 0xe3, 0x1f, 0xdf, 0xa1, 0xb7, 0xad, 0xf0, 0xc4, 0xdf, 0x6b, 0x5c, - 0x16, 0x77, 0x20, 0x3c, 0xbb, 0xf6, 0x95, 0xa6, 0xab, 0x87, 0x4d, 0xa8, - 0x9c, 0x7a, 0x81, 0xd3, 0x16, 0xb6, 0x3f, 0x80, 0x0b, 0x22, 0xee, 0xb6, - 0x1e, 0x48, 0x7d, 0x1f, 0x71, 0xbb, 0x52, 0xbd, 0xb4, 0xd2, 0x6a, 0x69, - 0x6f, 0xdb, 0x4e, 0xd4, 0x7a, 0x50, 0xe1, 0x58, 0x8e, 0x2a, 0xd5, 0x21, - 0x38, 0x01, 0x84, 0xb7, 0xce, 0xf3, 0xfe, 0x4c, 0xc4, 0x40, 0xf8, 0x8f, - 0x7d, 0xb1, 0x73, 0x8f, 0xa7, 0xe2, 0xd3, 0xb4, 0x4f, 0xb5, 0x2e, 0x42, - 0xeb, 0x93, 0x5b, 0x66, 0x14, 0xe4, 0x3e, 0x7d, 0xdb, 0x1d, 0x6f, 0xb0, - 0xf8, 0x7f, 0x7c, 0xe5, 0xdd, 0xd1, 0xbe, 0xa9, 0xdd, 0xf1, 0xcf, 0x32, - 0x5c, 0xfe, 0x5e, 0xfb, 0x75, 0xbe, 0xab, 0x10, 0x0f, 0x03, 0x11, 0x39, - 0x4a, 0xeb, 0x7b, 0x10, 0x7b, 0x20, 0x91, 0x21, 0x88, 0x53, 0x35, 0x02, - 0xbe, 0x44, 0xd6, 0x44, 0x41, 0x3e, 0x07, 0xf1, 0xc4, 0xc0, 0x81, 0xb1, - 0x08, 0xf1, 0x30, 0x87, 0x34, 0xd3, 0x3d, 0xe0, 0x12, 0x38, 0xea, 0x65, - 0x98, 0x3f, 0x65, 0xb0, 0x89, 0x43, 0x59, 0x39, 0xfb, 0x62, 0x7f, 0x59, - 0x75, 0x42, 0x4b, 0x87, 0xa2, 0xdf, 0x28, 0x8f, 0xf4, 0xa6, 0x3b, 0xff, - 0x6d, 0x8d, 0xb8, 0x61, 0x8d, 0xf8, 0xf3, 0x56, 0x34, 0xc3, 0x73, 0x2c, - 0x10, 0x65, 0x34, 0xdf, 0xd0, 0x02, 0x21, 0x32, 0xf6, 0x19, 0x82, 0x0c, - 0xf4, 0x5f, 0x50, 0x4b, 0x19, 0x28, 0x8c, 0x62, 0x05, 0x11, 0x30, 0x83, - 0xee, 0x97, 0x81, 0xce, 0xf7, 0x10, 0x8f, 0xea, 0x37, 0xa6, 0x26, 0x95, - 0xfa, 0x65, 0x02, 0x8a, 0x39, 0x86, 0x0c, 0x61, 0x65, 0xc3, 0x80, 0x39, - 0x15, 0x8e, 0x56, 0x37, 0x49, 0x8c, 0xcc, 0x88, 0xa1, 0x9a, 0xfe, 0x60, - 0x7c, 0xd6, 0x13, 0x66, 0x1d, 0x50, 0x7a, 0xa6, 0xc7, 0x32, 0xc5, 0xb4, - 0x52, 0x45, 0x63, 0xcd, 0x36, 0x06, 0x20, 0xc8, 0xc2, 0x61, 0xde, 0xa1, - 0x26, 0x0d, 0xb9, 0xfc, 0x2f, 0x1f, 0x91, 0x3d, 0xa9, 0xaf, 0xd4, 0x48, - 0xe8, 0xaa, 0xa0, 0x40, 0x54, 0x4d, 0x5c, 0x54, 0xad, 0x28, 0x99, 0x21, - 0x5f, 0xac, 0x6c, 0x5b, 0x7e, 0x93, 0x2a, 0xae, 0x21, 0x12, 0x25, 0x68, - 0xf2, 0x1a, 0xe2, 0xd7, 0xad, 0x12, 0x1b, 0x4a, 0x4b, 0x72, 0xa9, 0xa0, - 0xd4, 0xd2, 0x8b, 0x4e, 0xe3, 0xdb, 0xcc, 0xfa, 0xfb, 0xdd, 0x21, 0xfb, - 0x6b, 0x9d, 0x7d, 0x88, 0xf3, 0x95, 0xf1, 0x13, 0x81, 0x07, 0xf8, 0xd3, - 0x2a, 0xa3, 0xd0, 0xa4, 0x6e, 0x4f, 0x2b, 0x4c, 0x3e, 0xfa, 0xac, 0xf3, - 0x09, 0xe5, 0x4e, 0x84, 0x44, 0xe7, 0x4e, 0xbd, 0x23, 0xf6, 0x2d, 0x2f, - 0xe0, 0x0f, 0xb3, 0xdb, 0xe2, 0x7a, 0x67, 0xe7, 0x1a, 0xf7, 0x4b, 0x74, - 0x86, 0x25, 0x6e, 0xa6, 0xb4, 0xc2, 0x80, 0x54, 0x93, 0x66, 0xdb, 0xa9, - 0x99, 0xc0, 0x24, 0x32, 0x5b, 0xc2, 0xa0, 0xf7, 0xd0, 0x00, 0x75, 0xd9, - 0xa6, 0x02, 0x2c, 0x83, 0x00, 0x83, 0x38, 0xb1, 0x3e, 0xfd, 0xfb, 0x92, - 0x58, 0xdb, 0x05, 0x50, 0x0a, 0x5d, 0xb5, 0xd2, 0xb3, 0x89, 0x06, 0x0a, - 0x18, 0xce, 0xd9, 0x47, 0x37, 0x0d, 0x9f, 0xf2, 0x82, 0x72, 0x02, 0x3c, - 0x17, 0xf9, 0x94, 0x81, 0x73, 0xe0, 0xff, 0x05, 0xc5, 0x84, 0x7b, 0xdb, - 0x9d, 0x47, 0x7a, 0x05, 0x20, 0x97, 0xd2, 0xdc, 0xa0, 0x93, 0x87, 0xeb, - 0xed, 0xde, 0xbd, 0xe7, 0xfc, 0xf5, 0x12, 0x4b, 0xec, 0x1d, 0xac, 0x97, - 0x8d, 0x20, 0x86, 0xd2, 0x3c, 0x63, 0x56, 0x96, 0x02, 0xab, 0x3e, 0x13, - 0xf4, 0x04, 0x59, 0x58, 0x99, 0xfb, 0x42, 0xd8, 0x25, 0xec, 0x06, 0x1e, - 0x19, 0xc2, 0x17, 0x20, 0x00, 0x96, 0xb7, 0x2d, 0x4a, 0x8f, 0x23, 0xd6, - 0x37, 0x4d, 0x6a, 0x76, 0x04, 0x97, 0xa6, 0x7f, 0x11, 0x6a, 0xf5, 0xdf, - 0xc5, 0x3d, 0x30, 0x3d, 0x0e, 0x65, 0x8b, 0x7c, 0x5e, 0xe2, 0xf6, 0x90, - 0x1e, 0x46, 0xb8, 0x6c, 0xe7, 0xb8, 0x9a, 0x0a, 0xd2, 0x60, 0xbd, 0x2e, - 0xdf, 0x8c, 0x31, 0xf5, 0x67, 0xe0, 0x62, 0xfb, 0xf5, 0x1f, 0x44, 0x73, - 0xf3, 0x8c, 0x81, 0x14, 0x6c, 0x7f, 0xde, 0x50, 0x14, 0x26, 0x7f, 0x07, - 0x11, 0x91, 0x64, 0xf5, 0x29, 0xae, 0x88, 0x62, 0xd6, 0x1b, 0xc1, 0x65, - 0x5b, 0x51, 0x9c, 0x95, 0x6e, 0x7f, 0xb8, 0xa9, 0xfa, 0x6a, 0x26, 0x51, - 0x86, 0xf0, 0x10, 0xb3, 0x79, 0x36, 0x81, 0xbf, 0xdf, 0x19, 0xdf, 0xf2, - 0x0e, 0x5c, 0x2e, 0xd5, 0x8e, 0x3c, 0x4f, 0x25, 0xf8, 0x8e, 0x5a, 0xe5, - 0xd5, 0x55, 0x64, 0xcb, 0x62, 0x49, 0x3f, 0x6e, 0x04, 0x74, 0x50, 0xc0, - 0x0c, 0x41, 0xf6, 0xfc, 0xad, 0xc9, 0xd0, 0x37, 0xed, 0x31, 0x52, 0xbb, - 0x0c, 0xd1, 0xb9, 0xb0, 0xa1, 0xc4, 0x0d, 0x94, 0x65, 0xbb, 0x15, 0x86, - 0x65, 0x3a, 0x50, 0x9c, 0xdf, 0xff, 0xe0, 0x46, 0x71, 0x9b, 0x21, 0xfd, - 0x04, 0x86, 0x14, 0xa4, 0x03, 0xc2, 0xaa, 0x1d, 0xe5, 0xa9, 0x01, 0x9d, - 0x09, 0xea, 0xa1, 0x3b, 0x39, 0x85, 0x45, 0xa7, 0xe6, 0xd0, 0xce, 0x9c, - 0xf5, 0x34, 0x07, 0x4f, 0xd7, 0xdf, 0x59, 0x59, 0x24, 0x3e, 0xca, 0x06, - 0xf5, 0x3a, 0x4f, 0x2c, 0xa3, 0xf1, 0x37, 0x39, 0x77, 0x67, 0x6a, 0xa9, - 0xc1, 0x16, 0x3d, 0x4d, 0x0c, 0x2a, 0x9c, 0xc4, 0x3d, 0x0a, 0xc1, 0x18, - 0x60, 0x92, 0xf0, 0x71, 0xc1, 0xf9, 0xb3, 0xf4, 0x07, 0x04, 0x8c, 0x52, - 0x41, 0x13, 0x44, 0xea, 0x9a, 0xd0, 0x66, 0x84, 0x5a, 0x30, 0xe4, 0xe3, - 0x80, 0xf4, 0x7c, 0xd6, 0xf9, 0xcc, 0xa5, 0x08, 0x02, 0xb8, 0xc6, 0xcb, - 0x5e, 0x24, 0x02, 0x29, 0x6a, 0xd1, 0x88, 0x24, 0xc7, 0x03, 0x1e, 0xdc, - 0x8a, 0x5e, 0xcd, 0x5a, 0xcb, 0xfc, 0x38, 0xf4, 0x31, 0x5d, 0x7f, 0xc2, - 0x07, 0xbd, 0xd4, 0x8b, 0x1a, 0x98, 0x95, 0x18, 0x9d, 0x06, 0x5b, 0xa0, - 0xe9, 0x3a, 0xb3, 0x79, 0xf5, 0x2c, 0xc9, 0x43, 0xfc, 0x3e, 0xeb, 0x15, - 0xfe, 0x26, 0xf3, 0xfc, 0x5a, 0x42, 0xcf, 0x6e, 0xab, 0x57, 0x98, 0x45, - 0x03, 0x63, 0x8f, 0x11, 0x35, 0x86, 0xbd, 0xeb, 0x84, 0x7b, 0xb1, 0x8f, - 0x92, 0x8b, 0x19, 0x5d, 0xcf, 0x09, 0x3d, 0x26, 0x04, 0x86, 0x3a, 0xcc, - 0xe3, 0x88, 0x77, 0x67, 0xa2, 0x0d, 0x94, 0x41, 0xc0, 0x8a, 0x03, 0x28, - 0x95, 0x5c, 0x91, 0x77, 0x2f, 0xed, 0x49, 0x92, 0xec, 0xac, 0xba, 0x25, - 0x67, 0xd8, 0xdf, 0x46, 0xb2, 0xfc, 0x36, 0x93, 0xfc, 0x79, 0x77, 0xb0, - 0xd1, 0x6e, 0x34, 0xc9, 0xfb, 0x26, 0x74, 0x1b, 0xe8, 0x21, 0xba, 0xb7, - 0x13, 0x51, 0xff, 0x4d, 0x66, 0xa8, 0x32, 0x4f, 0xad, 0x86, 0x87, 0x42, - 0xe7, 0x7e, 0xcb, 0xee, 0x86, 0xce, 0xe6, 0x61, 0xc9, 0x92, 0xc9, 0x70, - 0x79, 0xa6, 0xba, 0x06, 0xd2, 0x1d, 0xac, 0x6a, 0x01, 0x10, 0x3f, 0xd5, - 0x83, 0x50, 0x15, 0x6e, 0xd6, 0x03, 0xe1, 0x72, 0x1c, 0x5c, 0x78, 0x0e, - 0x44, 0xfe, 0xa9, 0xf0, 0x21, 0x8e, 0xf4, 0x54, 0x18, 0xf6, 0xc6, 0x02, - 0x22, 0xf8, 0xbb, 0x39, 0x84, 0x2f, 0x58, 0x26, 0x01, 0x2e, 0x8d, 0x16, - 0x53, 0x49, 0x46, 0xc3, 0xaa, 0x5c, 0x36, 0xa4, 0xb5, 0x2e, 0xe6, 0x38, - 0xc9, 0x1e, 0x61, 0x06, 0xc0, 0xaa, 0xfb, 0x6d, 0x96, 0xea, 0x71, 0x84, - 0x16, 0x75, 0x46, 0xad, 0xf8, 0x52, 0x74, 0x78, 0x39, 0xa9, 0x9d, 0x4e, - 0xda, 0x67, 0x80, 0xb9, 0x76, 0xb0, 0x57, 0xef, 0x8f, 0xe5, 0x25, 0x2e, - 0x07, 0x48, 0x05, 0x06, 0xa6, 0x75, 0x1f, 0x18, 0x67, 0xc3, 0x85, 0x9b, - 0xea, 0x09, 0xf4, 0x20, 0x3c, 0xf1, 0x8a, 0xfb, 0xc5, 0xbd, 0x1c, 0x8b, - 0x18, 0x08, 0x37, 0x4c, 0x15, 0x26, 0xe6, 0xe1, 0xa8, 0x8d, 0xca, 0x67, - 0x35, 0xfa, 0xcc, 0x32, 0xca, 0xcc, 0xba, 0x7b, 0x41, 0x92, 0xd5, 0xf8, - 0x6c, 0xbe, 0xa2, 0xa6, 0x70, 0xb6, 0x47, 0x1b, 0xac, 0xeb, 0xd3, 0x5e, - 0xc5, 0x2a, 0x96, 0xde, 0x63, 0xe5, 0x5f, 0xe7, 0xa8, 0x8e, 0x87, 0x4b, - 0xa8, 0xf4, 0x5c, 0x59, 0x85, 0x38, 0xdf, 0xcd, 0x77, 0x77, 0xcb, 0x50, - 0x3d, 0xdc, 0x3d, 0x30, 0x8c, 0x65, 0xe7, 0xbd, 0x5a, 0xc0, 0x03, 0xea, - 0x9a, 0xda, 0x89, 0x34, 0xcd, 0x2b, 0x7a, 0xa5, 0xca, 0xdc, 0x7c, 0x59, - 0xfd, 0x3d, 0x3f, 0x94, 0x59, 0xbd, 0xce, 0x13, 0x61, 0x08, 0x64, 0x6a, - 0x6f, 0x5a, 0x74, 0x26, 0xd5, 0x1a, 0x0e, 0xb2, 0xe2, 0xc4, 0xbc, 0xe6, - 0x79, 0x2f, 0x1a, 0x78, 0xdd, 0x82, 0x6a, 0x14, 0x57, 0x5d, 0x01, 0x0f, - 0x19, 0xf6, 0x0c, 0x7e, 0x28, 0xe5, 0x63, 0xae, 0x71, 0x08, 0x0e, 0x88, - 0xcb, 0x29, 0xcb, 0xb0, 0x0c, 0x5b, 0x05, 0x84, 0x0b, 0x79, 0x02, 0xbc, - 0x80, 0x62, 0x4d, 0x20, 0xd5, 0xb4, 0x21, 0x34, 0x9f, 0xca, 0xf8, 0xf8, - 0xa8, 0x3d, 0x1c, 0xbb, 0x91, 0x4f, 0x90, 0x56, 0x51, 0xce, 0xc6, 0x94, - 0xee, 0xfa, 0xd8, 0x7e, 0xe9, 0x33, 0x93, 0xb1, 0xe4, 0xc1, 0x24, 0x28, - 0xed, 0xcc, 0x5c, 0x8d, 0x8a, 0x4e, 0x76, 0xe0, 0x7a, 0xbf, 0x8c, 0x05, - 0x66, 0x70, 0x6d, 0x00, 0xb5, 0x4d, 0xbc, 0x0a, 0x01, 0x33, 0x1c, 0x45, - 0x19, 0x5c, 0x2a, 0xcb, 0x33, 0xde, 0x8b, 0xb5, 0x95, 0x7d, 0xc6, 0x47, - 0x12, 0x38, 0x9e, 0xeb, 0xcf, 0xdc, 0x97, 0xa1, 0x55, 0x29, 0x3a, 0xae, - 0xfa, 0x83, 0x65, 0xdd, 0x19, 0x7c, 0x0e, 0x7c, 0x58, 0x40, 0xe6, 0x00, - 0x6a, 0x1d, 0x0a, 0xf6, 0x6c, 0x5f, 0x1d, 0x13, 0x3e, 0xf7, 0x3b, 0x7e, - 0x14, 0x86, 0xb9, 0xb9, 0x70, 0xb1, 0x16, 0xfb, 0xc1, 0xbf, 0x43, 0xed, - 0x5f, 0x6f, 0xa1, 0xad, 0x09, 0x2b, 0x1b, 0xe9, 0x2b, 0x75, 0x50, 0x69, - 0xcc, 0xff, 0x4a, 0x3c, 0x8d, 0x86, 0x04, 0xae, 0x6d, 0x1c, 0xe0, 0xcd, - 0x6c, 0xfd, 0xa6, 0x65, 0x09, 0xab, 0x49, 0x1f, 0x1c, 0x6c, 0xe8, 0x27, - 0x14, 0x27, 0xd2, 0x07, 0x43, 0xee, 0x68, 0xfe, 0x70, 0xd3, 0x57, 0x42, - 0x58, 0x01, 0x10, 0x80, 0xfa, 0x5a, 0x17, 0xc3, 0x48, 0xc8, 0x00, 0xff, - 0x94, 0xb1, 0xf4, 0xd2, 0x86, 0x6c, 0xf9, 0x19, 0x91, 0x88, 0xd9, 0x2b, - 0x4d, 0x3b, 0x0f, 0x2b, 0x41, 0x31, 0xfa, 0xe6, 0xf9, 0x70, 0x66, 0x78, - 0xbe, 0x20, 0x1a, 0xb7, 0xc8, 0x33, 0xd1, 0x34, 0x12, 0xe7, 0x4d, 0x05, - 0x2f, 0xe5, 0x86, 0xba, 0x48, 0x1c, 0xcb, 0xc4, 0xe0, 0x66, 0x19, 0xd8, - 0xe8, 0xbd, 0xba, 0x5e, 0x2b, 0xb1, 0x0c, 0xa1, 0xf0, 0x86, 0x79, 0xc9, - 0xa8, 0xa0, 0xb1, 0xab, 0xa9, 0xb9, 0xf5, 0xd0, 0xe4, 0xdb, 0xe2, 0x63, - 0x38, 0xdf, 0xf3, 0xb9, 0x96, 0xf8, 0x04, 0xbc, 0x7a, 0x50, 0xd4, 0x01, - 0x65, 0xcd, 0xae, 0xc6, 0x97, 0x64, 0x5f, 0x20, 0x47, 0xc1, 0x19, 0xa0, - 0xe2, 0x9e, 0xb2, 0x08, 0x95, 0x7d, 0xc0, 0x5d, 0xbd, 0x0f, 0xf8, 0x79, - 0x5a, 0xdc, 0x0a, 0x31, 0x11, 0xcf, 0x73, 0x4a, 0x8e, 0x86, 0x5c, 0x8e, - 0xa9, 0x24, 0x61, 0x3b, 0x89, 0xdb, 0xe2, 0x28, 0x39, 0x2a, 0xcc, 0xcb, - 0xd6, 0x85, 0xb6, 0x02, 0xf1, 0x83, 0xe7, 0x84, 0x72, 0x54, 0x4c, 0x1d, - 0x4e, 0xbc, 0xc8, 0x61, 0x1d, 0x6f, 0x26, 0x79, 0x03, 0x32, 0xec, 0x0e, - 0xfe, 0x3e, 0x2e, 0x59, 0x50, 0xdf, 0x8b, 0xf3, 0x1a, 0x09, 0x57, 0xcf, - 0x57, 0x29, 0xd8, 0x14, 0x33, 0x2c, 0x51, 0x80, 0x35, 0xe0, 0x55, 0x4a, - 0x60, 0xb7, 0x9b, 0xbd, 0x8c, 0xfa, 0x45, 0xae, 0x58, 0xc2, 0x84, 0x77, - 0x07, 0x1e, 0x83, 0x38, 0x81, 0x48, 0xcc, 0xdf, 0x9c, 0xa8, 0x3e, 0xa0, - 0x69, 0x8b, 0x6f, 0x04, 0xb5, 0x3a, 0xb1, 0xa7, 0x0a, 0x7a, 0x04, 0x52, - 0x45, 0xf9, 0x83, 0x2e, 0x51, 0x17, 0x62, 0x84, 0xcc, 0xba, 0x13, 0x2c, - 0x54, 0x22, 0x47, 0xff, 0xe9, 0xfc, 0xee, 0x59, 0xc7, 0xc6, 0x05, 0x0d, - 0xa8, 0xfe, 0x02, 0x26, 0xfb, 0xca, 0x5f, 0xb3, 0x13, 0x26, 0xc8, 0xb4, - 0xa1, 0x19, 0xd6, 0x22, 0x0b, 0xfd, 0xc7, 0x03, 0xa3, 0x98, 0xe5, 0xcd, - 0xef, 0x92, 0x35, 0xe4, 0xcb, 0x97, 0xff, 0x0f, 0x46, 0x6f, 0x78, 0x06, - 0xa2, 0xb5, 0x04, 0x00 -}; -z_const size_t kPhoneNumberMetaDataCompressedLength = sizeof(kPhoneNumberMetaData); + 0x1f, 0x8b, 0x08, 0x08, 0x59, 0x5d, 0xf0, 0x59, 0x00, 0x03, 0x50, 0x68, + 0x6f, 0x6e, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4d, 0x65, 0x74, + 0x61, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x00, 0xec, + 0xbd, 0x5b, 0x8f, 0x1c, 0x47, 0x92, 0x2e, 0xf8, 0x57, 0x84, 0x84, 0x1e, + 0x2a, 0x17, 0x99, 0x40, 0xf8, 0xdd, 0x7d, 0x5e, 0x08, 0x89, 0x92, 0x28, + 0x89, 0xa4, 0xa4, 0x16, 0x29, 0x75, 0x4b, 0xc9, 0x7c, 0x18, 0xec, 0x0c, + 0x16, 0x0b, 0x1c, 0x4c, 0x2f, 0x16, 0x73, 0x80, 0x3d, 0xe8, 0xe0, 0xf9, + 0xed, 0xeb, 0x76, 0x71, 0x8f, 0xc8, 0x08, 0xf3, 0xc8, 0xa8, 0xcc, 0xaa, + 0x62, 0x51, 0x55, 0x73, 0x4e, 0x53, 0x95, 0x99, 0xe1, 0x97, 0xf0, 0x8b, + 0xb9, 0xb9, 0xd9, 0x67, 0x9f, 0xfd, 0x6b, 0xf3, 0x7f, 0xfe, 0xf3, 0x7f, + 0xfe, 0xd7, 0x7f, 0xff, 0xbf, 0xff, 0xeb, 0xe5, 0x3f, 0xff, 0xe3, 0x3f, + 0xdf, 0xff, 0xf3, 0xd7, 0xff, 0xfc, 0xbf, 0xfe, 0xef, 0x7f, 0xfe, 0x17, + 0xfc, 0xfd, 0xf6, 0xdf, 0xff, 0x9f, 0xcd, 0xbf, 0xfd, 0x6b, 0xa3, 0x36, + 0xff, 0x76, 0xd8, 0xfc, 0xf6, 0x6e, 0xb3, 0xdb, 0x7c, 0xf5, 0x0a, 0xfe, + 0xf9, 0x01, 0xfe, 0x81, 0x8f, 0x5f, 0x7f, 0x0d, 0xff, 0xbc, 0x85, 0x7f, + 0xe0, 0xe3, 0xcb, 0xaf, 0xf2, 0x3f, 0xdf, 0xc0, 0xc7, 0x6f, 0x7e, 0xce, + 0xff, 0xbc, 0xfa, 0x06, 0xfe, 0xf9, 0x2d, 0xff, 0xf3, 0x23, 0x7c, 0xf7, + 0xfa, 0x27, 0xf8, 0xe7, 0x8f, 0xfc, 0xcf, 0x9b, 0x97, 0xf9, 0x9f, 0xb7, + 0xbf, 0xc0, 0x3f, 0x50, 0xec, 0x97, 0x5f, 0xf3, 0x3f, 0xef, 0xfe, 0x91, + 0xff, 0x79, 0x0f, 0x3f, 0xbc, 0x7f, 0x9f, 0xff, 0xf9, 0x1d, 0xfe, 0xfa, + 0x1d, 0x5a, 0xfb, 0xfd, 0x87, 0xcd, 0x71, 0xb7, 0x09, 0xd0, 0x85, 0x5f, + 0xa1, 0xae, 0xd7, 0x7f, 0xc2, 0x67, 0xdd, 0xc1, 0x17, 0xdf, 0xbe, 0xc2, + 0xbf, 0xf1, 0xc7, 0x3f, 0xbf, 0x82, 0xbf, 0x0d, 0x7e, 0xff, 0xea, 0x57, + 0xfc, 0x1b, 0xfb, 0xfd, 0xd3, 0x1b, 0xfc, 0x5b, 0xc3, 0xdf, 0x5f, 0x7f, + 0x8b, 0x7f, 0x1b, 0xf8, 0xfb, 0x3b, 0x7a, 0xc6, 0x62, 0x3d, 0xef, 0xf0, + 0x6f, 0x0f, 0x7f, 0x7f, 0xff, 0x1b, 0xfe, 0x9d, 0xe0, 0xef, 0x1f, 0xb0, + 0x2b, 0x58, 0xb1, 0xc5, 0x8a, 0x7f, 0xfd, 0x19, 0xff, 0xc6, 0x8a, 0x5f, + 0x7e, 0x8f, 0x7f, 0x63, 0x65, 0x5f, 0xbd, 0xc7, 0xbf, 0xb1, 0xb2, 0x57, + 0x30, 0x28, 0xaf, 0xa0, 0xeb, 0x3f, 0xc0, 0x6b, 0xff, 0x88, 0x6d, 0x5a, + 0x07, 0x3f, 0x7d, 0xf3, 0x1a, 0xff, 0xc6, 0x76, 0xde, 0xd1, 0xf7, 0xd8, + 0xf7, 0x9f, 0x60, 0xb8, 0xde, 0xfd, 0x88, 0x5f, 0x44, 0xf8, 0xe2, 0x17, + 0xec, 0xb4, 0xc5, 0x4e, 0x7c, 0x83, 0x0f, 0x3a, 0x6c, 0xf3, 0x17, 0xfa, + 0x1b, 0x5f, 0xe6, 0xed, 0x3f, 0xf0, 0x6f, 0x6c, 0xff, 0x25, 0x76, 0xda, + 0x61, 0xfb, 0x5f, 0xe1, 0x8b, 0x39, 0x6c, 0xf0, 0x6b, 0xfa, 0x1b, 0x1b, + 0x7c, 0x89, 0x75, 0x3a, 0x6c, 0xf0, 0x25, 0xbe, 0x87, 0xc3, 0xb6, 0x7e, + 0xc7, 0x3a, 0x3d, 0xbe, 0xdf, 0xdb, 0x3f, 0xf0, 0x6f, 0x6c, 0xeb, 0x2b, + 0x18, 0xed, 0x97, 0x30, 0x0f, 0x2f, 0xb1, 0x25, 0x8f, 0xad, 0xfe, 0xf0, + 0x0d, 0xfe, 0x8d, 0xad, 0xfe, 0x82, 0x23, 0xe0, 0xb1, 0xd5, 0x9f, 0x70, + 0x5a, 0x3c, 0xb6, 0xfa, 0x0e, 0xa7, 0xc5, 0x63, 0xab, 0xef, 0xf1, 0x99, + 0x88, 0x35, 0xfe, 0xf8, 0x0b, 0xfe, 0x8d, 0xf5, 0xbc, 0xc6, 0x9e, 0x45, + 0x2c, 0xfb, 0xfb, 0x4f, 0xf8, 0x37, 0xf5, 0x12, 0xff, 0x4e, 0xd8, 0x9b, + 0xf7, 0xf8, 0x4c, 0xc2, 0xb2, 0x3f, 0xd0, 0xf7, 0x58, 0xf6, 0x17, 0x1c, + 0xc6, 0x44, 0x23, 0xff, 0x1d, 0xfe, 0x8d, 0xf5, 0xbc, 0xa1, 0xef, 0xb1, + 0x0f, 0x6f, 0xdf, 0xe2, 0xdf, 0xf8, 0x86, 0x3f, 0x60, 0x3d, 0x5a, 0x61, + 0x45, 0xef, 0xde, 0xd1, 0x07, 0x1a, 0x43, 0x58, 0xb1, 0xdf, 0x7e, 0x4f, + 0xdf, 0x60, 0x7d, 0xdf, 0xd0, 0xf2, 0x52, 0xd4, 0xf9, 0x9f, 0xe8, 0x03, + 0xd6, 0xf2, 0x06, 0xc7, 0x46, 0xd3, 0xca, 0x7b, 0xf5, 0x96, 0x3e, 0x50, + 0x95, 0xf4, 0x98, 0xa6, 0x2a, 0xa9, 0x31, 0x8d, 0xb5, 0xbd, 0x7d, 0x43, + 0x1f, 0x68, 0x61, 0xf0, 0x63, 0xd8, 0xbf, 0x97, 0x3f, 0xd0, 0x07, 0x6c, + 0xe7, 0xeb, 0xef, 0xe8, 0x03, 0x2d, 0x86, 0x6f, 0xe9, 0x03, 0x36, 0xfa, + 0x9e, 0x56, 0xb8, 0xc6, 0x95, 0xf0, 0x35, 0xae, 0x10, 0x4d, 0x6b, 0xfc, + 0xed, 0x6f, 0xf4, 0x01, 0x7b, 0xf0, 0x86, 0x1a, 0xa5, 0x55, 0xfe, 0x8e, + 0x1a, 0xa5, 0x65, 0xfe, 0x8a, 0x5e, 0x8e, 0xd6, 0xf9, 0x4f, 0x54, 0x9b, + 0xc1, 0x1e, 0xbc, 0xff, 0x86, 0x3e, 0xd0, 0xb0, 0x53, 0x0f, 0x0c, 0xad, + 0x0e, 0x7a, 0x39, 0x83, 0x3d, 0x78, 0xf9, 0x3b, 0x7d, 0xc0, 0x1e, 0xbc, + 0xc3, 0x75, 0xae, 0x69, 0x33, 0xbc, 0xfa, 0x1b, 0x7d, 0xc0, 0x1e, 0xbc, + 0xfa, 0x8a, 0x3e, 0x60, 0x0f, 0x5e, 0x52, 0x3b, 0xb4, 0x37, 0x5e, 0x52, + 0x3b, 0xb4, 0x39, 0xbe, 0xfa, 0x99, 0x3e, 0x60, 0x0f, 0x5e, 0xfd, 0x9d, + 0x3e, 0x60, 0x0f, 0x7e, 0xe0, 0x5f, 0xb0, 0x07, 0x5f, 0xbd, 0xa4, 0x0f, + 0xd8, 0x83, 0x77, 0xfc, 0x81, 0x7a, 0x40, 0xb5, 0x39, 0xda, 0x8e, 0x54, + 0x01, 0xed, 0x8d, 0x6f, 0xa9, 0x6f, 0xb4, 0x39, 0xde, 0x51, 0x6d, 0xb4, + 0x3b, 0xbe, 0xa1, 0x71, 0xa3, 0xed, 0xf1, 0x9a, 0x86, 0x97, 0xf6, 0xc7, + 0x7b, 0x9a, 0x6d, 0xda, 0x20, 0xbf, 0x51, 0xaf, 0x69, 0x87, 0x7c, 0x4d, + 0xf3, 0x43, 0x5b, 0xe4, 0x2d, 0x3d, 0x46, 0x7b, 0xe4, 0x4f, 0x1a, 0x1d, + 0xda, 0x24, 0x6f, 0xa9, 0x0c, 0xed, 0x8d, 0x5f, 0xbf, 0xcd, 0xab, 0xe9, + 0x0f, 0xea, 0x06, 0xed, 0x90, 0x3f, 0xa9, 0x83, 0xbc, 0x45, 0x68, 0x88, + 0x68, 0x8f, 0xbc, 0xe5, 0x5f, 0xb0, 0xe5, 0x37, 0xb4, 0x26, 0x3d, 0xb5, + 0xcc, 0xbf, 0xd0, 0xbb, 0x73, 0xcb, 0xf8, 0xee, 0xaf, 0xa9, 0x65, 0xda, + 0x1c, 0xef, 0xbe, 0x07, 0x59, 0x49, 0x55, 0xd2, 0x16, 0xf9, 0x96, 0x16, + 0x41, 0xa2, 0x11, 0xa4, 0x5a, 0x68, 0x03, 0x7c, 0x47, 0xa3, 0x91, 0xb0, + 0x96, 0x57, 0x24, 0x10, 0x69, 0x04, 0x5f, 0xfd, 0x40, 0x1f, 0x48, 0xba, + 0xbc, 0xa7, 0x0f, 0xf8, 0x32, 0x6f, 0x48, 0x0e, 0xd2, 0x08, 0xfe, 0x40, + 0x82, 0x93, 0x46, 0xf0, 0x07, 0x92, 0x96, 0x34, 0x82, 0x5f, 0x71, 0x6d, + 0xf8, 0x1e, 0x6f, 0xb9, 0x02, 0x5a, 0x45, 0x7f, 0xd0, 0x07, 0xea, 0x01, + 0x9e, 0x19, 0xff, 0xa0, 0x6f, 0x68, 0x31, 0xe3, 0xc8, 0x99, 0x80, 0xdd, + 0x78, 0x43, 0x05, 0x03, 0x2d, 0xe6, 0xdf, 0xe9, 0x03, 0x76, 0xe3, 0x5b, + 0x6a, 0x39, 0xd0, 0x76, 0xfa, 0x86, 0x3e, 0xd0, 0x52, 0x7a, 0x4b, 0x1f, + 0x48, 0xd0, 0x51, 0x63, 0x01, 0xbb, 0xf1, 0x15, 0x3f, 0x86, 0xdd, 0x78, + 0xfb, 0x92, 0x3e, 0xd0, 0x70, 0x52, 0x99, 0x88, 0x8d, 0xfe, 0x46, 0x27, + 0x06, 0xc9, 0xa6, 0x5f, 0xe9, 0xa5, 0x48, 0x38, 0xbd, 0xa5, 0x46, 0x23, + 0x56, 0xfd, 0x3d, 0x1d, 0x14, 0x24, 0x9e, 0xde, 0xd1, 0x78, 0x45, 0x9a, + 0x29, 0xae, 0x00, 0xdf, 0xe7, 0x2d, 0xc9, 0x76, 0x12, 0x0f, 0x2f, 0xff, + 0xa4, 0x0f, 0x24, 0x1e, 0xf8, 0x17, 0x7c, 0x85, 0x37, 0x58, 0x81, 0xeb, + 0xf0, 0xb1, 0xef, 0x5e, 0xd3, 0x07, 0x7c, 0xec, 0xeb, 0x3f, 0xe9, 0x03, + 0xf6, 0xe0, 0xd5, 0x7b, 0xfa, 0x80, 0x65, 0xde, 0xfd, 0x4e, 0x1f, 0xf0, + 0xb5, 0xbf, 0xff, 0x89, 0x3e, 0x60, 0xdf, 0x7e, 0xe2, 0xda, 0x68, 0x0f, + 0x93, 0xb0, 0xef, 0xb0, 0x6f, 0xbf, 0x7c, 0x45, 0x1f, 0xe8, 0x38, 0x79, + 0x4b, 0x1f, 0xb0, 0xa3, 0xdf, 0x53, 0xd5, 0xb4, 0x8a, 0x5e, 0xc1, 0x29, + 0xfc, 0xf5, 0x1b, 0x38, 0x8a, 0xbf, 0xa3, 0xaf, 0xa9, 0x2f, 0x74, 0x3e, + 0x90, 0xb8, 0x7d, 0xf5, 0x07, 0x7d, 0xc0, 0xbe, 0x7c, 0xfb, 0x92, 0x3e, + 0x90, 0x44, 0xe3, 0x32, 0xd8, 0x97, 0x5f, 0xf8, 0x31, 0x5a, 0x09, 0x7f, + 0xa3, 0x0f, 0xd8, 0x97, 0x77, 0xd4, 0x31, 0x5a, 0x8b, 0xbf, 0xf1, 0x63, + 0xd8, 0x97, 0x97, 0x7f, 0x87, 0xe6, 0xf1, 0x59, 0x4f, 0x2b, 0xe1, 0xfd, + 0x1b, 0xfa, 0x80, 0x2d, 0xff, 0xf4, 0x1d, 0x7d, 0xc0, 0x96, 0xbf, 0xfe, + 0x89, 0x3e, 0xd0, 0x5e, 0xfa, 0x95, 0x3e, 0x50, 0xcb, 0x74, 0xde, 0xd0, + 0xe4, 0xbf, 0xff, 0x99, 0x3e, 0x50, 0xcb, 0x5f, 0xd3, 0x07, 0x3a, 0xe8, + 0x7e, 0xa3, 0x0f, 0xd8, 0xf2, 0x77, 0x28, 0x13, 0x3c, 0xad, 0x84, 0x5f, + 0xfe, 0x4e, 0x1f, 0xf0, 0xdd, 0xff, 0x4e, 0x8d, 0xd2, 0x4a, 0x78, 0xf9, + 0x9a, 0x3e, 0x60, 0x0f, 0x7e, 0xa2, 0x0a, 0x68, 0x59, 0xfc, 0xfd, 0x1d, + 0x7d, 0xc0, 0x46, 0x5f, 0xff, 0x40, 0x1f, 0x48, 0x80, 0xbf, 0xa4, 0x0f, + 0x24, 0xc0, 0x7f, 0xa7, 0x0f, 0xd8, 0xe8, 0x2f, 0x54, 0x35, 0x9f, 0x6e, + 0x54, 0x35, 0x0d, 0xf8, 0x77, 0x6f, 0xe9, 0x03, 0x2d, 0x3f, 0x3a, 0x33, + 0x69, 0x8d, 0x74, 0x79, 0x75, 0xe0, 0xa7, 0x38, 0xfe, 0x44, 0xbb, 0xf7, + 0x35, 0x1d, 0xa8, 0xb4, 0x61, 0xbf, 0x7f, 0x4d, 0x1f, 0x68, 0xa7, 0xfc, + 0x4c, 0x1f, 0xb0, 0xab, 0xaf, 0xa9, 0x3e, 0xda, 0xa3, 0x6f, 0x70, 0x61, + 0xc4, 0x70, 0x52, 0x79, 0x38, 0xa9, 0x9c, 0x06, 0xe5, 0xeb, 0x6f, 0xe8, + 0x83, 0x3a, 0xf9, 0x49, 0x9f, 0x7c, 0x32, 0x27, 0x9f, 0x68, 0xfc, 0xff, + 0x4e, 0x1f, 0xc6, 0x35, 0x26, 0xd6, 0x2e, 0x7e, 0xa7, 0x0f, 0xb4, 0xcb, + 0xbf, 0xa6, 0x0f, 0x58, 0xe1, 0x8f, 0x3f, 0xd3, 0x07, 0x5a, 0xee, 0x7f, + 0xd0, 0x07, 0x12, 0x36, 0x7f, 0xa3, 0x0f, 0xf4, 0x22, 0x7f, 0xa7, 0x0f, + 0xb4, 0x15, 0xbf, 0xa2, 0x0f, 0x38, 0xe6, 0x7f, 0x7c, 0x4b, 0x1f, 0xb0, + 0xd5, 0x9f, 0xe9, 0xec, 0xa7, 0x57, 0xfc, 0xe5, 0x1d, 0x7d, 0x20, 0x9d, + 0x86, 0x1e, 0xa3, 0xd5, 0xf5, 0xc3, 0x1b, 0xfa, 0x40, 0xab, 0xeb, 0x7b, + 0xfa, 0x80, 0x8d, 0xfe, 0x8d, 0xaa, 0x66, 0xd1, 0xf2, 0x9e, 0x3e, 0xd0, + 0xba, 0x26, 0x35, 0x84, 0x56, 0xd7, 0x4f, 0xbf, 0xd0, 0x87, 0x34, 0x7e, + 0x55, 0x9a, 0xc2, 0xf7, 0x3f, 0xd2, 0x07, 0xac, 0xfb, 0x3d, 0xf5, 0x87, + 0xf6, 0xcc, 0x57, 0x7f, 0xd2, 0x07, 0x3a, 0x01, 0xa9, 0x3f, 0xb4, 0x67, + 0x5e, 0xbf, 0xa2, 0x0f, 0xb4, 0x4d, 0xf2, 0x63, 0x1f, 0x77, 0x45, 0x31, + 0x7f, 0xff, 0xcf, 0xb7, 0xff, 0xf9, 0xdf, 0xff, 0xfe, 0x1f, 0xff, 0xfe, + 0xdf, 0xff, 0x0e, 0xfa, 0x38, 0xad, 0x8c, 0xff, 0xfa, 0x9f, 0xff, 0xe3, + 0x7f, 0xec, 0xe8, 0x5f, 0xfc, 0x67, 0xf3, 0xe1, 0xc3, 0x7f, 0xfc, 0x2b, + 0x7e, 0xdc, 0xec, 0x86, 0xaf, 0xa4, 0x7f, 0x0e, 0xf1, 0x78, 0x1c, 0x17, + 0x5b, 0xf1, 0xcf, 0x61, 0xaf, 0xae, 0x2f, 0xd3, 0xea, 0xde, 0x46, 0x65, + 0xe5, 0xc4, 0xc1, 0x16, 0xfd, 0x24, 0xdd, 0xba, 0xd7, 0x32, 0xb8, 0x28, + 0x76, 0x79, 0xba, 0xd6, 0x14, 0x51, 0xbb, 0x03, 0xb5, 0xb1, 0xb9, 0x81, + 0xa1, 0xb2, 0x1f, 0xb7, 0xe5, 0xbf, 0x59, 0x46, 0x7e, 0xa9, 0xbe, 0xf8, + 0x52, 0x6f, 0x72, 0x95, 0xd3, 0x59, 0x5f, 0xdd, 0x97, 0xd1, 0xe7, 0x07, + 0x7a, 0xfb, 0xab, 0x5a, 0xac, 0x22, 0xef, 0x33, 0x5b, 0xe6, 0x0f, 0x55, + 0xe6, 0x31, 0x6d, 0xa7, 0xb2, 0xcc, 0xe3, 0xf3, 0x32, 0xbf, 0x64, 0x99, + 0x07, 0x51, 0x9a, 0x1f, 0x8c, 0xdb, 0x87, 0xe3, 0xca, 0xc5, 0x9e, 0xee, + 0x60, 0x41, 0xdd, 0xbc, 0xf8, 0xb7, 0xdc, 0xa6, 0x87, 0x26, 0xfb, 0x70, + 0xf0, 0xfb, 0x78, 0xdc, 0x42, 0xeb, 0x41, 0x58, 0x63, 0xa6, 0xe3, 0x55, + 0xf6, 0x17, 0x94, 0xd9, 0x57, 0x6c, 0x80, 0xb0, 0x4a, 0xce, 0x53, 0xb9, + 0xf1, 0x1e, 0x30, 0xbc, 0x07, 0x46, 0xff, 0x2d, 0x7b, 0xe1, 0x8b, 0x2f, + 0xcd, 0x93, 0xdb, 0x0e, 0xa2, 0xd4, 0x57, 0x30, 0x30, 0x4a, 0x9d, 0xdf, + 0x0a, 0x4a, 0x3f, 0xf2, 0xc5, 0xf2, 0x99, 0x94, 0xd9, 0xa8, 0x0e, 0x87, + 0xbc, 0x93, 0xce, 0x98, 0xb2, 0xff, 0x63, 0xbe, 0xca, 0x0c, 0xcb, 0xff, + 0x12, 0xf9, 0xaf, 0x79, 0xcd, 0xbb, 0xe1, 0xbf, 0x4f, 0x78, 0xed, 0xe3, + 0x65, 0x6b, 0xb6, 0xf6, 0x0f, 0xfe, 0x41, 0x0f, 0x82, 0x85, 0xe6, 0x36, + 0xfe, 0x2f, 0xac, 0xad, 0x5f, 0x21, 0xf9, 0xa3, 0x5a, 0x5f, 0x6e, 0xb4, + 0xfa, 0x4f, 0xc5, 0xfe, 0x64, 0xe9, 0xef, 0x0e, 0x38, 0x13, 0x9b, 0xe3, + 0x53, 0xdb, 0x03, 0x5a, 0xdc, 0x03, 0xca, 0xe0, 0xa2, 0xf4, 0xbb, 0x35, + 0x87, 0x40, 0xd8, 0xc5, 0x5d, 0xda, 0xa9, 0x2e, 0x3f, 0xbc, 0xbb, 0x8b, + 0x03, 0x61, 0x63, 0xb2, 0x76, 0xa4, 0x69, 0xb2, 0x7a, 0x13, 0x48, 0x70, + 0xf5, 0x16, 0xbe, 0xec, 0x03, 0xcf, 0xe1, 0x96, 0xd4, 0x58, 0x41, 0x5b, + 0xb2, 0x1a, 0x76, 0xcd, 0xe6, 0xb4, 0x83, 0xd0, 0xbd, 0x47, 0xbe, 0xb8, + 0xaf, 0x3e, 0x41, 0xf2, 0xf8, 0xc0, 0xc0, 0x75, 0x87, 0xce, 0xd8, 0x70, + 0xec, 0x61, 0x0e, 0x0f, 0x9d, 0x32, 0xe9, 0xd8, 0xeb, 0xfc, 0x95, 0x3b, + 0xf6, 0x16, 0x3e, 0x3a, 0x1f, 0x8f, 0xbd, 0x3f, 0x74, 0xd6, 0xe5, 0x1f, + 0xc2, 0xa1, 0xf3, 0xc7, 0x3e, 0x1e, 0x14, 0x08, 0x99, 0x63, 0x9f, 0xf2, + 0xc7, 0x98, 0x8e, 0x3c, 0xb6, 0xbd, 0xc7, 0x7d, 0x92, 0x47, 0xee, 0xe3, + 0xb6, 0x87, 0x9a, 0xad, 0xeb, 0x13, 0x0f, 0x7f, 0x53, 0x57, 0x4d, 0xc3, + 0x61, 0x35, 0x9c, 0x55, 0x51, 0x5f, 0xb4, 0x61, 0xeb, 0x71, 0x65, 0x65, + 0x55, 0x2d, 0xef, 0x59, 0x73, 0xd0, 0x06, 0x36, 0xed, 0xae, 0x71, 0xca, + 0xd5, 0x5b, 0x4e, 0x7e, 0x56, 0xf9, 0x3e, 0x2f, 0x8e, 0xd6, 0xc3, 0xc2, + 0xd5, 0xa8, 0xb4, 0x61, 0x0f, 0x2e, 0xcc, 0x1a, 0x31, 0x2b, 0xca, 0xc5, + 0x56, 0x63, 0xba, 0x59, 0x48, 0xb5, 0x8a, 0x98, 0x5d, 0xbb, 0x25, 0xe5, + 0x9b, 0x6f, 0xb5, 0x6b, 0x1c, 0xf5, 0x3c, 0x1e, 0xe9, 0x2f, 0x21, 0xf0, + 0x60, 0xa8, 0x61, 0x8e, 0x9a, 0xab, 0xd2, 0x46, 0x57, 0xee, 0x50, 0xe3, + 0x1a, 0x54, 0x11, 0x82, 0x46, 0x12, 0x82, 0x4e, 0x51, 0x7d, 0x79, 0xe5, + 0xf3, 0x84, 0xbf, 0x38, 0xaf, 0x11, 0xdc, 0x89, 0x00, 0x7c, 0x2e, 0x83, + 0xc3, 0x0f, 0xc2, 0xac, 0xa3, 0xb5, 0x3b, 0x9a, 0x03, 0x14, 0x6c, 0x1d, + 0xa9, 0x4c, 0xdb, 0xf9, 0x5c, 0x3b, 0xd5, 0x91, 0x08, 0x1a, 0x89, 0x1f, + 0xb3, 0xa6, 0x07, 0xea, 0x56, 0xd7, 0xc4, 0xbc, 0x7f, 0x72, 0x4b, 0x2d, + 0xa1, 0xb0, 0x5c, 0xf8, 0x8b, 0x2f, 0x6d, 0xa3, 0xbc, 0x3d, 0x2b, 0x54, + 0x9c, 0x82, 0xd7, 0xff, 0x4b, 0xec, 0xda, 0xb5, 0xa5, 0xab, 0x83, 0x63, + 0xb6, 0x43, 0x57, 0xdf, 0x52, 0x3f, 0xa3, 0x75, 0xff, 0x97, 0x28, 0x53, + 0x36, 0xde, 0x25, 0x77, 0xd4, 0xe9, 0xde, 0x79, 0x8c, 0x77, 0xd4, 0xe6, + 0xca, 0xdb, 0x0c, 0x57, 0x75, 0x70, 0x50, 0x5d, 0xbb, 0xee, 0xc9, 0xdb, + 0x25, 0xae, 0xfb, 0xf4, 0x20, 0xd7, 0xd3, 0x87, 0x2a, 0xd3, 0x7a, 0xa5, + 0xcd, 0x58, 0x9b, 0x7c, 0xcc, 0xef, 0x42, 0x2b, 0x3e, 0xcf, 0xd7, 0xed, + 0x57, 0xfc, 0xa2, 0xc8, 0x7f, 0x14, 0xcb, 0xfd, 0x61, 0x5a, 0xcc, 0x83, + 0xf8, 0xd5, 0x4b, 0xf1, 0x36, 0x6a, 0xd1, 0x4e, 0x0e, 0x57, 0x92, 0x7c, + 0x83, 0x71, 0xf9, 0x86, 0x42, 0x72, 0xe1, 0xec, 0x06, 0x70, 0x3b, 0x3f, + 0x59, 0x66, 0xfe, 0xa0, 0xf7, 0x96, 0x2d, 0x2e, 0x46, 0xb2, 0xb8, 0xe8, + 0x98, 0x97, 0xda, 0x49, 0x1d, 0x93, 0x1a, 0x6c, 0xeb, 0xe2, 0x69, 0x41, + 0xed, 0x58, 0x2a, 0xfa, 0xe8, 0xd6, 0xec, 0x83, 0xed, 0x8d, 0x3c, 0xad, + 0x3b, 0x6d, 0x03, 0x6c, 0x92, 0x73, 0x73, 0x36, 0xad, 0xe0, 0x53, 0x2e, + 0xfb, 0xcd, 0xf2, 0x6a, 0xdb, 0x38, 0xab, 0x3b, 0xa5, 0x4e, 0xa6, 0xdc, + 0xdf, 0xc5, 0x26, 0xf8, 0x46, 0x36, 0xc9, 0xd0, 0x26, 0x70, 0xbb, 0x98, + 0xb7, 0x81, 0x09, 0xfb, 0xd5, 0xbb, 0xc0, 0x83, 0x79, 0x66, 0xfa, 0x66, + 0xf9, 0xba, 0xdf, 0x7a, 0xad, 0x40, 0xea, 0xf3, 0xf4, 0xb5, 0x26, 0xde, + 0x2b, 0x03, 0x9e, 0x2b, 0x0f, 0x6e, 0xac, 0x6e, 0x0f, 0xa6, 0x83, 0x8e, + 0xaf, 0x9d, 0x6d, 0xc3, 0x8c, 0x50, 0xed, 0xac, 0x5f, 0x2a, 0x76, 0x87, + 0x4e, 0x1f, 0x5b, 0x75, 0xe4, 0x9f, 0xbb, 0x99, 0x75, 0x27, 0x4e, 0xdf, + 0x4d, 0xb5, 0xa7, 0x2c, 0x9d, 0x7d, 0xb7, 0x47, 0xb8, 0x7b, 0xbe, 0xd9, + 0xec, 0x4c, 0xf0, 0xab, 0x77, 0x4f, 0x4b, 0x9b, 0x1a, 0xdb, 0x42, 0xf2, + 0x25, 0x02, 0x56, 0x10, 0x18, 0x82, 0xf2, 0xec, 0x2d, 0x5c, 0x43, 0x4e, + 0x0c, 0x28, 0x31, 0x77, 0xa0, 0x4c, 0xd1, 0x8a, 0xab, 0xcf, 0xe4, 0xea, + 0x02, 0x48, 0xac, 0xbb, 0xbf, 0xb7, 0xe0, 0x9a, 0x58, 0x5a, 0x2f, 0xf0, + 0x7f, 0x4b, 0xeb, 0xe5, 0xba, 0xe6, 0x6f, 0xb3, 0xaf, 0xbf, 0x15, 0xf7, + 0xb5, 0xde, 0x07, 0x5a, 0xaf, 0x01, 0x76, 0x36, 0xbf, 0x8c, 0xde, 0xad, + 0xd0, 0xef, 0xf2, 0xf1, 0xb6, 0x5b, 0xb2, 0xbd, 0x6e, 0xe8, 0xb0, 0x4b, + 0xc7, 0xfc, 0x5f, 0xda, 0xee, 0x5e, 0x18, 0x23, 0x5d, 0x7c, 0x0c, 0xa7, + 0x63, 0xb4, 0x3b, 0x84, 0xe9, 0x85, 0x3c, 0x4f, 0xbb, 0xdd, 0xfb, 0xd8, + 0x34, 0xb3, 0xb8, 0x4e, 0x32, 0xb2, 0x4c, 0xb7, 0xb8, 0xa5, 0x37, 0xf4, + 0xcb, 0xef, 0xba, 0xe1, 0x9d, 0xee, 0xfc, 0xa9, 0xe2, 0xb7, 0x49, 0x5d, + 0x95, 0x10, 0xe2, 0x06, 0xef, 0xba, 0x15, 0x7d, 0x08, 0x50, 0x89, 0x6b, + 0x4b, 0xc0, 0xae, 0xd8, 0x10, 0x16, 0x2a, 0xb9, 0xe7, 0x4d, 0xff, 0x2d, + 0x68, 0x93, 0x8a, 0x36, 0xfd, 0xe6, 0x64, 0x01, 0x6f, 0xe6, 0x62, 0xa0, + 0x6e, 0xf9, 0x32, 0xe3, 0xa7, 0x7b, 0x71, 0x6e, 0x46, 0x38, 0x59, 0x19, + 0x68, 0x29, 0xf9, 0x52, 0x6d, 0x86, 0x0d, 0xed, 0x66, 0xee, 0x12, 0xc1, + 0x12, 0x31, 0x2f, 0x76, 0xb0, 0xb9, 0xca, 0xae, 0xdb, 0x0e, 0x5a, 0xad, + 0xe0, 0x65, 0xc1, 0x67, 0xa0, 0xec, 0x69, 0xd1, 0xbc, 0xae, 0xb8, 0x24, + 0x2e, 0x88, 0x13, 0xc1, 0xe3, 0xbb, 0x3e, 0x96, 0x12, 0x8f, 0x41, 0x1f, + 0xce, 0x1d, 0xea, 0x0e, 0xba, 0xbd, 0x7e, 0xf2, 0xcf, 0x5a, 0x5e, 0x3f, + 0x57, 0xcb, 0x90, 0xef, 0x5a, 0x32, 0x64, 0xbd, 0xcf, 0x72, 0xbe, 0xb3, + 0xe1, 0x14, 0xcf, 0xaf, 0x43, 0x27, 0xf9, 0xc1, 0x58, 0xf8, 0xcb, 0xd2, + 0xe1, 0xe0, 0x8e, 0xdb, 0x5c, 0x7b, 0x6a, 0x4b, 0x8f, 0xea, 0x99, 0x9e, + 0xb5, 0x34, 0x6d, 0x25, 0xa0, 0xb2, 0xa0, 0x2c, 0xd5, 0xd6, 0xeb, 0x43, + 0x56, 0xad, 0x7a, 0xd3, 0x6d, 0x5b, 0x55, 0x87, 0x67, 0xdc, 0xcb, 0x44, + 0x26, 0x7c, 0x97, 0x65, 0x82, 0xb9, 0x40, 0x24, 0xe0, 0xe2, 0x58, 0x21, + 0x12, 0xc2, 0x20, 0x0a, 0x1e, 0xc3, 0x36, 0x7b, 0x98, 0x16, 0x8f, 0x18, + 0x68, 0x27, 0xee, 0xaa, 0xa2, 0xfc, 0xaf, 0x38, 0x8b, 0x55, 0x27, 0xec, + 0x2b, 0xed, 0x23, 0xb8, 0xcd, 0xf2, 0xff, 0x60, 0x2b, 0x99, 0xbc, 0xb9, + 0xa2, 0xdd, 0xf6, 0x0e, 0x3e, 0xe8, 0x63, 0x53, 0x51, 0xce, 0xa5, 0xac, + 0x9f, 0xa9, 0xb9, 0xf2, 0x9e, 0xe2, 0x16, 0xbc, 0xed, 0x61, 0x77, 0xa9, + 0x83, 0x01, 0xa5, 0x0e, 0x5c, 0xa7, 0xbd, 0x39, 0xe8, 0x7c, 0x6d, 0xee, + 0xe1, 0x97, 0xdc, 0x1c, 0xb8, 0xf5, 0xfa, 0x98, 0x0f, 0x4e, 0x38, 0xbf, + 0xdb, 0x3a, 0x3a, 0x36, 0x6d, 0xd7, 0x35, 0x1d, 0xd1, 0x3c, 0xdf, 0x1b, + 0xd3, 0x5b, 0xdb, 0x3b, 0xd7, 0x7b, 0xdf, 0x87, 0xd0, 0xc7, 0xb8, 0x2c, + 0x2f, 0x62, 0x11, 0x8d, 0xd2, 0xb9, 0xbe, 0x54, 0x30, 0x35, 0x0a, 0x5e, + 0xb2, 0xb0, 0x36, 0x8e, 0xfa, 0xae, 0x35, 0x77, 0x7f, 0x5d, 0xdf, 0x5d, + 0xd1, 0x2d, 0x26, 0x78, 0x0c, 0x1c, 0xb6, 0x3c, 0xb8, 0xaa, 0x79, 0x6f, + 0xc1, 0x07, 0x16, 0xa6, 0x14, 0x43, 0x3d, 0xe1, 0xb0, 0x87, 0xeb, 0xe4, + 0xe6, 0xe4, 0x4a, 0x79, 0xfa, 0x69, 0x5a, 0x78, 0xd2, 0x46, 0x77, 0xf0, + 0x69, 0xb1, 0x13, 0x9d, 0x6f, 0x77, 0xa2, 0x3e, 0xb5, 0xf9, 0x7c, 0x36, + 0xee, 0x0f, 0xf7, 0xb5, 0x71, 0x2d, 0xed, 0xda, 0xac, 0x52, 0xf7, 0x09, + 0x2e, 0xcb, 0x0b, 0x5b, 0xc6, 0x5a, 0x3f, 0x3b, 0xec, 0x5b, 0xbb, 0x15, + 0x41, 0x0c, 0xc6, 0xf5, 0x36, 0xf8, 0x1e, 0x16, 0xa1, 0x39, 0xf8, 0x3d, + 0xee, 0x4c, 0x95, 0x0f, 0xdc, 0x2d, 0x6e, 0x62, 0x9d, 0xfa, 0xa0, 0x97, + 0xb6, 0xa8, 0xcd, 0x15, 0x3c, 0x6f, 0xd1, 0xdb, 0x6d, 0xd1, 0xd5, 0x5d, + 0xc0, 0x78, 0xeb, 0xeb, 0x76, 0xe2, 0xed, 0x56, 0x3f, 0xc6, 0x2b, 0x7e, + 0x3e, 0x1b, 0xee, 0x4d, 0x43, 0xff, 0xac, 0xde, 0x77, 0x42, 0x8d, 0xc0, + 0x4d, 0x96, 0xac, 0x55, 0xf9, 0x9b, 0xb4, 0xda, 0x50, 0x85, 0xb7, 0xd9, + 0xe3, 0xdc, 0xe8, 0x8a, 0x0a, 0xaa, 0x71, 0xf1, 0x08, 0x7f, 0x28, 0x4f, + 0x0b, 0x00, 0x17, 0x42, 0x0f, 0x6d, 0x1f, 0xcb, 0x9a, 0xd8, 0x22, 0x4a, + 0x08, 0xbb, 0xb3, 0x4f, 0xf5, 0x5b, 0xea, 0xd2, 0x92, 0x6d, 0xaa, 0x79, + 0x07, 0xc6, 0x2b, 0xf6, 0x54, 0xf9, 0x87, 0x26, 0xe0, 0x40, 0xa5, 0x0e, + 0x84, 0xfc, 0x1f, 0x7f, 0x6c, 0x6a, 0xb1, 0xde, 0x97, 0x3d, 0x31, 0xae, + 0x7b, 0x7a, 0x21, 0x5d, 0xb0, 0x61, 0x48, 0x26, 0xaf, 0x69, 0x97, 0x60, + 0x67, 0x2a, 0xde, 0x16, 0x5a, 0xde, 0x99, 0x53, 0xe3, 0xf4, 0xd4, 0xa4, + 0x17, 0xbb, 0xb8, 0x58, 0x45, 0xfe, 0xfd, 0x5c, 0x15, 0x61, 0x24, 0x1f, + 0xa4, 0x37, 0x09, 0x2c, 0x1f, 0xee, 0xc4, 0x1a, 0x03, 0x4b, 0x71, 0x67, + 0x9c, 0xbb, 0xad, 0x3a, 0x6c, 0xcf, 0xe9, 0xc1, 0x16, 0xd4, 0x25, 0xe1, + 0x4e, 0xec, 0x57, 0xe8, 0xd0, 0x7e, 0x5e, 0xec, 0x04, 0xc3, 0xd3, 0xb4, + 0x8d, 0xd1, 0xea, 0xc6, 0xb5, 0xdc, 0xdb, 0x03, 0x2c, 0x5e, 0xb9, 0xa6, + 0x5a, 0xc3, 0x6e, 0x02, 0x6e, 0x82, 0x0a, 0x8e, 0xb4, 0x35, 0xfa, 0x43, + 0x20, 0x65, 0x0f, 0x3f, 0x3d, 0x51, 0x8d, 0xfe, 0xad, 0x6c, 0x43, 0xe7, + 0xd5, 0x29, 0x58, 0xaf, 0xa6, 0x15, 0xf1, 0xee, 0x9f, 0x0b, 0x22, 0x85, + 0xda, 0x3b, 0xde, 0x60, 0xe1, 0xb4, 0x46, 0x4b, 0x4a, 0xbe, 0xc7, 0xe6, + 0xba, 0x23, 0xcc, 0x5d, 0x16, 0x06, 0x79, 0xf4, 0x1d, 0xde, 0xa6, 0xf2, + 0x0d, 0x5a, 0x95, 0xe3, 0x3d, 0xe4, 0xe3, 0xdd, 0x80, 0x3e, 0xa1, 0xf3, + 0xe1, 0x0f, 0x4b, 0xa9, 0x65, 0x3c, 0x28, 0x70, 0xef, 0xf9, 0x12, 0x16, + 0xbb, 0x63, 0x0f, 0xca, 0x58, 0x68, 0xd1, 0xd1, 0xf9, 0x98, 0xd5, 0x15, + 0x68, 0xb3, 0x7d, 0xab, 0x0e, 0xe2, 0xd9, 0x1e, 0x0b, 0xd2, 0xa6, 0x6d, + 0x89, 0x9b, 0x69, 0x03, 0xb0, 0xc2, 0x96, 0x0c, 0x71, 0x52, 0xa9, 0xd8, + 0xa1, 0xaa, 0xd3, 0x6e, 0x4b, 0x09, 0xa5, 0x2e, 0x59, 0x6a, 0x1b, 0xdf, + 0xe1, 0xf4, 0x74, 0x01, 0x6d, 0x1a, 0x74, 0x07, 0x86, 0x5d, 0x01, 0x26, + 0x8d, 0x96, 0x84, 0xf2, 0x9d, 0xc6, 0xe1, 0xd9, 0xd0, 0x12, 0xda, 0x99, + 0x60, 0x6f, 0x2b, 0x5f, 0xc6, 0xfb, 0xdd, 0x4f, 0xec, 0xe7, 0x79, 0xe6, + 0xa1, 0xe6, 0x9b, 0xbc, 0x1f, 0xb7, 0x0d, 0x11, 0x31, 0x29, 0x52, 0x66, + 0xf7, 0x00, 0xe1, 0x49, 0xc3, 0xec, 0x2e, 0x0b, 0x87, 0xb9, 0x68, 0x38, + 0xb6, 0x9a, 0x35, 0x13, 0x40, 0xe2, 0x5c, 0x32, 0xe5, 0x26, 0x29, 0xea, + 0xe0, 0x8b, 0xa7, 0x27, 0x44, 0x7e, 0x96, 0x95, 0x9d, 0x74, 0x61, 0x7c, + 0xc0, 0x06, 0x2e, 0xe6, 0xa8, 0x9f, 0xb0, 0x06, 0xd3, 0xa3, 0x16, 0xe3, + 0xcb, 0x76, 0x95, 0x36, 0x84, 0xd6, 0x0d, 0x5d, 0x1c, 0xb6, 0x51, 0x53, + 0x98, 0x6d, 0x92, 0x36, 0x77, 0xa5, 0x89, 0xff, 0x25, 0xca, 0xc0, 0x5c, + 0xee, 0xb4, 0xb5, 0x57, 0x3b, 0xd1, 0x9e, 0x43, 0xc6, 0xbe, 0xfa, 0x55, + 0x8c, 0x18, 0x53, 0xac, 0xf6, 0x67, 0x69, 0xc3, 0x2e, 0xa2, 0xc4, 0x9a, + 0xbf, 0x14, 0xd4, 0x34, 0xad, 0x1b, 0x1d, 0x58, 0x47, 0xbe, 0x02, 0x4c, + 0x7d, 0xc2, 0xa5, 0x6a, 0x90, 0xe7, 0xfc, 0x3f, 0x40, 0xb2, 0xb3, 0x15, + 0x59, 0x19, 0x70, 0xa0, 0xe5, 0x93, 0x57, 0x65, 0xb5, 0x0d, 0x0e, 0x5e, + 0xeb, 0xe8, 0xe4, 0xd5, 0x16, 0x4e, 0xe4, 0x80, 0xe7, 0x0d, 0x1c, 0xc1, + 0x06, 0x7e, 0xcf, 0xfb, 0x46, 0x7b, 0x3c, 0x8b, 0xf1, 0x28, 0x07, 0x2c, + 0x08, 0xc2, 0xe3, 0xf7, 0x74, 0x86, 0x1b, 0xb4, 0x80, 0x5b, 0xd4, 0xed, + 0xa9, 0x36, 0xfc, 0xa2, 0x23, 0xc8, 0x08, 0x5d, 0x2f, 0xc2, 0x01, 0x9f, + 0x4a, 0xf8, 0x85, 0xe7, 0xce, 0x10, 0x44, 0x25, 0x57, 0x05, 0x2e, 0x32, + 0x28, 0xa8, 0x1c, 0xc4, 0x74, 0xf6, 0x11, 0x8e, 0xd5, 0x3e, 0xd1, 0x53, + 0xda, 0x06, 0x32, 0x4c, 0xa0, 0xba, 0x40, 0xf5, 0x1b, 0x34, 0xb4, 0xa3, + 0x12, 0xb1, 0xa5, 0x5e, 0x61, 0xf4, 0x03, 0xea, 0x70, 0x9e, 0x8e, 0x2c, + 0xed, 0xc0, 0x00, 0x41, 0x57, 0x1b, 0xf2, 0xdb, 0xf7, 0x1d, 0xd6, 0x86, + 0xca, 0x9e, 0xda, 0x1b, 0xf4, 0x44, 0x80, 0xee, 0x61, 0x49, 0xe9, 0xe8, + 0xf0, 0x62, 0x02, 0xaf, 0x6a, 0x3c, 0x16, 0x75, 0x78, 0x6f, 0x32, 0xb1, + 0x0c, 0x59, 0x1e, 0x23, 0x1a, 0xb1, 0xc4, 0x8d, 0xd3, 0x38, 0xe5, 0x2e, + 0xc0, 0x47, 0x4b, 0x51, 0xa9, 0xd8, 0x67, 0x4b, 0x06, 0xa5, 0x5e, 0x41, + 0x8c, 0x40, 0xc4, 0xb1, 0x52, 0x68, 0x64, 0xcc, 0x6f, 0x00, 0x95, 0xe4, + 0x17, 0xe5, 0x61, 0xc6, 0x3b, 0x20, 0x1e, 0xb0, 0xd8, 0xb1, 0xfc, 0xea, + 0x3c, 0x34, 0x2e, 0xd4, 0x76, 0xf1, 0x14, 0xb3, 0x3c, 0x15, 0x1e, 0xbb, + 0x1e, 0x4a, 0x57, 0x2d, 0xbc, 0xbf, 0x0f, 0x5d, 0xd1, 0x8d, 0x24, 0xe5, + 0x45, 0x0d, 0x70, 0xb0, 0xd3, 0xd5, 0xd3, 0x58, 0x3a, 0x3e, 0x38, 0xbe, + 0x95, 0xc2, 0x0c, 0x28, 0x55, 0xaf, 0x27, 0x61, 0x58, 0x4d, 0xb8, 0x94, + 0xf2, 0xeb, 0xc0, 0x1c, 0xf7, 0x36, 0xc1, 0xf0, 0xe1, 0x74, 0xe6, 0xa9, + 0x83, 0x7e, 0xd9, 0x80, 0x2f, 0x83, 0x13, 0xe3, 0xa1, 0xef, 0xa8, 0xa9, + 0xc3, 0x7b, 0x1b, 0x0c, 0xa4, 0xd0, 0x96, 0xc2, 0x28, 0x58, 0xe5, 0xc6, + 0xb7, 0xdd, 0x8e, 0x8d, 0x14, 0x3d, 0x29, 0x1b, 0xf5, 0x1b, 0x27, 0xa1, + 0x96, 0x93, 0xfc, 0x66, 0xf4, 0x7a, 0xd2, 0x9b, 0xb1, 0xbe, 0x26, 0xc9, + 0xfe, 0xea, 0x39, 0x0d, 0xd3, 0x41, 0x9a, 0x2a, 0x48, 0x10, 0x05, 0x12, + 0xda, 0x87, 0x88, 0x5f, 0x57, 0xd1, 0x23, 0x14, 0xf6, 0xbf, 0x6e, 0x76, + 0xae, 0xa1, 0xb9, 0xbd, 0xc8, 0x13, 0x79, 0xa3, 0x54, 0x5f, 0x24, 0x49, + 0xa7, 0x09, 0x51, 0x7e, 0x9d, 0x24, 0x81, 0x5a, 0x56, 0x4b, 0x13, 0x2c, + 0x55, 0x24, 0x89, 0xc3, 0xc0, 0x9b, 0x41, 0x90, 0xf8, 0x63, 0x15, 0x22, + 0x16, 0xe3, 0xc2, 0x5f, 0x8c, 0x85, 0x09, 0xae, 0x63, 0x50, 0xa1, 0x0d, + 0xec, 0xfc, 0xc1, 0xd6, 0xaf, 0xe8, 0xf9, 0x4e, 0xc3, 0x26, 0x7d, 0x81, + 0x2d, 0x0d, 0x72, 0xa5, 0x0f, 0xb9, 0x77, 0x11, 0xd4, 0xc0, 0x17, 0x73, + 0x11, 0x73, 0x2a, 0x5f, 0xba, 0xb2, 0x7d, 0x7b, 0x34, 0x7d, 0x9a, 0x83, + 0xc3, 0x1e, 0x14, 0xd1, 0xe2, 0x0e, 0x08, 0x00, 0x78, 0x51, 0x65, 0x4c, + 0x80, 0x41, 0x38, 0x62, 0xe5, 0xb9, 0xb6, 0x17, 0xa8, 0x9e, 0x1a, 0x8c, + 0x66, 0x47, 0x99, 0xa3, 0xaa, 0xb0, 0x81, 0x40, 0x9d, 0x80, 0x35, 0xe5, + 0x41, 0xf4, 0x33, 0xb9, 0x03, 0x35, 0x64, 0xc5, 0xfc, 0xc5, 0xb6, 0xec, + 0x28, 0x1c, 0x0d, 0xd8, 0x54, 0x83, 0xe0, 0x51, 0xae, 0x4a, 0x1d, 0x8b, + 0x33, 0x36, 0x97, 0x3d, 0xd0, 0x99, 0x2a, 0x78, 0x8e, 0x55, 0xe2, 0x18, + 0x7a, 0xc5, 0x17, 0x55, 0xf4, 0xc0, 0x7b, 0xd0, 0x6b, 0x54, 0x11, 0x94, + 0xe7, 0x82, 0x46, 0x3b, 0xf2, 0x3b, 0x17, 0x99, 0xb4, 0x7d, 0xa1, 0x1c, + 0x44, 0x7e, 0x6c, 0xd2, 0x97, 0xa7, 0x58, 0xaf, 0xb1, 0xeb, 0x5a, 0xba, + 0xe5, 0x17, 0xf3, 0xc0, 0xfe, 0x4b, 0xbd, 0x2f, 0x11, 0x86, 0x92, 0xb3, + 0x7d, 0x5c, 0x76, 0x54, 0x86, 0x7d, 0x72, 0xa4, 0xec, 0x37, 0x75, 0xfd, + 0xd5, 0x05, 0xa6, 0x98, 0x9e, 0xc5, 0x02, 0x69, 0x9b, 0xb7, 0x88, 0x88, + 0x4b, 0xd5, 0x5f, 0xe4, 0x21, 0xfd, 0xd2, 0xec, 0x29, 0x84, 0x21, 0x8b, + 0xad, 0xf9, 0xfb, 0x24, 0x39, 0x06, 0x42, 0xae, 0xa0, 0x5e, 0xa1, 0xd1, + 0x19, 0x8c, 0x27, 0x2b, 0x3c, 0x96, 0xce, 0x4b, 0x67, 0x51, 0x38, 0xef, + 0x4f, 0x84, 0xb3, 0x20, 0x98, 0xc7, 0x75, 0xd3, 0x7a, 0xa7, 0xe3, 0x0c, + 0x16, 0x14, 0x6f, 0xe5, 0xfa, 0x15, 0xed, 0xd3, 0x34, 0xde, 0x9a, 0x60, + 0x1c, 0x72, 0x78, 0xb8, 0xd1, 0x99, 0x0e, 0x5b, 0xd0, 0xa2, 0x8b, 0x8d, + 0xca, 0xe4, 0x25, 0x68, 0xeb, 0x39, 0xee, 0xe9, 0xc8, 0xa6, 0x8d, 0x84, + 0x3b, 0xfa, 0x90, 0x7b, 0x67, 0xcb, 0xd6, 0x30, 0xb4, 0xd7, 0xd8, 0x35, + 0x67, 0xf1, 0xf0, 0xad, 0x3d, 0x2e, 0x4b, 0xd8, 0xd8, 0x5c, 0x28, 0xf7, + 0xfc, 0x90, 0x97, 0xfd, 0xf6, 0xd3, 0x75, 0x1f, 0x0c, 0x0d, 0x79, 0x58, + 0x3b, 0x65, 0xf9, 0xdc, 0x86, 0x4a, 0xae, 0x7f, 0x9b, 0xd6, 0xda, 0xb1, + 0x93, 0x6b, 0xa9, 0xbc, 0x76, 0xca, 0xc5, 0xf6, 0xb4, 0x8a, 0xc6, 0xc2, + 0x05, 0x65, 0x7d, 0x5f, 0x63, 0xec, 0xa8, 0x10, 0x6d, 0x64, 0xb5, 0x0c, + 0x64, 0x9b, 0x97, 0xbf, 0x8f, 0x85, 0x99, 0x9b, 0xf8, 0x4c, 0xd7, 0xe4, + 0xa7, 0xe8, 0xf9, 0xbd, 0x2c, 0xc7, 0xc5, 0x55, 0xd1, 0x58, 0x91, 0xa3, + 0x55, 0x31, 0x5e, 0x8d, 0xad, 0x85, 0x85, 0x45, 0x70, 0x09, 0xa2, 0x11, + 0xb1, 0x67, 0xf9, 0x49, 0x96, 0x95, 0x3b, 0x3b, 0x50, 0xda, 0xd2, 0x9b, + 0x6f, 0xac, 0x63, 0xe9, 0xbd, 0x56, 0x6e, 0x4f, 0x8a, 0x3e, 0xcb, 0xed, + 0x27, 0x2d, 0xb7, 0xd7, 0x4a, 0xec, 0xc9, 0xaa, 0x99, 0x46, 0x6b, 0x3f, + 0xcb, 0xea, 0x67, 0x59, 0xfd, 0x58, 0x64, 0xf5, 0x1d, 0x5a, 0xd3, 0x36, + 0x51, 0xb5, 0x6f, 0xe7, 0x6a, 0xdd, 0xed, 0xfc, 0xc2, 0x2a, 0xc4, 0xfe, + 0xac, 0x7d, 0x9b, 0x23, 0x32, 0xcd, 0x4b, 0x36, 0x6f, 0xe7, 0xaf, 0x44, + 0xd4, 0x00, 0xb0, 0x0c, 0x56, 0x9e, 0x1e, 0xd0, 0x28, 0xd5, 0x5d, 0x95, + 0x16, 0x1c, 0x32, 0xb9, 0x98, 0x9e, 0x39, 0x8d, 0xa9, 0x1d, 0xa1, 0x09, + 0x5e, 0xdb, 0x70, 0x75, 0x87, 0x3b, 0x63, 0xd0, 0x04, 0xa9, 0x31, 0x78, + 0x5d, 0x0c, 0x5d, 0x1b, 0x00, 0x90, 0xcb, 0x06, 0x63, 0x9e, 0x51, 0x35, + 0xf7, 0x86, 0xaa, 0x79, 0xf7, 0xc0, 0xa8, 0x9a, 0x3c, 0xa1, 0x9f, 0x11, + 0xaa, 0xe6, 0xfd, 0xa2, 0xb7, 0xda, 0xec, 0x94, 0x80, 0xc8, 0x98, 0xd6, + 0x65, 0x77, 0xf3, 0x78, 0x90, 0x5d, 0x5e, 0xf7, 0xbb, 0x83, 0x99, 0x1a, + 0xd4, 0x6b, 0xa5, 0xc5, 0x08, 0x5a, 0x4d, 0x57, 0x64, 0xb2, 0x02, 0xb3, + 0x34, 0x9b, 0xbe, 0xc0, 0x58, 0xc3, 0xb6, 0xaf, 0x48, 0x16, 0x16, 0x34, + 0x04, 0xc1, 0xb1, 0xe9, 0x62, 0x35, 0xa3, 0xe3, 0x8f, 0x60, 0xe2, 0x41, + 0x53, 0x8d, 0x25, 0x6f, 0x25, 0x1c, 0xa0, 0x21, 0xb2, 0xd0, 0xc7, 0xc2, + 0x06, 0xd1, 0xa7, 0xc4, 0xe4, 0xc3, 0x65, 0xf2, 0xf6, 0x31, 0x50, 0x3b, + 0x38, 0x0d, 0xc0, 0x08, 0x04, 0x26, 0x37, 0x3e, 0x17, 0x74, 0x5f, 0x1e, + 0x3a, 0x60, 0x6f, 0x2c, 0x1c, 0xd5, 0x58, 0x2d, 0x5a, 0x73, 0x72, 0xbd, + 0x06, 0x9e, 0x05, 0xb1, 0xa2, 0x0c, 0x3e, 0x6b, 0xe9, 0xa9, 0x7c, 0x7e, + 0xd3, 0x5b, 0xa0, 0x10, 0xf0, 0x2c, 0x04, 0x6a, 0x65, 0x9a, 0x0d, 0x48, + 0x36, 0xe0, 0x43, 0xc4, 0x87, 0xa3, 0xea, 0x6b, 0xa2, 0x69, 0x0f, 0x0f, + 0x19, 0x1e, 0x26, 0x91, 0x93, 0x6d, 0x01, 0xf7, 0x3e, 0x1d, 0x6e, 0x8f, + 0x12, 0xa9, 0x03, 0x43, 0x13, 0x45, 0x5c, 0xf1, 0x21, 0xcb, 0x21, 0x7c, + 0x24, 0x93, 0xe4, 0x66, 0x3c, 0x81, 0x71, 0x27, 0xe0, 0xa1, 0xf9, 0x1c, + 0x8b, 0xb6, 0x61, 0x2f, 0xd7, 0x39, 0x04, 0xd6, 0x8c, 0xeb, 0x5c, 0xaa, + 0x2f, 0xb1, 0x6e, 0x80, 0x2a, 0x54, 0x91, 0xd6, 0x8d, 0xda, 0xd3, 0xad, + 0x6b, 0x07, 0x71, 0x8a, 0x67, 0x5d, 0xcf, 0x8e, 0x1d, 0x72, 0xd4, 0xe7, + 0x7f, 0x5e, 0xd0, 0x14, 0x38, 0x39, 0x3e, 0x48, 0xc2, 0x49, 0x1c, 0x16, + 0x07, 0xe6, 0x22, 0x89, 0x19, 0xe2, 0xd2, 0x60, 0x86, 0xb8, 0xe6, 0x75, + 0x61, 0x83, 0xef, 0xec, 0xad, 0x91, 0xfb, 0x4a, 0xf9, 0xd9, 0xbd, 0x51, + 0xf9, 0x99, 0xb1, 0x4e, 0x15, 0x48, 0x50, 0xde, 0xd0, 0xa7, 0x78, 0x83, + 0xc5, 0xc0, 0x9e, 0x29, 0x82, 0x28, 0x2f, 0xd1, 0x20, 0x21, 0x0b, 0xe6, + 0xb1, 0x40, 0x48, 0x45, 0x34, 0x8d, 0x06, 0x3a, 0x5b, 0xba, 0xea, 0xf8, + 0xbb, 0xb0, 0xba, 0xf4, 0x69, 0xab, 0x40, 0x44, 0x35, 0xee, 0x31, 0x9c, + 0xec, 0xaa, 0xb7, 0x5b, 0xdf, 0x3b, 0xd5, 0x9f, 0xee, 0x32, 0x84, 0xd5, + 0xd2, 0xbe, 0x3f, 0xe8, 0x78, 0xcc, 0xa7, 0x75, 0x96, 0x02, 0x10, 0x70, + 0x22, 0xb7, 0x51, 0x09, 0xa6, 0xa6, 0x91, 0x47, 0xba, 0x0a, 0x38, 0xc7, + 0x38, 0x12, 0x14, 0x60, 0x60, 0xcc, 0x26, 0x39, 0x89, 0x8e, 0xac, 0xa2, + 0xeb, 0xb2, 0x47, 0x8d, 0x04, 0x4f, 0x69, 0xdd, 0x1e, 0xab, 0xa8, 0x03, + 0xb9, 0x98, 0xbb, 0xf5, 0xa8, 0x20, 0x59, 0xa8, 0x12, 0xb0, 0x53, 0x01, + 0xcc, 0xed, 0x01, 0xf7, 0x9c, 0x86, 0xc1, 0x46, 0x20, 0x19, 0x0f, 0xbd, + 0xfa, 0x98, 0xdf, 0x47, 0x2f, 0x6d, 0x05, 0x37, 0x8f, 0x7f, 0x17, 0xcf, + 0xa3, 0x3b, 0x38, 0x2e, 0x7f, 0x6b, 0x72, 0x96, 0xda, 0x3c, 0x81, 0x08, + 0x09, 0xe5, 0xf8, 0xe6, 0x15, 0x20, 0x8d, 0x71, 0x2f, 0x67, 0xf1, 0x93, + 0xa6, 0xc4, 0x55, 0xd1, 0x45, 0xc4, 0x73, 0x1c, 0xa5, 0xf9, 0xc8, 0x2e, + 0xdd, 0xa2, 0x35, 0xe5, 0xa3, 0x54, 0xe1, 0x17, 0x84, 0x3c, 0x05, 0x09, + 0x86, 0x82, 0xde, 0xc1, 0x32, 0x5c, 0xc0, 0x9d, 0x2a, 0x09, 0x78, 0x0a, + 0x08, 0xd8, 0x99, 0x13, 0x1c, 0x0e, 0x4d, 0x87, 0x7e, 0x59, 0xc5, 0x60, + 0x11, 0xba, 0x63, 0xe5, 0x15, 0xcf, 0xde, 0x5f, 0xbc, 0xc7, 0xc2, 0x4d, + 0x6b, 0xaf, 0x1d, 0x39, 0x58, 0x3c, 0x39, 0x36, 0xc8, 0x55, 0x13, 0xf9, + 0xa6, 0x0b, 0x2c, 0x6f, 0x2a, 0x2c, 0x41, 0xc4, 0x6c, 0xa3, 0x57, 0x93, + 0x1e, 0x45, 0x00, 0x58, 0x75, 0x3c, 0x1c, 0x9a, 0x4e, 0xcb, 0x85, 0x98, + 0xed, 0xd9, 0x21, 0x36, 0x1b, 0x6e, 0x55, 0x0e, 0x1a, 0x4d, 0xce, 0xf4, + 0x03, 0x46, 0x32, 0xb6, 0x90, 0x31, 0x4a, 0x3e, 0x6a, 0xa2, 0x50, 0x2f, + 0x5e, 0x6e, 0x4b, 0x4f, 0xad, 0xa3, 0xe8, 0xb6, 0x72, 0xf4, 0x8a, 0x7d, + 0x36, 0x62, 0xdd, 0x10, 0x49, 0x3f, 0xab, 0xdd, 0x95, 0x78, 0x56, 0x51, + 0x6f, 0x5e, 0x81, 0xfd, 0x75, 0xae, 0x5d, 0x81, 0x6b, 0x55, 0x80, 0x09, + 0xa3, 0xbc, 0x22, 0x44, 0xa2, 0x25, 0x19, 0x65, 0xf1, 0x96, 0x9c, 0x85, + 0x10, 0xb0, 0xff, 0x39, 0x7f, 0x84, 0x4b, 0xb4, 0x45, 0xd8, 0xd8, 0x36, + 0x77, 0x44, 0x6d, 0xfb, 0xfc, 0x2f, 0xb8, 0xcc, 0xe0, 0x2e, 0xd7, 0x3c, + 0x87, 0x80, 0xc8, 0xa4, 0xa8, 0xe4, 0xa3, 0x18, 0x32, 0x90, 0x77, 0xe7, + 0xb8, 0xa9, 0xe8, 0xa9, 0x73, 0x50, 0xb3, 0x36, 0x08, 0x56, 0xe5, 0x2b, + 0x7e, 0x56, 0xbc, 0x04, 0x93, 0xbe, 0x17, 0x0e, 0x9e, 0x42, 0x7c, 0xd7, + 0x7c, 0xb8, 0x58, 0x01, 0x84, 0xd3, 0x4a, 0x2c, 0x77, 0x30, 0x31, 0x89, + 0x76, 0x57, 0xa1, 0xa7, 0xf8, 0x2c, 0x46, 0xc3, 0xc3, 0x1e, 0x34, 0x70, + 0xc2, 0xa4, 0xed, 0x3c, 0xaa, 0x35, 0xaf, 0xfd, 0xed, 0x8d, 0x9e, 0xd4, + 0x71, 0x12, 0x4a, 0xaf, 0xe7, 0x65, 0xd2, 0xf8, 0xc0, 0x3d, 0x29, 0x94, + 0x88, 0xfb, 0x4b, 0x2a, 0x20, 0x19, 0x3b, 0xb8, 0x8c, 0x0f, 0x82, 0x87, + 0x4f, 0x99, 0x53, 0x1b, 0x89, 0x9e, 0xbf, 0xa3, 0xa9, 0x50, 0x43, 0xf9, + 0xac, 0xda, 0xb0, 0x7a, 0xb2, 0x93, 0x6c, 0x14, 0x6a, 0x1e, 0x13, 0x33, + 0x48, 0xda, 0x5c, 0x99, 0x12, 0xaa, 0xbb, 0x61, 0x02, 0xcb, 0xf6, 0x4e, + 0xed, 0x07, 0x99, 0xe3, 0x3f, 0xf6, 0x65, 0x60, 0x05, 0x3c, 0x45, 0x73, + 0x03, 0x07, 0x61, 0x0b, 0xaf, 0x3e, 0x36, 0xaf, 0x3e, 0xb8, 0xfe, 0xde, + 0x08, 0x57, 0x6a, 0xdf, 0xbd, 0xa7, 0x35, 0xcd, 0x82, 0xf2, 0x6f, 0x88, + 0x2a, 0xb5, 0x8f, 0x03, 0xec, 0x57, 0x3a, 0x69, 0x9c, 0x96, 0xd0, 0xb8, + 0x70, 0xa6, 0xe4, 0xff, 0x21, 0xce, 0x28, 0x81, 0x39, 0x1f, 0x81, 0x00, + 0x64, 0xf5, 0x33, 0x79, 0x81, 0x83, 0xa1, 0xc0, 0xa2, 0xe6, 0xcf, 0x31, + 0x8b, 0xe0, 0x26, 0x27, 0x78, 0x10, 0xc8, 0x6a, 0x0f, 0xdb, 0x15, 0x6e, + 0x4b, 0xfb, 0xa5, 0xa0, 0x42, 0xc7, 0xc1, 0x8c, 0xb7, 0x8e, 0x78, 0x98, + 0xd9, 0x49, 0x5a, 0x05, 0x92, 0x54, 0x60, 0xf5, 0xac, 0x5e, 0xab, 0x40, + 0xe9, 0xc8, 0xe7, 0x71, 0x16, 0xd6, 0xcd, 0x31, 0x20, 0x5c, 0xf3, 0x86, + 0x16, 0xc1, 0x4e, 0xa7, 0xf5, 0x64, 0x38, 0x22, 0x12, 0xf1, 0xe9, 0x26, + 0x70, 0xf8, 0xea, 0x1f, 0xb2, 0xad, 0xc4, 0x31, 0x61, 0x71, 0x62, 0xb9, + 0x80, 0x9a, 0xa0, 0x29, 0xf7, 0xc7, 0x1e, 0x69, 0x9b, 0x02, 0x69, 0xb5, + 0xcc, 0xff, 0x14, 0xe0, 0xfb, 0x48, 0x7f, 0xdd, 0x52, 0x4f, 0xdc, 0x4d, + 0x19, 0x05, 0xb3, 0x28, 0x47, 0x2d, 0x9f, 0x5a, 0x16, 0xa1, 0x6b, 0x51, + 0xb2, 0xd9, 0x06, 0x81, 0x9b, 0x87, 0xd5, 0x3a, 0x66, 0xec, 0x00, 0x52, + 0x90, 0x44, 0x96, 0xd7, 0x6d, 0xcf, 0x9a, 0x82, 0xd4, 0xdd, 0x86, 0xd6, + 0xd6, 0xea, 0x6f, 0xc1, 0xfb, 0x8b, 0x7d, 0x95, 0x35, 0x36, 0x81, 0x45, + 0x28, 0x8f, 0xe4, 0x52, 0x3d, 0x7e, 0x5d, 0x3d, 0x0f, 0xb5, 0x53, 0x57, + 0x97, 0x81, 0x45, 0xb6, 0x33, 0x2e, 0xc2, 0x1e, 0xed, 0x13, 0x6b, 0xfa, + 0x16, 0xe3, 0x3a, 0x40, 0xd3, 0x52, 0x60, 0x3c, 0x75, 0x07, 0x20, 0x50, + 0x46, 0x03, 0x76, 0x97, 0xc8, 0xb5, 0xd2, 0x54, 0xa8, 0xe6, 0x57, 0xfc, + 0xbb, 0xda, 0x38, 0x1b, 0xc5, 0x52, 0x71, 0x07, 0xe7, 0x61, 0x3d, 0x1c, + 0xe9, 0x63, 0xee, 0xb4, 0xe1, 0x15, 0x99, 0xa5, 0x53, 0x3a, 0xb0, 0x7a, + 0xa3, 0xf2, 0x8f, 0xdb, 0xde, 0xf0, 0x31, 0x0b, 0x01, 0x7a, 0x18, 0x2a, + 0x01, 0x37, 0xd8, 0x32, 0x95, 0x14, 0x31, 0x17, 0x3e, 0xd2, 0x1d, 0x96, + 0x79, 0x70, 0x69, 0x37, 0xe5, 0xe5, 0xe8, 0x00, 0xe1, 0x96, 0xea, 0xc3, + 0xd2, 0xf1, 0x2b, 0xc4, 0xac, 0x2d, 0xdc, 0xb3, 0xd4, 0x69, 0xc7, 0x0b, + 0x44, 0x8c, 0x1a, 0xc8, 0x0d, 0xbb, 0x6a, 0x37, 0x40, 0x1b, 0xd1, 0xf4, + 0x69, 0x63, 0xcb, 0xbd, 0x0c, 0x9f, 0x26, 0x33, 0xd2, 0xf8, 0xd5, 0x0f, + 0x85, 0x74, 0x02, 0x4b, 0x90, 0x79, 0x91, 0x15, 0x8a, 0x52, 0x6a, 0xcb, + 0x17, 0x3a, 0x26, 0xd2, 0xa0, 0x9a, 0xc7, 0x03, 0xb6, 0xe5, 0x30, 0xc6, + 0xbc, 0xf7, 0xd8, 0x5b, 0x56, 0x6f, 0x3f, 0xd0, 0x28, 0x5a, 0x08, 0xc6, + 0x7d, 0xf6, 0x42, 0x1b, 0xdb, 0xde, 0xda, 0x72, 0x7d, 0x34, 0x43, 0xcb, + 0xf7, 0x30, 0xfc, 0x6a, 0x41, 0xfb, 0xda, 0xdd, 0x8d, 0xa3, 0xe8, 0xcf, + 0x45, 0x9b, 0xf5, 0xe5, 0x4c, 0x24, 0x0a, 0x0c, 0x36, 0xe5, 0x56, 0x09, + 0x63, 0xac, 0x7b, 0x85, 0x98, 0x40, 0x4d, 0x80, 0xc1, 0xbc, 0xf7, 0x40, + 0xed, 0xd0, 0x80, 0x14, 0x34, 0xa4, 0xf0, 0xe4, 0xdb, 0xb7, 0xf1, 0x8e, + 0xe6, 0xaf, 0xac, 0x9c, 0x9e, 0x8c, 0x41, 0x78, 0xff, 0x6e, 0x9d, 0xca, + 0xaa, 0x46, 0x49, 0xcc, 0x3a, 0x27, 0x74, 0x2c, 0x37, 0xe1, 0x2c, 0x58, + 0xcc, 0xb3, 0x46, 0x64, 0xf1, 0xa2, 0x0d, 0x88, 0x44, 0xdf, 0xc1, 0x0d, + 0x3b, 0x1c, 0x59, 0x43, 0x6d, 0xb6, 0x65, 0x65, 0x36, 0x93, 0x4d, 0xa4, + 0x13, 0x48, 0x92, 0xc2, 0x51, 0x2e, 0x01, 0x0e, 0xa1, 0xa2, 0x23, 0xcb, + 0xee, 0x22, 0x8a, 0xf6, 0x7c, 0xec, 0x32, 0xf6, 0xcf, 0xcd, 0x2e, 0xa5, + 0xab, 0xe2, 0xab, 0xa6, 0xd1, 0x4b, 0xa7, 0x97, 0x18, 0xa6, 0x59, 0xc6, + 0xf5, 0xc4, 0x42, 0x61, 0x0f, 0x9e, 0x6c, 0x5c, 0x3d, 0x5b, 0x58, 0x31, + 0xe7, 0x82, 0xb1, 0x56, 0xd5, 0x8f, 0xda, 0xef, 0xb2, 0xe9, 0x72, 0x4a, + 0xfb, 0x2e, 0xd6, 0x93, 0x1e, 0x95, 0x59, 0xf0, 0x61, 0x5a, 0xcc, 0x6f, + 0xfc, 0xf5, 0x57, 0x72, 0x3e, 0xae, 0x02, 0xd4, 0x5f, 0xa3, 0x9a, 0x51, + 0xd0, 0xb8, 0x10, 0x1c, 0x79, 0x28, 0xa1, 0x11, 0xa9, 0x69, 0xec, 0x32, + 0xa2, 0x8a, 0x22, 0x54, 0xe7, 0x59, 0xe6, 0x23, 0xf1, 0xa1, 0xed, 0xb6, + 0x14, 0x79, 0x41, 0x96, 0x2a, 0x4b, 0x41, 0xc3, 0x7d, 0x00, 0x76, 0xee, + 0xd0, 0xb6, 0x59, 0x79, 0x25, 0x07, 0x5f, 0x1e, 0xba, 0x36, 0x3f, 0x9b, + 0xe8, 0x61, 0x98, 0x9a, 0x07, 0x13, 0x2a, 0x28, 0x0b, 0x3e, 0xe4, 0x15, + 0x75, 0xc4, 0x72, 0x04, 0x89, 0xbd, 0x90, 0xa2, 0xd8, 0x1f, 0x32, 0xeb, + 0x1f, 0x2c, 0x94, 0x9d, 0x89, 0xe1, 0x2e, 0xe4, 0x85, 0x99, 0x03, 0x42, + 0xcc, 0x5e, 0x32, 0x3c, 0xad, 0xb3, 0x06, 0x79, 0x5e, 0x09, 0xfd, 0x42, + 0xe0, 0xb6, 0x20, 0x02, 0x84, 0xda, 0x58, 0x14, 0x40, 0x7a, 0x8e, 0x47, + 0xc6, 0xc5, 0xb4, 0x09, 0xdd, 0x81, 0x55, 0x2a, 0x99, 0x31, 0x4f, 0xcb, + 0xcb, 0xe3, 0x6a, 0xf1, 0xf0, 0xf5, 0x3d, 0x31, 0xbc, 0x10, 0x1c, 0x05, + 0xfd, 0xc2, 0x01, 0x3d, 0xbf, 0x1d, 0x32, 0xb0, 0x90, 0x29, 0xb5, 0xa3, + 0x00, 0x8c, 0x42, 0xa4, 0x84, 0xbe, 0x24, 0xb4, 0xb4, 0x74, 0x7d, 0xb1, + 0x7f, 0x38, 0x8b, 0xde, 0x62, 0xc3, 0xf6, 0x12, 0x7a, 0x34, 0x32, 0xde, + 0x24, 0xf4, 0x2e, 0x90, 0x46, 0xa9, 0x90, 0xe5, 0xcc, 0x9b, 0x05, 0x1f, + 0x80, 0x95, 0x9c, 0xbc, 0xd4, 0xf5, 0x76, 0xaf, 0x6b, 0xf2, 0x40, 0x5b, + 0x7c, 0x0e, 0x18, 0x7a, 0x05, 0x06, 0xf3, 0xde, 0xa2, 0x9f, 0x00, 0x1d, + 0x16, 0x10, 0x54, 0x81, 0x1f, 0x96, 0x3b, 0xa0, 0xdd, 0x4a, 0xbe, 0xa9, + 0xbb, 0xc7, 0xbe, 0xb0, 0x72, 0x0b, 0xd7, 0xab, 0xe0, 0x17, 0x0c, 0x3c, + 0x82, 0xfc, 0x11, 0xbb, 0x78, 0xd1, 0xe2, 0xbe, 0x6b, 0x3e, 0x28, 0xeb, + 0x8d, 0x6a, 0x6d, 0x15, 0xfc, 0x71, 0x89, 0x0b, 0x2a, 0x2f, 0xf9, 0x07, + 0x66, 0xa0, 0xb1, 0xfe, 0x6a, 0xac, 0x4c, 0x59, 0x9a, 0x29, 0x0f, 0xa1, + 0x0f, 0xbc, 0x8d, 0x02, 0x05, 0x0a, 0x82, 0xfd, 0x10, 0x06, 0x35, 0x6f, + 0x89, 0x60, 0xfc, 0xe2, 0x46, 0x30, 0x0b, 0x03, 0x73, 0xb5, 0x28, 0x91, + 0x79, 0x95, 0x2b, 0xff, 0x2a, 0xda, 0x89, 0x14, 0x09, 0x15, 0xda, 0x4c, + 0x7c, 0x15, 0x5c, 0xa1, 0x81, 0x34, 0xaf, 0xb6, 0xb8, 0x57, 0xad, 0x2b, + 0x17, 0x1a, 0x62, 0x69, 0xeb, 0xf6, 0x9a, 0x23, 0xc5, 0xf6, 0x9a, 0xf0, + 0xd3, 0xf9, 0x8f, 0x74, 0x64, 0x53, 0xab, 0xa3, 0xf0, 0x2e, 0x4f, 0xa8, + 0x55, 0x00, 0x58, 0x62, 0x88, 0x98, 0xa2, 0xc0, 0xa6, 0x0e, 0xe0, 0x2f, + 0x88, 0xda, 0x4c, 0x47, 0x42, 0xab, 0x00, 0xbc, 0x95, 0x24, 0x80, 0x55, + 0x1c, 0xd1, 0x44, 0x48, 0x16, 0x47, 0xcc, 0x13, 0xc8, 0xce, 0xbc, 0xe5, + 0xc8, 0x31, 0x84, 0x9d, 0x2b, 0xb2, 0xab, 0xeb, 0x03, 0xc2, 0x75, 0x00, + 0xbd, 0x8d, 0x31, 0x51, 0x8e, 0xa3, 0x47, 0x15, 0x74, 0x2e, 0x60, 0xbc, + 0x15, 0x80, 0x5e, 0xf1, 0x46, 0x55, 0xc4, 0x07, 0xf9, 0xc3, 0xf5, 0x8b, + 0x43, 0xc9, 0x97, 0x9a, 0xef, 0x5e, 0x5d, 0x91, 0x49, 0x9d, 0x76, 0x3c, + 0x98, 0x20, 0x26, 0x23, 0x5f, 0x9e, 0x35, 0x5f, 0x98, 0xf1, 0xfa, 0x86, + 0xbf, 0x91, 0xe8, 0x82, 0x60, 0x34, 0x5d, 0xee, 0xb7, 0x9a, 0xef, 0xed, + 0xa4, 0x82, 0xf4, 0xac, 0xb8, 0x61, 0x69, 0xb4, 0xdd, 0x95, 0xc8, 0xb5, + 0x93, 0x87, 0x75, 0x15, 0x82, 0xb5, 0x25, 0x96, 0xe0, 0xa3, 0xa7, 0x74, + 0xad, 0x07, 0x9d, 0x61, 0x8e, 0x4f, 0x5f, 0x06, 0x19, 0x95, 0x07, 0xd3, + 0x16, 0xed, 0x82, 0xe5, 0x73, 0x94, 0x2a, 0x81, 0x6b, 0x26, 0x36, 0xc5, + 0x1e, 0x5d, 0x43, 0x2e, 0xd8, 0xe1, 0xf5, 0xe9, 0xd5, 0xf3, 0x32, 0x37, + 0x86, 0x5b, 0xa1, 0xf5, 0xc4, 0x37, 0xd9, 0xd3, 0xbe, 0xe3, 0x0b, 0xbe, + 0xa8, 0x03, 0x55, 0xcd, 0x92, 0xfc, 0x1a, 0xa3, 0x97, 0x65, 0x4b, 0x82, + 0x86, 0xe4, 0x37, 0xd4, 0x10, 0x2d, 0x28, 0x8c, 0xb5, 0xde, 0xa7, 0xf1, + 0x30, 0xeb, 0xd2, 0x2e, 0xe1, 0x6f, 0x4b, 0x1c, 0x01, 0x37, 0xb9, 0x67, + 0x15, 0x11, 0x5e, 0x64, 0x0b, 0xe8, 0x05, 0x57, 0xfc, 0x5d, 0xa7, 0x83, + 0x51, 0xb4, 0x5c, 0xb7, 0x65, 0x67, 0xc0, 0x69, 0x45, 0x66, 0xdc, 0xa1, + 0x42, 0xce, 0x8f, 0x23, 0xcc, 0x83, 0x8b, 0x59, 0xda, 0xa8, 0x4e, 0x83, + 0x2f, 0x69, 0x69, 0xda, 0x87, 0x17, 0x2c, 0x94, 0x4c, 0x7d, 0xcc, 0x4d, + 0x84, 0xf1, 0xa8, 0x8f, 0xdb, 0xe2, 0x51, 0xcc, 0x67, 0x6d, 0xe9, 0x66, + 0x9a, 0x3c, 0x51, 0x0e, 0x38, 0x7c, 0xca, 0x0c, 0xc3, 0xc7, 0xa3, 0x8e, + 0x72, 0x1d, 0x02, 0x32, 0x6d, 0x1c, 0xfc, 0xf4, 0xa3, 0x37, 0x39, 0x99, + 0xe2, 0xd3, 0xb7, 0x72, 0x65, 0x79, 0x4b, 0x0b, 0x2f, 0xeb, 0xf8, 0x27, + 0x4f, 0x3b, 0x9f, 0x86, 0xa7, 0x4f, 0x16, 0xe0, 0xa1, 0x0e, 0xf9, 0x64, + 0x8c, 0xfd, 0x30, 0x6b, 0xd3, 0x21, 0xe6, 0x37, 0xd1, 0xc5, 0xfe, 0x93, + 0x0f, 0xc7, 0xed, 0x68, 0x84, 0xf2, 0x67, 0x5f, 0x3e, 0x27, 0xae, 0xaf, + 0xbc, 0x70, 0xb9, 0xa4, 0x4c, 0xa7, 0xf2, 0x5f, 0xbc, 0x8d, 0xca, 0xea, + 0x2a, 0xd4, 0x35, 0xc3, 0xe0, 0xe1, 0x6b, 0x0d, 0x9f, 0xf3, 0x22, 0x8e, + 0xa5, 0x13, 0x86, 0x1a, 0x3d, 0x20, 0x62, 0xae, 0xb4, 0x6c, 0xeb, 0x97, + 0xf5, 0xab, 0x12, 0xf1, 0x69, 0x43, 0xfd, 0x6a, 0xf2, 0x6a, 0x55, 0xe7, + 0x62, 0x11, 0x71, 0x32, 0x34, 0x1c, 0x78, 0x8e, 0xab, 0x13, 0x57, 0xdf, + 0xd0, 0x5f, 0xc0, 0x9e, 0x8c, 0x7b, 0x7b, 0xb2, 0x3d, 0x47, 0x3f, 0xb0, + 0xce, 0x35, 0xfa, 0xa5, 0x8e, 0x7e, 0x19, 0xa1, 0xc0, 0x70, 0x17, 0x0d, + 0x60, 0x1e, 0xd0, 0x22, 0x51, 0x66, 0xea, 0x23, 0xb6, 0x30, 0xbc, 0x8b, + 0x2e, 0x1b, 0xd7, 0xe8, 0xea, 0x7b, 0xa4, 0x92, 0x16, 0x9f, 0x46, 0xf9, + 0xa7, 0x71, 0x31, 0xbd, 0xd8, 0x82, 0x51, 0xa8, 0x23, 0x76, 0x1f, 0xfa, + 0x21, 0x8f, 0x02, 0x01, 0x69, 0x8a, 0xd4, 0x4c, 0x7c, 0x19, 0x55, 0x3d, + 0x1b, 0x93, 0x73, 0xd9, 0x88, 0x40, 0x8e, 0x1e, 0x07, 0x0d, 0x9a, 0x56, + 0xdb, 0x93, 0xb9, 0x14, 0x0e, 0xc8, 0xa0, 0xd4, 0xcc, 0xac, 0x3a, 0xb8, + 0x54, 0x67, 0x76, 0x34, 0xc5, 0x97, 0x68, 0x68, 0xc2, 0xa0, 0x96, 0x6b, + 0xed, 0x96, 0xd1, 0x20, 0x30, 0x13, 0x70, 0x26, 0xd3, 0xc7, 0x6d, 0x33, + 0xa1, 0x5f, 0x75, 0x5b, 0x9c, 0xba, 0x15, 0xe6, 0x70, 0x75, 0x48, 0x3b, + 0xd8, 0x8c, 0x24, 0x5f, 0x19, 0x92, 0x7e, 0x89, 0xe2, 0xf1, 0x50, 0x65, + 0x36, 0x09, 0xf7, 0x16, 0x44, 0x73, 0x97, 0xf3, 0xd3, 0x03, 0xdb, 0x66, + 0xd3, 0xb0, 0x90, 0x7c, 0x27, 0x81, 0x37, 0xf1, 0x9d, 0x41, 0x17, 0xd9, + 0xc5, 0xd8, 0xdd, 0xf6, 0x32, 0xab, 0xe9, 0xd2, 0x08, 0x46, 0x91, 0x93, + 0x28, 0x5e, 0x7d, 0x26, 0xaa, 0x78, 0xe7, 0x4f, 0x9f, 0x3f, 0x60, 0xa4, + 0xbb, 0x80, 0x0f, 0xa4, 0xe5, 0x5a, 0xd0, 0x16, 0x93, 0x52, 0x8a, 0xec, + 0xde, 0x88, 0xaf, 0x8a, 0x60, 0x42, 0xb3, 0xfc, 0x11, 0xac, 0xb1, 0x98, + 0x89, 0x11, 0x4e, 0x03, 0x24, 0xc6, 0x73, 0x85, 0x74, 0xa2, 0x23, 0x2c, + 0x16, 0x5a, 0x6b, 0xdd, 0xe0, 0x5b, 0x46, 0x24, 0x52, 0xde, 0x82, 0xda, + 0xf3, 0xc3, 0x8c, 0x52, 0xd2, 0x1c, 0xf0, 0x91, 0xeb, 0xe2, 0xfa, 0x60, + 0x9b, 0x15, 0xe3, 0xbc, 0x2e, 0x5f, 0x3a, 0xaa, 0x11, 0xf8, 0xa7, 0x84, + 0x20, 0xd2, 0x0f, 0xe3, 0xdb, 0x7a, 0x45, 0x1b, 0x9e, 0xbc, 0x3a, 0x51, + 0xf7, 0xc5, 0x47, 0x75, 0xc5, 0x7e, 0x98, 0x16, 0x61, 0xf1, 0xc9, 0x89, + 0x08, 0xd4, 0x6d, 0x4d, 0x6e, 0x82, 0xc8, 0xe9, 0x90, 0xfd, 0xec, 0x80, + 0xd3, 0xc7, 0x7c, 0x68, 0x86, 0x74, 0x2e, 0x06, 0x3e, 0x73, 0xb0, 0xbd, + 0x22, 0x4e, 0x34, 0x44, 0xa3, 0x81, 0x5a, 0xc8, 0xbb, 0xa8, 0x8f, 0x5d, + 0xcd, 0x55, 0x20, 0x62, 0xbe, 0x64, 0x9e, 0xc6, 0xb9, 0xff, 0x94, 0xc1, + 0x77, 0xf1, 0x58, 0x30, 0x8c, 0x88, 0x3e, 0x5f, 0xc2, 0xbc, 0x85, 0x35, + 0x50, 0xad, 0x35, 0x2c, 0x69, 0x4b, 0x5d, 0xcb, 0x3d, 0x03, 0x3b, 0x0a, + 0xa6, 0x20, 0xea, 0x81, 0x40, 0x6d, 0xbf, 0x84, 0x70, 0x5b, 0x63, 0xb5, + 0x7b, 0x74, 0x22, 0x13, 0x56, 0xd7, 0xce, 0xe8, 0x4b, 0xcc, 0x74, 0xb7, + 0x32, 0x97, 0xdb, 0x83, 0x6f, 0x19, 0xdb, 0x6e, 0x63, 0xbc, 0x87, 0xe5, + 0x49, 0x8b, 0x94, 0x16, 0xe2, 0xed, 0xac, 0x77, 0x72, 0x9d, 0x0a, 0x6c, + 0x81, 0x70, 0x6f, 0x8b, 0xc7, 0x72, 0x65, 0x63, 0xa6, 0x9e, 0x13, 0xf4, + 0xef, 0xa2, 0xab, 0x60, 0x6e, 0x65, 0xcc, 0x15, 0xc5, 0x8a, 0x32, 0x7b, + 0x34, 0x42, 0x6b, 0x13, 0x62, 0x6b, 0x4b, 0x85, 0xd8, 0x58, 0xbe, 0x57, + 0xcb, 0xaf, 0x46, 0x12, 0x84, 0x72, 0x25, 0x5d, 0xc5, 0xee, 0x38, 0xbf, + 0xa6, 0x83, 0xde, 0x6c, 0x13, 0x06, 0xbf, 0xc0, 0xd9, 0xee, 0x3c, 0x41, + 0x65, 0x09, 0x49, 0x6e, 0x51, 0xf3, 0x73, 0xc4, 0xed, 0x68, 0x89, 0xbe, + 0xa8, 0x4c, 0x73, 0x28, 0xe6, 0xc1, 0x6a, 0x1b, 0xec, 0xe0, 0x57, 0xa0, + 0x7c, 0x6c, 0x1b, 0x3b, 0x3a, 0x9b, 0x04, 0x90, 0xd3, 0x0d, 0x80, 0xd8, + 0x95, 0x2b, 0x34, 0x31, 0x1f, 0x16, 0xb8, 0x90, 0xaa, 0xc0, 0x7a, 0xdc, + 0xf2, 0xe0, 0xe1, 0xe4, 0xce, 0x77, 0x9b, 0x9d, 0xd6, 0x17, 0xa6, 0x49, + 0x5a, 0xbf, 0xc1, 0x1f, 0xc5, 0xae, 0x7b, 0x98, 0x16, 0x61, 0x50, 0x1b, + 0x99, 0x11, 0x8c, 0x63, 0x6b, 0x05, 0x62, 0x1d, 0x0e, 0xe5, 0x7a, 0x2d, + 0x22, 0x93, 0xa6, 0x55, 0x0f, 0x34, 0xcf, 0x76, 0x37, 0x25, 0x7a, 0xd6, + 0xb5, 0x4e, 0xdc, 0x4e, 0x9e, 0x3d, 0xf9, 0x95, 0x45, 0x95, 0x78, 0x97, + 0xf6, 0xc5, 0xc5, 0x06, 0x58, 0x89, 0x1b, 0xca, 0xb0, 0xc0, 0x91, 0x69, + 0x1f, 0x2a, 0x1d, 0x12, 0x5d, 0x9e, 0x07, 0xd9, 0x4b, 0xc1, 0x56, 0x1c, + 0x6d, 0x25, 0x1a, 0x66, 0x5b, 0x80, 0x51, 0xb1, 0xa7, 0x20, 0x8e, 0x4b, + 0x08, 0x17, 0xaa, 0xa7, 0x11, 0xff, 0xc0, 0x2b, 0x41, 0xd1, 0x66, 0x2c, + 0x5e, 0xbc, 0xba, 0x80, 0x81, 0xcd, 0x1f, 0x16, 0x38, 0x5f, 0xad, 0x28, + 0x2a, 0x67, 0x2a, 0xd6, 0xb5, 0xea, 0x47, 0x6a, 0x02, 0xcd, 0xef, 0x4b, + 0xd5, 0x00, 0xce, 0xe7, 0x56, 0x97, 0xc3, 0x8a, 0x2e, 0xdf, 0x62, 0xfb, + 0xbf, 0x02, 0xc8, 0x56, 0xba, 0xec, 0x46, 0xb5, 0xe2, 0x54, 0x17, 0xae, + 0x58, 0xfa, 0x7c, 0x58, 0x54, 0xe3, 0x62, 0x26, 0xc1, 0x38, 0x41, 0xa7, + 0x31, 0x25, 0xbe, 0x32, 0x74, 0x2b, 0x78, 0x5e, 0x8d, 0xd8, 0xdf, 0x0b, + 0x2a, 0x6a, 0x2b, 0x1d, 0x60, 0x35, 0xe8, 0xba, 0x75, 0xdd, 0x98, 0x97, + 0x4e, 0xb8, 0x1d, 0xd6, 0xb9, 0x55, 0xf5, 0x4e, 0x68, 0x1d, 0xbd, 0xaa, + 0xb6, 0xbe, 0x8b, 0x20, 0x07, 0x56, 0xfa, 0x6c, 0x85, 0xa9, 0xb1, 0xb1, + 0xa7, 0x0d, 0x0c, 0xa7, 0x7c, 0x7c, 0x5c, 0xde, 0xd6, 0x87, 0x93, 0xef, + 0xdf, 0xcb, 0x57, 0xc1, 0x6a, 0x57, 0xbe, 0x40, 0x97, 0x82, 0x8b, 0xe0, + 0x0d, 0x05, 0xdd, 0x3b, 0x4f, 0x0e, 0x05, 0xd4, 0x94, 0x58, 0x00, 0x52, + 0xc0, 0x2e, 0xa7, 0xb3, 0xcc, 0xaa, 0x52, 0x47, 0x46, 0x4b, 0x16, 0xdc, + 0x9a, 0x59, 0x25, 0x88, 0x93, 0x03, 0xd7, 0x0f, 0x8a, 0x54, 0xb2, 0x84, + 0xde, 0x20, 0xfa, 0x32, 0x80, 0x9b, 0x75, 0x6c, 0xd6, 0x13, 0xb1, 0x5d, + 0x41, 0x44, 0x91, 0xb3, 0xf9, 0x1a, 0x21, 0x86, 0xa1, 0x02, 0xc5, 0x80, + 0x15, 0x8e, 0x3d, 0xa8, 0xb6, 0x84, 0x46, 0x61, 0xb7, 0x4c, 0xf5, 0x77, + 0x42, 0x88, 0x70, 0xb1, 0x5f, 0xf8, 0x42, 0xe2, 0x89, 0x40, 0x3c, 0x4a, + 0xb0, 0xb3, 0x14, 0xe6, 0x65, 0xbc, 0xd8, 0x97, 0xd8, 0x14, 0xc7, 0x51, + 0xd4, 0xed, 0xf0, 0xcc, 0x09, 0xa8, 0x94, 0x5a, 0x57, 0x4c, 0xb1, 0x8b, + 0xd2, 0x7c, 0xd2, 0x9e, 0x6d, 0xb6, 0x67, 0x1f, 0x5c, 0x97, 0x84, 0xa5, + 0xb7, 0x4b, 0xc1, 0x5c, 0xa6, 0xaf, 0x49, 0x19, 0x2a, 0x9f, 0xd8, 0xce, + 0x6d, 0xa4, 0xbe, 0xf1, 0x97, 0xdf, 0x81, 0x74, 0x6b, 0x79, 0x68, 0xad, + 0x1b, 0x7b, 0x49, 0x03, 0x99, 0x8e, 0x8a, 0xcc, 0x04, 0x69, 0x17, 0x89, + 0xe7, 0x93, 0xf3, 0x9f, 0x2e, 0x4a, 0xe3, 0xd1, 0x95, 0x81, 0x09, 0xdc, + 0x69, 0x77, 0x61, 0x1c, 0xc8, 0xf3, 0x7d, 0xa5, 0xb1, 0x2b, 0x7e, 0x6c, + 0xec, 0x8a, 0x78, 0xf1, 0x71, 0x56, 0x31, 0xc8, 0x9d, 0x41, 0x9f, 0x3d, + 0xb1, 0x99, 0xfa, 0xb8, 0xc0, 0xd9, 0xde, 0x69, 0x25, 0x6f, 0x17, 0xcf, + 0xee, 0x78, 0x3a, 0x38, 0x16, 0xe4, 0x77, 0x27, 0x54, 0xf0, 0xe8, 0x96, + 0xf0, 0xb5, 0x77, 0x83, 0xe8, 0x02, 0xf0, 0x40, 0xb5, 0x4e, 0xcd, 0xfc, + 0xb3, 0x2b, 0x41, 0x53, 0x79, 0x5e, 0xf3, 0xe5, 0x3e, 0xdd, 0xf7, 0x66, + 0x41, 0x8b, 0x20, 0x86, 0xc7, 0xde, 0x7d, 0xa2, 0xe2, 0xcb, 0x86, 0x48, + 0x35, 0x8f, 0xec, 0x01, 0x4a, 0x7a, 0xf5, 0xa6, 0x91, 0x93, 0x3a, 0x11, + 0xb6, 0xe2, 0x92, 0x3c, 0x07, 0x2e, 0x51, 0xee, 0x0d, 0x0e, 0x48, 0x07, + 0xa5, 0x2e, 0x86, 0x76, 0x7c, 0x60, 0x1a, 0xb2, 0x6e, 0x8c, 0x6b, 0xf1, + 0x58, 0x0b, 0x24, 0xea, 0x3d, 0xb9, 0xc1, 0xb7, 0xaa, 0xc9, 0x8f, 0x7f, + 0xca, 0x30, 0xc0, 0x47, 0x57, 0x06, 0xa6, 0x75, 0x97, 0xc7, 0x76, 0xe5, + 0x8d, 0xf8, 0xba, 0x35, 0x7b, 0x67, 0x2b, 0xfe, 0x61, 0x5a, 0x84, 0xd1, + 0x91, 0x33, 0x04, 0xd9, 0x6b, 0x81, 0xa5, 0xd6, 0xaa, 0x9b, 0xc2, 0x2c, + 0xde, 0xeb, 0x7c, 0x6f, 0x50, 0x00, 0x74, 0x08, 0x9c, 0x9e, 0x6c, 0x80, + 0x83, 0xa0, 0xc1, 0x18, 0x71, 0x31, 0x90, 0xdd, 0x38, 0x6d, 0xfb, 0xc8, + 0x28, 0x0f, 0x31, 0x78, 0x44, 0x0c, 0xee, 0xa3, 0x5e, 0xc8, 0x1d, 0x38, + 0x10, 0x73, 0x05, 0x45, 0xc1, 0x2c, 0xf8, 0x98, 0xf2, 0xd3, 0x26, 0x7c, + 0x32, 0xf0, 0xe7, 0x5f, 0x9f, 0xf8, 0x2c, 0x2f, 0xb3, 0x87, 0x05, 0x73, + 0xe6, 0x09, 0xfd, 0x7c, 0x88, 0xcf, 0xbe, 0xfe, 0xa9, 0x99, 0x4e, 0xb0, + 0x19, 0x10, 0x71, 0x6e, 0x95, 0x96, 0xf4, 0x20, 0xfb, 0x92, 0x66, 0xba, + 0x2b, 0xe6, 0x62, 0xfb, 0xb1, 0xaf, 0x10, 0xa7, 0x85, 0x5c, 0xd6, 0x53, + 0x30, 0xaf, 0x2e, 0x71, 0x80, 0x50, 0xbe, 0xdd, 0xaf, 0x8d, 0x98, 0x58, + 0xeb, 0x5e, 0x87, 0xff, 0x31, 0x97, 0x81, 0xb9, 0xdd, 0xf9, 0x4b, 0xee, + 0xf7, 0xa3, 0xe9, 0x97, 0x48, 0x2d, 0x1e, 0x85, 0x62, 0xf6, 0x70, 0x3b, + 0xa4, 0x91, 0x83, 0xca, 0xd8, 0x7a, 0xd1, 0x27, 0xa0, 0xde, 0xea, 0x30, + 0x29, 0x21, 0xb2, 0x71, 0x8c, 0x70, 0xe5, 0x08, 0x67, 0x88, 0xb0, 0x38, + 0xb2, 0x47, 0xa3, 0xb2, 0xec, 0x69, 0x8a, 0x88, 0x48, 0x08, 0xfa, 0x43, + 0xd7, 0x36, 0xe2, 0xff, 0x7a, 0x93, 0x80, 0x65, 0x8f, 0xb9, 0x5f, 0xb9, + 0x1e, 0x44, 0x61, 0x10, 0xf0, 0x42, 0xd7, 0xa7, 0x5d, 0x6f, 0x35, 0xe2, + 0x4e, 0x81, 0x95, 0xc6, 0x83, 0xcb, 0x1d, 0xb0, 0x3f, 0xa9, 0x20, 0x02, + 0x0d, 0xa5, 0xc3, 0x81, 0x6c, 0x13, 0xc4, 0xae, 0xc5, 0x39, 0x2c, 0x8a, + 0xf5, 0x90, 0xdd, 0xb0, 0xdc, 0x82, 0x2f, 0x3d, 0xb5, 0x7c, 0xbb, 0xc3, + 0xbc, 0xb9, 0x0b, 0x39, 0x3e, 0x1b, 0x81, 0x5e, 0xd3, 0x01, 0x39, 0xb4, + 0x4d, 0x28, 0x65, 0x8f, 0x87, 0x49, 0x25, 0x33, 0x37, 0x8d, 0x0a, 0xcd, + 0x5b, 0x0d, 0xfc, 0x38, 0x43, 0xf1, 0x3d, 0xf6, 0x88, 0xf8, 0xcb, 0x24, + 0xc0, 0xcf, 0xa0, 0x80, 0xc2, 0xe9, 0xd7, 0xdd, 0xc0, 0x3d, 0x06, 0xb3, + 0x68, 0x4c, 0xf4, 0xd0, 0xfa, 0x43, 0x5b, 0x1a, 0xc0, 0x62, 0x23, 0xd8, + 0xdb, 0x34, 0xaf, 0x1d, 0xe1, 0x35, 0xb8, 0xa6, 0x2f, 0x5f, 0xbe, 0xfc, + 0xe2, 0xc4, 0x11, 0x30, 0xcc, 0xe3, 0xc0, 0x9f, 0x07, 0xdf, 0x2d, 0x14, + 0xc9, 0x93, 0xb3, 0x44, 0x63, 0x8d, 0xf9, 0xf0, 0xd0, 0x1d, 0x32, 0xa9, + 0xe0, 0x69, 0x89, 0xa4, 0xbf, 0xc9, 0x11, 0x9b, 0x36, 0x5c, 0x7a, 0x64, + 0x83, 0xd8, 0x50, 0x11, 0x51, 0x7f, 0x3d, 0x6a, 0xaf, 0x9e, 0xfe, 0x0e, + 0x1d, 0xdb, 0xfd, 0x91, 0xf9, 0xb9, 0x77, 0x5d, 0x85, 0xd4, 0x4a, 0xf0, + 0xd8, 0xa0, 0x5c, 0xc3, 0xe0, 0xaf, 0xd0, 0x59, 0x4b, 0xc9, 0x62, 0x90, + 0xb9, 0x94, 0xf2, 0xdd, 0x28, 0x0f, 0x7f, 0xa3, 0x05, 0xff, 0xa6, 0x30, + 0x5c, 0x62, 0x2c, 0x77, 0xcf, 0xbe, 0xdc, 0xce, 0x51, 0x62, 0xdf, 0x66, + 0x93, 0x86, 0xe0, 0xb1, 0xcf, 0x47, 0x3e, 0x6f, 0xf8, 0xbf, 0xc1, 0x86, + 0x5f, 0x6f, 0xa5, 0xb9, 0x6e, 0xed, 0x7f, 0x86, 0x3b, 0x47, 0x4c, 0x9d, + 0x37, 0xa6, 0xbb, 0x20, 0x86, 0x9a, 0x42, 0x65, 0x30, 0xd0, 0xd4, 0x10, + 0x3e, 0x9e, 0x91, 0x91, 0x25, 0xa5, 0x36, 0xc2, 0x80, 0xe7, 0xf4, 0x0f, + 0xd3, 0xc6, 0x5b, 0x14, 0x30, 0xe8, 0x06, 0x23, 0xbc, 0x2e, 0xfa, 0x55, + 0x31, 0x55, 0x53, 0x88, 0x94, 0xcb, 0x96, 0x36, 0x1c, 0x40, 0xc8, 0x29, + 0x98, 0x08, 0x90, 0x9b, 0xf9, 0x1a, 0x59, 0xb1, 0xf6, 0x22, 0x56, 0x7c, + 0x21, 0x3b, 0x9b, 0xe0, 0x24, 0x44, 0xbf, 0xc1, 0x69, 0xd3, 0x5b, 0x00, + 0x48, 0x52, 0x66, 0x3d, 0x7e, 0x51, 0x72, 0x24, 0x32, 0xfb, 0x66, 0xbe, + 0x3c, 0x17, 0x86, 0xcd, 0x69, 0xc7, 0x6e, 0x98, 0x9d, 0x11, 0x0b, 0xbf, + 0x68, 0xc3, 0xd9, 0x55, 0xf2, 0x32, 0x12, 0x9d, 0xf2, 0x0f, 0x36, 0xd2, + 0xac, 0x79, 0x91, 0xe3, 0xac, 0xcd, 0xa4, 0x2b, 0xc8, 0xb7, 0x7c, 0xf9, + 0x04, 0xc6, 0x18, 0xac, 0xef, 0xc5, 0x42, 0x34, 0xfa, 0xad, 0xaa, 0xfc, + 0x80, 0xf9, 0x44, 0xf9, 0xc0, 0x7a, 0xd1, 0xdb, 0xc2, 0x49, 0xd2, 0xeb, + 0x05, 0xae, 0x73, 0xdb, 0x11, 0x30, 0x7d, 0x02, 0x36, 0x79, 0x50, 0x30, + 0x3e, 0x6c, 0x85, 0x1d, 0x25, 0xef, 0x46, 0xf9, 0x8e, 0x39, 0xc2, 0x34, + 0xc7, 0xae, 0x01, 0xa9, 0x2b, 0x32, 0xb6, 0x83, 0x09, 0xd2, 0xf5, 0x29, + 0x09, 0xe4, 0x3a, 0x10, 0x8b, 0x71, 0xb6, 0x18, 0x1e, 0xe1, 0x38, 0xb5, + 0x79, 0x9f, 0xbc, 0xc0, 0x0c, 0x42, 0x27, 0x2f, 0xbd, 0xe4, 0x51, 0x64, + 0xb8, 0x38, 0xcc, 0x9b, 0xed, 0x00, 0x7a, 0xbe, 0xd9, 0xf1, 0x07, 0x04, + 0xbd, 0xe7, 0x01, 0x1e, 0x27, 0xb2, 0x38, 0x18, 0xb0, 0x1b, 0x55, 0xed, + 0x61, 0xd7, 0x4e, 0x11, 0x5e, 0x9e, 0x6c, 0x60, 0x2a, 0x2a, 0x2b, 0x2f, + 0x51, 0x57, 0x28, 0xed, 0x7c, 0xbc, 0x20, 0xa3, 0xd7, 0x04, 0xf9, 0xb4, + 0x15, 0x2b, 0x70, 0x72, 0x05, 0x69, 0x55, 0xe1, 0x91, 0x86, 0xd4, 0x4a, + 0xb2, 0x00, 0x85, 0x2b, 0xfa, 0xe4, 0x06, 0x68, 0x36, 0x30, 0x8d, 0x70, + 0xd6, 0x99, 0x6e, 0xda, 0x9c, 0x1b, 0xd3, 0x4e, 0x49, 0xf5, 0xa5, 0x46, + 0x85, 0xc7, 0xc7, 0x38, 0xa5, 0x8f, 0x74, 0xa0, 0xee, 0xea, 0xf8, 0x1b, + 0x24, 0xd1, 0x55, 0xe2, 0xe7, 0x53, 0x9d, 0xc8, 0x72, 0xba, 0x8b, 0x3b, + 0xa0, 0x17, 0x28, 0x81, 0x92, 0x10, 0x68, 0xa6, 0x4d, 0x39, 0xb8, 0x6c, + 0xcd, 0xaf, 0x08, 0x86, 0x59, 0xcc, 0x51, 0x81, 0x8a, 0x33, 0x41, 0x4f, + 0x18, 0x84, 0x4e, 0xd9, 0x57, 0xbc, 0xca, 0x0a, 0xaf, 0x26, 0x70, 0x0c, + 0x65, 0x9e, 0x44, 0x46, 0x7c, 0x0c, 0x0a, 0x06, 0x27, 0x24, 0xf0, 0x0e, + 0x79, 0x2c, 0x89, 0xe1, 0xc1, 0x60, 0xa4, 0x62, 0xc8, 0xa3, 0x06, 0xbb, + 0xe6, 0x42, 0x98, 0x75, 0x3b, 0xd3, 0x68, 0xfb, 0x35, 0x1c, 0x66, 0x8b, + 0x0c, 0x84, 0x8a, 0x76, 0x1c, 0x5f, 0x0a, 0x61, 0x1e, 0xfc, 0x5a, 0x8a, + 0xb8, 0x96, 0x10, 0xab, 0x49, 0x79, 0x51, 0x91, 0x4f, 0x1f, 0x0d, 0x00, + 0x8a, 0xc9, 0x13, 0xd8, 0x75, 0x0a, 0xb2, 0x1a, 0x0c, 0xc8, 0x43, 0x26, + 0x48, 0xc8, 0x05, 0x02, 0x99, 0x1f, 0xf3, 0x4d, 0xcf, 0x13, 0x57, 0x7f, + 0x40, 0x2e, 0x85, 0x11, 0x78, 0x5e, 0x71, 0xdc, 0x1a, 0x45, 0x0e, 0xe6, + 0x77, 0x4d, 0xcb, 0x6f, 0xe8, 0xd2, 0x3a, 0x9b, 0x36, 0x3c, 0x5b, 0x88, + 0x25, 0xfb, 0xab, 0x0d, 0xdc, 0x67, 0x9b, 0x7b, 0x1a, 0x36, 0xef, 0x9a, + 0xec, 0xe3, 0x45, 0xd3, 0xe8, 0xbd, 0x19, 0x58, 0x86, 0xaf, 0xda, 0xc3, + 0xc3, 0x34, 0xde, 0x05, 0x85, 0x81, 0xd6, 0xda, 0x8d, 0x38, 0xc4, 0xe4, + 0x28, 0x4c, 0x7c, 0x8a, 0x19, 0xb6, 0xae, 0x96, 0x3f, 0xad, 0xcc, 0x1f, + 0x85, 0xfd, 0x71, 0x05, 0x60, 0x81, 0x10, 0xca, 0x02, 0xfb, 0x91, 0xa6, + 0xc0, 0x7e, 0xd8, 0x56, 0x25, 0x23, 0x07, 0x48, 0xa2, 0x21, 0x2d, 0x2c, + 0x98, 0xce, 0x28, 0xf5, 0xaa, 0x5d, 0x40, 0x33, 0x08, 0x21, 0x57, 0x41, + 0x6e, 0x50, 0xa1, 0x40, 0x0a, 0xa1, 0x9d, 0xbf, 0x39, 0x88, 0x36, 0xb8, + 0xc7, 0x7d, 0xad, 0x7d, 0x38, 0x9d, 0xf8, 0x3d, 0x20, 0xe2, 0xdc, 0x03, + 0x80, 0x1c, 0x54, 0x9e, 0xa4, 0x13, 0x5d, 0x07, 0xa4, 0xf5, 0x39, 0x34, + 0x2f, 0x18, 0x62, 0x63, 0x59, 0x35, 0x8f, 0x04, 0x20, 0xf1, 0x30, 0x2d, + 0xc2, 0xdc, 0x34, 0xa8, 0x9b, 0x0b, 0x79, 0xc8, 0xea, 0x9d, 0x2a, 0x1a, + 0xdf, 0x41, 0x2d, 0xb0, 0x91, 0x59, 0x96, 0x51, 0x0d, 0xe8, 0xc8, 0x46, + 0x65, 0x38, 0xaa, 0x92, 0x0f, 0x57, 0xd7, 0x17, 0xec, 0x29, 0xc4, 0x1d, + 0x71, 0x58, 0x92, 0x87, 0xc8, 0x6b, 0xca, 0xc4, 0x8c, 0x99, 0x79, 0xba, + 0x7d, 0x89, 0xbe, 0x05, 0x80, 0x6a, 0x24, 0xad, 0xc3, 0x32, 0x46, 0x6f, + 0x4f, 0x84, 0xf0, 0xf8, 0x98, 0x4d, 0x85, 0xbc, 0x88, 0x6f, 0x50, 0x90, + 0x50, 0x99, 0x60, 0xb0, 0x7e, 0x31, 0x76, 0xc9, 0xce, 0xd9, 0x3d, 0xa7, + 0x07, 0x5d, 0x20, 0x90, 0xad, 0xaf, 0x9d, 0x45, 0x8e, 0xe8, 0x96, 0x8c, + 0x09, 0xea, 0x7e, 0xe4, 0x02, 0x47, 0x3c, 0x2c, 0x04, 0x57, 0x2e, 0xbd, + 0xc4, 0x43, 0x49, 0x88, 0x4d, 0x80, 0x5c, 0xd3, 0x47, 0x4e, 0x7d, 0x23, + 0x0e, 0x79, 0x48, 0x73, 0xca, 0x20, 0x1c, 0x20, 0x58, 0x98, 0xbb, 0x3c, + 0xf1, 0x77, 0x47, 0x27, 0xcd, 0x3b, 0xfd, 0x24, 0x4f, 0x23, 0x7a, 0x5f, + 0xce, 0x88, 0x87, 0x13, 0x81, 0x92, 0xba, 0x7a, 0x49, 0x19, 0x57, 0x9c, + 0x9e, 0x9c, 0xd8, 0xf8, 0xa3, 0x65, 0xf1, 0x63, 0x6c, 0x55, 0x1f, 0x47, + 0x3c, 0xbc, 0xc5, 0xd1, 0x9c, 0xc4, 0x0c, 0x2b, 0xd3, 0x26, 0x4e, 0xe9, + 0xa8, 0x77, 0x07, 0x21, 0x42, 0x09, 0x0c, 0xdf, 0xee, 0x86, 0x13, 0xd8, + 0x1c, 0x7b, 0x66, 0xd8, 0x28, 0xa9, 0xd7, 0x39, 0x92, 0x8a, 0x30, 0xed, + 0xba, 0x50, 0x25, 0xf2, 0x97, 0x05, 0x60, 0x4f, 0x3c, 0x29, 0x44, 0xcf, + 0xe1, 0x0b, 0xec, 0x7d, 0xa4, 0xec, 0x83, 0x0c, 0xd1, 0xa7, 0x15, 0x74, + 0xfb, 0x22, 0xba, 0x0e, 0xba, 0x16, 0x41, 0x49, 0x89, 0x29, 0xea, 0x39, + 0x93, 0x7c, 0x67, 0x30, 0x40, 0xb2, 0x9d, 0xdf, 0xc3, 0x69, 0xeb, 0xba, + 0x74, 0xaa, 0x26, 0x22, 0x69, 0x2c, 0x32, 0xd9, 0xca, 0x82, 0xd4, 0xe5, + 0x0b, 0x0a, 0x45, 0x95, 0x53, 0xcf, 0x0c, 0xb1, 0x35, 0xda, 0x0f, 0x0b, + 0x81, 0x94, 0x3a, 0xd9, 0xdc, 0xca, 0xbc, 0x21, 0x01, 0xfc, 0x82, 0xe6, + 0x25, 0xcc, 0x82, 0x53, 0xec, 0x93, 0xa3, 0xe9, 0x13, 0x61, 0xfc, 0x32, + 0x85, 0x2b, 0xf8, 0x23, 0x54, 0xd7, 0xa7, 0x4e, 0x37, 0x2d, 0x95, 0xa9, + 0x5c, 0x04, 0x1e, 0x07, 0x65, 0x46, 0x16, 0xfa, 0xa9, 0x39, 0x80, 0x14, + 0xca, 0x2a, 0x65, 0x29, 0xc9, 0xeb, 0x7f, 0x67, 0x40, 0xa5, 0xc9, 0xaf, + 0x9b, 0x05, 0xc1, 0x89, 0x16, 0xb9, 0x89, 0x2f, 0xba, 0xe2, 0xf8, 0xdb, + 0xc4, 0xff, 0xad, 0x8a, 0xfc, 0xba, 0x2d, 0xd5, 0xeb, 0x90, 0x11, 0x5c, + 0x05, 0x5c, 0x9a, 0x11, 0x2d, 0xca, 0x78, 0xcb, 0x06, 0xdd, 0x17, 0xee, + 0x20, 0x81, 0x59, 0x25, 0x20, 0xb1, 0x6b, 0xc9, 0xbd, 0x0c, 0x01, 0xda, + 0xb8, 0x7a, 0x47, 0x8f, 0xe6, 0x2e, 0xc7, 0x2f, 0x2e, 0x22, 0x72, 0x1d, + 0xf5, 0xe2, 0x86, 0x32, 0x50, 0xa2, 0xa2, 0x4d, 0x5c, 0x5c, 0x74, 0xa5, + 0xd7, 0x6c, 0xea, 0x44, 0xce, 0x2e, 0x8d, 0x77, 0x61, 0xed, 0x31, 0x9d, + 0xec, 0xa8, 0x08, 0x2c, 0x64, 0xd8, 0x2f, 0xc5, 0x48, 0x60, 0xec, 0x28, + 0x95, 0x15, 0x69, 0xed, 0x06, 0x43, 0x54, 0xda, 0xf5, 0x35, 0x5e, 0x62, + 0x9a, 0x16, 0x75, 0xce, 0x82, 0x49, 0xdd, 0x50, 0x1e, 0x93, 0x07, 0x15, + 0x03, 0x7b, 0x48, 0xb5, 0xeb, 0x06, 0xad, 0xad, 0xe8, 0xf1, 0xc7, 0x9f, + 0x87, 0xae, 0x53, 0x19, 0x36, 0xd6, 0x83, 0x17, 0x8f, 0xd2, 0xf4, 0x95, + 0xb8, 0x9d, 0x43, 0x8d, 0x93, 0x21, 0x62, 0x45, 0x30, 0x73, 0x84, 0xe1, + 0x15, 0xe6, 0xf5, 0x0a, 0xaf, 0x70, 0xa8, 0x14, 0x4e, 0xdb, 0xd6, 0xd9, + 0x55, 0x5c, 0xb4, 0xe8, 0xc9, 0x4b, 0x54, 0xc9, 0xa9, 0x7f, 0x57, 0x7f, + 0x98, 0xa5, 0x23, 0x9b, 0x17, 0xd7, 0x52, 0xc9, 0x62, 0x08, 0x9c, 0xe4, + 0x64, 0x21, 0x77, 0x70, 0xf3, 0xe9, 0xba, 0x50, 0x84, 0x00, 0xb4, 0x93, + 0xa2, 0x77, 0x7d, 0x2a, 0x8e, 0xe4, 0x95, 0xea, 0x9a, 0x22, 0x0b, 0x24, + 0x50, 0x4b, 0x00, 0x45, 0xdd, 0xa9, 0xeb, 0x0c, 0x01, 0x57, 0x1f, 0x9e, + 0x32, 0xc5, 0x78, 0x71, 0x83, 0xf9, 0x8f, 0x7d, 0x47, 0x06, 0xfe, 0x35, + 0x9a, 0xb7, 0xe4, 0xfe, 0x62, 0xd2, 0x3a, 0x3a, 0xa2, 0xfc, 0x96, 0x18, + 0xa1, 0x8e, 0xe5, 0x9b, 0x30, 0xfe, 0x55, 0x2f, 0x01, 0x4b, 0x66, 0x09, + 0x6a, 0xe7, 0xb9, 0x69, 0xe9, 0xcc, 0x0c, 0x4d, 0x66, 0x13, 0x21, 0xcb, + 0xed, 0xac, 0x92, 0x2e, 0x16, 0xba, 0xcc, 0x79, 0xf9, 0x8e, 0x9d, 0x51, + 0xd3, 0x1c, 0x6c, 0xd3, 0xd7, 0x7e, 0xa8, 0xf3, 0xe2, 0x5e, 0xcb, 0xc0, + 0xca, 0xd8, 0xb9, 0x4e, 0xdd, 0x8d, 0xd2, 0x3b, 0xf8, 0x4d, 0xe2, 0x89, + 0xd2, 0x9b, 0xb7, 0x70, 0xdd, 0xc7, 0x76, 0x22, 0x33, 0xf7, 0x63, 0x81, + 0xdf, 0x3d, 0x35, 0xad, 0xf6, 0xa5, 0xcc, 0xd9, 0x5d, 0xac, 0x8a, 0x25, + 0xf1, 0xca, 0x1a, 0x24, 0x88, 0xe8, 0xd9, 0x44, 0xf4, 0xb4, 0x45, 0x1a, + 0x21, 0x0f, 0xe4, 0x02, 0xc7, 0x04, 0xd8, 0x0f, 0x62, 0x9f, 0xf2, 0xbd, + 0x35, 0xbd, 0x67, 0x0b, 0x74, 0x67, 0xf2, 0x69, 0x4e, 0x1c, 0x96, 0x8a, + 0x11, 0x22, 0xc4, 0xf9, 0xe7, 0xf3, 0xf7, 0x70, 0x95, 0xb5, 0xb1, 0x0f, + 0x09, 0x22, 0x86, 0x8b, 0x9e, 0xdb, 0x21, 0x77, 0x3f, 0xe4, 0x8b, 0xd5, + 0x00, 0x5b, 0xb3, 0xa1, 0xd0, 0x04, 0x40, 0x36, 0x8f, 0x00, 0x21, 0xc1, + 0x9d, 0x66, 0xb4, 0x5a, 0xbe, 0x05, 0x1f, 0x43, 0xaf, 0x52, 0xaf, 0x5d, + 0x1f, 0xcc, 0x16, 0xf8, 0x7a, 0xe0, 0x44, 0x5b, 0x34, 0x9e, 0xea, 0xce, + 0x4a, 0xf6, 0x32, 0xd1, 0x47, 0xf0, 0x64, 0x5e, 0x74, 0x8d, 0x59, 0xbd, + 0x37, 0x6a, 0x29, 0x1f, 0xd4, 0xd5, 0x08, 0xf2, 0x49, 0x27, 0x1f, 0x81, + 0x71, 0xfd, 0x4e, 0x7a, 0x04, 0x5b, 0x71, 0x15, 0xbe, 0x5c, 0x5d, 0x29, + 0x66, 0x3e, 0x43, 0x21, 0xf5, 0x52, 0xbe, 0x7a, 0x5b, 0x57, 0x72, 0xc5, + 0xac, 0x70, 0xee, 0xc1, 0x1d, 0x1b, 0xd1, 0x17, 0x02, 0x34, 0x24, 0x29, + 0xaf, 0x9b, 0x4b, 0x16, 0x7e, 0x14, 0x50, 0x9e, 0xb7, 0x4a, 0xec, 0xa9, + 0xeb, 0x75, 0x9b, 0xe9, 0x7d, 0xff, 0x0a, 0x29, 0x3e, 0x87, 0xfc, 0x9e, + 0xb2, 0x87, 0x40, 0xce, 0xea, 0xb9, 0x94, 0xd3, 0x13, 0xa0, 0x2f, 0xad, + 0x79, 0x68, 0xe6, 0x01, 0x7c, 0x2c, 0x69, 0x3c, 0xf3, 0x2a, 0xbd, 0x45, + 0x1a, 0xcf, 0xed, 0x8b, 0xdb, 0xa6, 0xf0, 0x7c, 0x72, 0xbb, 0xbe, 0x45, + 0xf2, 0x5d, 0x96, 0x5c, 0x5f, 0xe8, 0x68, 0x87, 0xcc, 0x6a, 0x2b, 0xa0, + 0xf3, 0x61, 0xc6, 0xc5, 0xa3, 0x0a, 0x66, 0x3e, 0x50, 0x82, 0x27, 0xc8, + 0x2b, 0x35, 0x6a, 0x46, 0x58, 0x8a, 0x72, 0xfa, 0x1f, 0xde, 0xea, 0xd6, + 0x55, 0x82, 0xe2, 0x58, 0xc4, 0x40, 0xd9, 0xc5, 0x4d, 0x13, 0x51, 0x12, + 0xeb, 0xbc, 0xd7, 0xf9, 0x79, 0xcc, 0x65, 0x60, 0xf2, 0x77, 0xfa, 0xf6, + 0x79, 0xd6, 0xd7, 0x59, 0x15, 0x94, 0xc0, 0xe5, 0xd3, 0xb2, 0x49, 0xcc, + 0xad, 0xe3, 0xb1, 0x4c, 0x72, 0x9f, 0x96, 0x61, 0x42, 0x6d, 0x2e, 0x9e, + 0x18, 0x97, 0x4b, 0x4e, 0x6c, 0xed, 0xe8, 0x7d, 0x79, 0x9a, 0xac, 0x36, + 0x2f, 0x1b, 0x04, 0x81, 0x21, 0xb6, 0xf6, 0xd2, 0xb4, 0xa2, 0x19, 0x09, + 0xc0, 0x52, 0x6e, 0x1c, 0x5d, 0x92, 0xdd, 0x4e, 0xbc, 0x3a, 0xc0, 0x87, + 0xdf, 0xc4, 0xc4, 0x0f, 0xf4, 0x57, 0xd7, 0xeb, 0xa2, 0x31, 0xb4, 0x53, + 0x67, 0xc0, 0x6f, 0x9f, 0x01, 0x46, 0x1d, 0xe6, 0x6c, 0xa7, 0xcd, 0x33, + 0x7d, 0xdf, 0xdd, 0x6e, 0x04, 0x99, 0xbe, 0xaf, 0xe3, 0x0c, 0x7b, 0x17, + 0x84, 0xf6, 0x6b, 0x0d, 0xce, 0xe2, 0x02, 0x8f, 0x13, 0xf1, 0x22, 0x5a, + 0xbe, 0xac, 0x75, 0xa8, 0xb7, 0x34, 0x0f, 0xb3, 0xce, 0xdf, 0xd9, 0x61, + 0xb6, 0x19, 0xd4, 0x56, 0xe0, 0xfb, 0x57, 0xe8, 0x2a, 0x5f, 0xb8, 0x5c, + 0x7e, 0x16, 0x71, 0x9b, 0x30, 0x97, 0xf9, 0x70, 0xd3, 0xd7, 0xd9, 0xbc, + 0x56, 0xa1, 0x43, 0x62, 0xa7, 0xc6, 0x76, 0xb0, 0x75, 0xc7, 0x23, 0xe2, + 0x69, 0x4f, 0x4b, 0x9d, 0x35, 0xb4, 0x77, 0x4f, 0xcf, 0x72, 0x26, 0xf3, + 0xad, 0x15, 0x93, 0x01, 0xf8, 0x83, 0x7d, 0x47, 0x36, 0xb4, 0xf3, 0x5b, + 0x73, 0x97, 0xcf, 0x24, 0x01, 0xf4, 0xa5, 0x34, 0xd2, 0x4b, 0x1b, 0x02, + 0x8d, 0x02, 0x24, 0x1e, 0xb3, 0x55, 0x6a, 0x22, 0x63, 0xc3, 0x1c, 0x05, + 0xa0, 0x55, 0xaa, 0xa6, 0xeb, 0x51, 0xaf, 0xba, 0x1c, 0x86, 0x83, 0x5b, + 0xd0, 0x4d, 0x83, 0x98, 0xee, 0xb8, 0x41, 0x68, 0xb9, 0x3e, 0x07, 0xf1, + 0xb4, 0x02, 0xbc, 0x4e, 0x2e, 0xe5, 0xbd, 0x5b, 0xc5, 0xea, 0x8d, 0x5e, + 0xe9, 0x85, 0x0c, 0x7c, 0x76, 0x55, 0x2d, 0x6d, 0x26, 0xe4, 0x28, 0x52, + 0x21, 0x5f, 0x1a, 0xf3, 0x09, 0x8b, 0x68, 0x67, 0xd5, 0x6d, 0xb5, 0xdc, + 0xb2, 0xc8, 0x6e, 0xc5, 0x8e, 0x0d, 0xae, 0x7a, 0x50, 0x72, 0x85, 0x54, + 0x01, 0xb7, 0xd2, 0x7d, 0x2d, 0xf2, 0x9d, 0xaf, 0x66, 0xa1, 0x5c, 0xee, + 0xda, 0x17, 0x5f, 0x3a, 0xac, 0xd6, 0x2f, 0x51, 0x61, 0x6f, 0xc2, 0x99, + 0x59, 0x0d, 0xcd, 0x59, 0xbd, 0x33, 0xb1, 0xb2, 0x71, 0xe5, 0xb2, 0x29, + 0x6d, 0x11, 0xd7, 0xdc, 0x22, 0x62, 0x07, 0x36, 0x6d, 0xc9, 0x00, 0x3f, + 0x35, 0x62, 0xaf, 0x34, 0x89, 0x1d, 0x99, 0x2c, 0xae, 0x1b, 0x22, 0xca, + 0x6e, 0xad, 0x11, 0x17, 0xeb, 0x35, 0x45, 0x6a, 0x2a, 0x74, 0xae, 0x07, + 0xa6, 0xfe, 0x87, 0xfc, 0x44, 0x00, 0xf5, 0x40, 0x5f, 0x2e, 0x59, 0xb3, + 0xc1, 0xc6, 0x0c, 0x4f, 0x51, 0x7a, 0x80, 0x2c, 0x98, 0x30, 0xce, 0xd2, + 0x41, 0xce, 0x24, 0x40, 0xbd, 0xc5, 0x63, 0x1b, 0x08, 0xa2, 0xe5, 0x9b, + 0xf3, 0x80, 0x0d, 0x47, 0x16, 0x15, 0x47, 0x49, 0x9e, 0x89, 0x6e, 0x12, + 0xb1, 0x26, 0x80, 0x8b, 0x3f, 0x2c, 0x52, 0xd2, 0xc9, 0x29, 0x79, 0x2f, + 0x99, 0xe9, 0xbf, 0x44, 0x19, 0x58, 0x26, 0x3b, 0xad, 0xef, 0x1d, 0x80, + 0xfa, 0xc4, 0x8e, 0xfc, 0xd7, 0x8b, 0x5e, 0x6c, 0x41, 0x27, 0x9d, 0x56, + 0x24, 0x00, 0xbb, 0x98, 0x2e, 0x41, 0x01, 0x86, 0x0a, 0x21, 0x5b, 0xee, + 0xd8, 0xb4, 0xce, 0x6a, 0x21, 0x2a, 0xfa, 0xe0, 0xda, 0xcd, 0x6f, 0x04, + 0x32, 0xae, 0x47, 0xb7, 0x56, 0x1f, 0x6e, 0x4f, 0xbc, 0xde, 0xec, 0x7c, + 0xbc, 0x50, 0xed, 0x16, 0x8c, 0x39, 0x4f, 0x6d, 0xf5, 0x8b, 0xdc, 0x72, + 0x14, 0xcd, 0x0c, 0xd2, 0xba, 0xeb, 0xfa, 0xbc, 0xda, 0x48, 0x15, 0x5d, + 0x43, 0x1e, 0x3f, 0xc0, 0x1d, 0xe7, 0x60, 0x6a, 0x04, 0x13, 0xa5, 0xe2, + 0x94, 0xe9, 0x8b, 0x75, 0xd6, 0x68, 0x0c, 0xe9, 0x28, 0xd8, 0x8b, 0x2d, + 0xc5, 0x14, 0x6b, 0x04, 0x44, 0x66, 0xbd, 0x64, 0xc0, 0x3e, 0xe7, 0xff, + 0x06, 0x04, 0x61, 0x63, 0x50, 0x31, 0x78, 0x51, 0x2a, 0x4b, 0xa3, 0xa8, + 0x26, 0x8b, 0x00, 0xbd, 0xf4, 0x18, 0xba, 0x26, 0x07, 0x39, 0x4b, 0xee, + 0xa7, 0xaa, 0x81, 0xc3, 0x34, 0x34, 0xd1, 0x25, 0xcd, 0x48, 0xe7, 0xbb, + 0x40, 0x16, 0x7a, 0x46, 0xb5, 0x48, 0xd3, 0xbf, 0xf1, 0xad, 0xcc, 0x61, + 0x77, 0xd3, 0x36, 0x22, 0x43, 0xc5, 0x57, 0xae, 0x94, 0x6b, 0x82, 0xcf, + 0x06, 0x88, 0xf5, 0x3c, 0x69, 0x20, 0xbd, 0xba, 0x19, 0xf2, 0x1e, 0x69, + 0x74, 0xd5, 0x95, 0xf0, 0x74, 0x98, 0xaf, 0x84, 0xd8, 0x77, 0x0a, 0xd3, + 0x83, 0x7c, 0x30, 0xdb, 0xad, 0xa0, 0xb3, 0xf7, 0x37, 0xb7, 0xad, 0xe4, + 0xd4, 0xb3, 0x3b, 0x16, 0x39, 0xe7, 0xee, 0xdc, 0x1a, 0x14, 0xb4, 0x51, + 0x54, 0xe8, 0x99, 0x20, 0xd3, 0xc5, 0xa0, 0xd7, 0x50, 0x02, 0xff, 0x86, + 0x85, 0xb9, 0x5c, 0x73, 0x3a, 0xd7, 0x3b, 0xc1, 0x36, 0x6e, 0xed, 0xb9, + 0x9e, 0x58, 0x2b, 0x5c, 0x4e, 0x7c, 0x3c, 0x8e, 0x10, 0x7b, 0x4d, 0x12, + 0x78, 0xe0, 0xde, 0x9b, 0x85, 0x37, 0xfb, 0x69, 0xc9, 0xe5, 0x64, 0xdd, + 0xdd, 0xac, 0x02, 0xd8, 0x4a, 0x67, 0xdd, 0x09, 0xab, 0x42, 0xb2, 0xd9, + 0x96, 0xaf, 0x55, 0x3a, 0x3f, 0x67, 0xf6, 0x24, 0x76, 0xbc, 0xc6, 0x13, + 0xd3, 0xf5, 0xe8, 0x79, 0x8d, 0x3c, 0xd5, 0x35, 0x72, 0x87, 0xe7, 0xfe, + 0x83, 0x8b, 0xea, 0xab, 0xb5, 0x0f, 0x99, 0xe4, 0x53, 0x1b, 0x1f, 0xaf, + 0x49, 0x75, 0x87, 0x7c, 0x69, 0x04, 0xfc, 0x81, 0xad, 0xd2, 0x8e, 0x2c, + 0x10, 0x39, 0xc7, 0xa6, 0xb5, 0xf9, 0x45, 0x43, 0x9a, 0x17, 0x29, 0xc7, + 0x66, 0xc6, 0xa7, 0xb6, 0xed, 0x29, 0xde, 0x61, 0x96, 0x95, 0xc7, 0x5c, + 0x06, 0x26, 0x7b, 0xa7, 0xcd, 0x05, 0x91, 0x50, 0x88, 0x9a, 0xbf, 0xdd, + 0x1d, 0x96, 0x4d, 0x50, 0x50, 0xb2, 0x65, 0x2a, 0x5f, 0xc9, 0x36, 0x6d, + 0x00, 0xd8, 0xf1, 0xe4, 0xcc, 0xe0, 0x32, 0xef, 0xa7, 0x62, 0x80, 0xb4, + 0x07, 0xc6, 0x16, 0xa4, 0x44, 0x30, 0xae, 0x00, 0x20, 0x3c, 0xd0, 0x20, + 0x31, 0xed, 0xd1, 0x3a, 0xc4, 0x77, 0x8d, 0x8d, 0x02, 0x3b, 0x39, 0x46, + 0x0d, 0x4d, 0xb7, 0x31, 0xaa, 0x5d, 0x05, 0x44, 0xd4, 0x27, 0x57, 0x4e, + 0x00, 0x04, 0x74, 0x00, 0x23, 0x0e, 0x69, 0xe4, 0x00, 0xa0, 0xa7, 0x44, + 0xa6, 0x98, 0xcf, 0x9e, 0x68, 0x07, 0x4b, 0x64, 0x04, 0xe5, 0x9e, 0x82, + 0xcc, 0xbe, 0x86, 0xce, 0xb9, 0x21, 0xcf, 0x33, 0xc4, 0x34, 0x90, 0x21, + 0x5e, 0x67, 0x75, 0x4e, 0x11, 0x5b, 0x11, 0x47, 0x27, 0x95, 0xd0, 0x08, + 0xa3, 0x20, 0x9f, 0x9c, 0xa3, 0xc4, 0xeb, 0x69, 0x48, 0xf3, 0x0e, 0xc9, + 0xb2, 0x55, 0x9f, 0xe2, 0x76, 0xbb, 0xd8, 0x47, 0xbe, 0x32, 0x90, 0xfa, + 0x88, 0x37, 0x2a, 0xe3, 0x7a, 0x48, 0x62, 0xf7, 0x81, 0xc2, 0x2e, 0x29, + 0x64, 0x17, 0xa2, 0xa1, 0x7c, 0xe4, 0xce, 0x56, 0x26, 0x05, 0x7c, 0x01, + 0x8c, 0xb8, 0x40, 0x4c, 0x19, 0xdd, 0xc7, 0xf2, 0xb5, 0x03, 0x23, 0x45, + 0x3f, 0x10, 0x73, 0xa3, 0x19, 0x45, 0x92, 0x12, 0x04, 0xcd, 0x60, 0xaa, + 0x78, 0x4e, 0x22, 0x8c, 0x14, 0x0e, 0x84, 0x3f, 0x83, 0x5c, 0x87, 0x1d, + 0xf3, 0x57, 0xec, 0x4b, 0x60, 0xa9, 0xa1, 0xb8, 0x33, 0xa4, 0x73, 0xa3, + 0x7e, 0xe8, 0x42, 0x52, 0xa1, 0x7a, 0x00, 0x38, 0xd1, 0x28, 0x21, 0xdd, + 0x63, 0x89, 0x79, 0xb1, 0x25, 0x1d, 0x3d, 0xdc, 0x8c, 0x62, 0xa2, 0x28, + 0x1a, 0x7a, 0x0b, 0xca, 0x55, 0x4c, 0x34, 0x0d, 0x21, 0xf6, 0x0a, 0xf3, + 0x9f, 0x47, 0x4c, 0x64, 0x0f, 0x76, 0x10, 0xf3, 0x61, 0x48, 0x16, 0x36, + 0x40, 0xe2, 0x8c, 0x0f, 0x71, 0x88, 0x75, 0x2b, 0xe4, 0x36, 0x06, 0xab, + 0x56, 0x9c, 0x84, 0x34, 0xcf, 0x53, 0x2a, 0xd1, 0x6f, 0x86, 0x2e, 0x5c, + 0x79, 0x82, 0x16, 0x87, 0x3e, 0xe4, 0xa1, 0x47, 0x3f, 0x23, 0xa6, 0xc0, + 0xe8, 0xe8, 0x7e, 0x56, 0x92, 0x3e, 0xaa, 0x76, 0x5a, 0x9a, 0x4e, 0x72, + 0xae, 0xd0, 0x92, 0x9d, 0xaf, 0x50, 0x62, 0x72, 0x8e, 0xdc, 0x35, 0xba, + 0x15, 0x94, 0xe0, 0x3b, 0x8a, 0x75, 0x2a, 0x51, 0xb5, 0xd2, 0x81, 0xac, + 0x4c, 0xc3, 0x28, 0x2c, 0x84, 0x42, 0xa8, 0x6e, 0xfb, 0x62, 0x21, 0xbc, + 0xa0, 0x99, 0xc0, 0x79, 0xee, 0x83, 0x52, 0x68, 0xce, 0x6d, 0x19, 0x73, + 0x95, 0x8f, 0xe7, 0xf3, 0x94, 0xd9, 0xd2, 0x91, 0x3c, 0xe8, 0x55, 0xe1, + 0x18, 0x76, 0xe2, 0x68, 0x23, 0xe6, 0x8d, 0xc4, 0x39, 0xdf, 0x70, 0xd9, + 0x9f, 0x2c, 0xf4, 0x61, 0x7d, 0x29, 0x9a, 0x63, 0xc7, 0x6c, 0x25, 0x65, + 0x91, 0x8f, 0xd6, 0x37, 0xe4, 0x2a, 0x2a, 0x4f, 0x9b, 0x50, 0xd6, 0x79, + 0x59, 0xdf, 0xb8, 0xb0, 0xd5, 0xda, 0x55, 0xed, 0x42, 0x9a, 0xac, 0x6b, + 0x35, 0x5e, 0xd8, 0x58, 0xcc, 0xc7, 0xb2, 0x90, 0xa7, 0x8b, 0x78, 0x20, + 0xee, 0xa6, 0x52, 0xe3, 0x05, 0x1c, 0x6f, 0xbb, 0x80, 0x93, 0x2f, 0x6b, + 0x56, 0xb8, 0xe0, 0xca, 0x53, 0x3a, 0x89, 0x29, 0x9d, 0x2e, 0xc9, 0x7b, + 0x3e, 0xc2, 0x7f, 0xda, 0xec, 0x22, 0xdc, 0xac, 0x71, 0xe1, 0x2b, 0x5d, + 0x58, 0x38, 0xfa, 0x90, 0xf8, 0x08, 0x05, 0x04, 0xe4, 0xec, 0x06, 0xbd, + 0xf0, 0x78, 0x3f, 0x02, 0x45, 0x4e, 0xe3, 0x0b, 0x63, 0x81, 0x8f, 0x4a, + 0xea, 0x34, 0x64, 0x22, 0xf6, 0xfb, 0x21, 0x2f, 0x18, 0xa9, 0xd4, 0xf0, + 0x87, 0x1a, 0x5d, 0x21, 0xec, 0xfc, 0x0a, 0x21, 0x5c, 0x83, 0x2c, 0x25, + 0x51, 0x9b, 0xa8, 0xf1, 0x35, 0xbd, 0x36, 0xaa, 0xfa, 0x5d, 0x5e, 0x63, + 0xae, 0xa5, 0x4b, 0x0c, 0xcf, 0x72, 0xef, 0x78, 0x2f, 0xc0, 0x65, 0xee, + 0xa0, 0x10, 0x0a, 0x3a, 0xfa, 0x86, 0xfe, 0x4c, 0x80, 0x1d, 0xdd, 0x0a, + 0xbf, 0xd4, 0x9f, 0xa6, 0x6f, 0x26, 0xbb, 0xe5, 0x66, 0x6d, 0xe3, 0x81, + 0xb1, 0xd9, 0xd1, 0x7f, 0xf3, 0x13, 0xf9, 0xff, 0x73, 0x1f, 0x46, 0xdf, + 0x9c, 0xf4, 0xe1, 0x4c, 0x43, 0x3b, 0x29, 0x9b, 0x53, 0x61, 0x32, 0x1b, + 0x0f, 0x89, 0x56, 0x93, 0xcb, 0xe1, 0xb8, 0x6b, 0xe5, 0xf2, 0xaa, 0x96, + 0x67, 0x8c, 0x70, 0x5c, 0xe7, 0x2e, 0x99, 0xaa, 0x2b, 0xc4, 0x84, 0x78, + 0x8c, 0x00, 0xb6, 0x5e, 0xf8, 0x86, 0x38, 0x0e, 0x60, 0xff, 0x9d, 0xa6, + 0xf9, 0xa5, 0xe8, 0x4c, 0x7e, 0x70, 0xa9, 0x37, 0x27, 0x57, 0xcf, 0x66, + 0x67, 0x84, 0xe3, 0x7d, 0xdd, 0xd9, 0x8e, 0x22, 0xaf, 0x9e, 0xeb, 0x78, + 0x68, 0xdc, 0xff, 0xa1, 0x0e, 0xe2, 0xaf, 0x71, 0xa6, 0xf3, 0x49, 0x2e, + 0x0b, 0x3e, 0x23, 0x1d, 0xdd, 0xfb, 0x75, 0x47, 0xf7, 0xa9, 0xd8, 0x5b, + 0x3d, 0xe4, 0xed, 0xf9, 0x5f, 0xa9, 0xe4, 0xad, 0xd1, 0xf0, 0x0e, 0x26, + 0x1d, 0x4f, 0x95, 0xbc, 0x89, 0x86, 0x77, 0xb6, 0xbb, 0xf6, 0xec, 0x0a, + 0x89, 0x5d, 0x80, 0xe8, 0xea, 0x2e, 0xc4, 0x3b, 0x78, 0x77, 0x88, 0xd6, + 0x05, 0x6d, 0xa6, 0xd2, 0x1c, 0xcf, 0x76, 0xad, 0xea, 0xe2, 0x79, 0xa9, + 0x97, 0x1f, 0xc2, 0x4d, 0x12, 0x3b, 0xfe, 0xcf, 0x4c, 0x02, 0x96, 0xb2, + 0xc8, 0x63, 0x7a, 0x42, 0x13, 0xe1, 0x08, 0x18, 0xf4, 0x48, 0x24, 0xf5, + 0x5f, 0x5e, 0x0a, 0x3f, 0xcb, 0xd5, 0x67, 0xb9, 0xfa, 0x2c, 0x57, 0x9f, + 0x90, 0x5c, 0xbd, 0x2b, 0x93, 0x0f, 0x48, 0x35, 0xdb, 0x97, 0xeb, 0xe3, + 0x56, 0xba, 0xb6, 0xad, 0xbe, 0x78, 0x54, 0x53, 0xcd, 0x27, 0x32, 0x49, + 0x89, 0x89, 0x36, 0xe8, 0x6a, 0x88, 0xd7, 0x8a, 0x6e, 0x97, 0x2f, 0x16, + 0x79, 0xfb, 0x95, 0x1b, 0xf7, 0x1a, 0xcc, 0xd4, 0xe0, 0xac, 0x9e, 0xdc, + 0x70, 0x31, 0x59, 0x66, 0x3c, 0x2e, 0xc6, 0x8a, 0x8a, 0x28, 0x4c, 0x29, + 0x61, 0x05, 0x03, 0xac, 0x40, 0x78, 0xb0, 0xd9, 0xa9, 0xdb, 0xe3, 0xae, + 0x2d, 0xb8, 0x67, 0xe9, 0x46, 0x6f, 0xb4, 0x92, 0x67, 0x61, 0x1e, 0x03, + 0xd8, 0xb4, 0x0a, 0xa8, 0x96, 0x59, 0x60, 0x6a, 0x60, 0x50, 0x24, 0x63, + 0x80, 0x96, 0xc3, 0x1e, 0x42, 0x7b, 0x00, 0x47, 0xe1, 0x7f, 0xcb, 0x35, + 0xde, 0xeb, 0x35, 0xf4, 0xb2, 0xab, 0x2b, 0x24, 0xbb, 0x08, 0x4c, 0x68, + 0x4d, 0x72, 0xcd, 0x1e, 0x6d, 0xef, 0x80, 0x56, 0x02, 0x19, 0xca, 0xe7, + 0x7e, 0x5f, 0xa0, 0x18, 0x46, 0x21, 0x0b, 0x25, 0xf0, 0xd1, 0xa5, 0x44, + 0x18, 0xf5, 0x74, 0x9d, 0xa4, 0xc1, 0x20, 0x6e, 0xa6, 0x7d, 0x20, 0x22, + 0x47, 0x0a, 0xfe, 0xdc, 0xc3, 0x51, 0x44, 0x6b, 0x95, 0x29, 0x5a, 0x4e, + 0x9f, 0x80, 0xd9, 0x48, 0x3d, 0x52, 0xb5, 0x6c, 0xeb, 0x83, 0x23, 0xaa, + 0xe0, 0x45, 0x55, 0x64, 0xd2, 0x7e, 0xa5, 0xc1, 0x14, 0x8a, 0xa9, 0xad, + 0x58, 0x72, 0x7f, 0xc2, 0x38, 0x83, 0x27, 0x61, 0x67, 0x2b, 0x9b, 0x4c, + 0x04, 0xdd, 0x68, 0xb2, 0x5e, 0xaa, 0x30, 0x17, 0x5d, 0x99, 0x9f, 0xff, + 0x88, 0x8c, 0xc4, 0xfb, 0xfa, 0x11, 0xf9, 0x14, 0x92, 0xf2, 0xd3, 0xc8, + 0x66, 0x39, 0x6f, 0x02, 0x12, 0x29, 0xd3, 0x39, 0xb3, 0x02, 0x2e, 0x3f, + 0x67, 0xb8, 0xe7, 0x54, 0x61, 0x48, 0x48, 0xc6, 0x46, 0x5e, 0x85, 0xa3, + 0x1c, 0xaa, 0xbe, 0x09, 0x4b, 0xec, 0xb6, 0x19, 0x85, 0x26, 0x10, 0xe0, + 0x3a, 0x6f, 0x81, 0x56, 0x21, 0x59, 0x46, 0x89, 0x74, 0xad, 0xe4, 0x78, + 0xc8, 0x27, 0x8b, 0xeb, 0xba, 0x2a, 0xaf, 0x0d, 0x1a, 0x3b, 0xe9, 0x79, + 0x50, 0xd7, 0x96, 0x30, 0xac, 0xd1, 0xac, 0xe8, 0xc4, 0x25, 0x96, 0x5d, + 0x01, 0x69, 0xef, 0x16, 0x62, 0x51, 0xd7, 0x55, 0xf3, 0x50, 0x72, 0x3b, + 0x5f, 0x57, 0x3a, 0xcc, 0xca, 0x4e, 0x73, 0xd7, 0x33, 0xcc, 0x27, 0xeb, + 0x92, 0x5d, 0x93, 0x66, 0xc2, 0x96, 0xfc, 0xa1, 0xd3, 0x91, 0x84, 0xf5, + 0xb7, 0x73, 0x9d, 0x1c, 0x9b, 0x96, 0xb7, 0x74, 0xd9, 0x9a, 0x90, 0x88, + 0x0a, 0x41, 0xce, 0xa0, 0xa8, 0x77, 0xcc, 0x08, 0x91, 0x92, 0x90, 0xa2, + 0xe3, 0x6c, 0x2e, 0x73, 0xb4, 0x7e, 0x59, 0x12, 0x50, 0x86, 0x6e, 0x3b, + 0x54, 0x62, 0x51, 0x0e, 0x09, 0xcc, 0x36, 0x85, 0x12, 0x1e, 0x08, 0xea, + 0x67, 0x95, 0x3c, 0x2d, 0x9f, 0xe3, 0x6f, 0xcd, 0x5c, 0x83, 0xcc, 0x07, + 0xb1, 0x42, 0xa3, 0x43, 0xce, 0xc5, 0xdc, 0x7f, 0xbb, 0x9b, 0x82, 0x72, + 0x75, 0x25, 0x75, 0x84, 0xab, 0x3a, 0x79, 0x09, 0x69, 0xcf, 0x22, 0x26, + 0xbe, 0x5e, 0xab, 0xf9, 0xce, 0xa3, 0xdd, 0xf0, 0x2c, 0x5c, 0x13, 0xcb, + 0xa3, 0x1c, 0xa2, 0x4a, 0x8f, 0x22, 0x07, 0xa3, 0x9c, 0x7b, 0x44, 0x42, + 0x05, 0x50, 0x17, 0xe7, 0x5d, 0x73, 0xad, 0x4d, 0xeb, 0x56, 0x64, 0x33, + 0x7b, 0xa8, 0x1d, 0xfb, 0xe8, 0xca, 0xc0, 0x82, 0xd9, 0x39, 0x83, 0x39, + 0x63, 0x6e, 0x19, 0x4d, 0x4e, 0xbb, 0x10, 0x26, 0xee, 0x64, 0x47, 0x07, + 0x54, 0x28, 0xba, 0x36, 0x92, 0xca, 0xce, 0x8c, 0x3c, 0x9c, 0xe2, 0x4c, + 0x2a, 0x25, 0xaa, 0x1e, 0xee, 0x89, 0x06, 0x7c, 0xff, 0xde, 0x48, 0xe3, + 0xd0, 0xbc, 0x5d, 0x4d, 0x2b, 0x92, 0xb2, 0x88, 0x6a, 0x34, 0x90, 0x20, + 0x01, 0x4b, 0x44, 0x53, 0x88, 0xa6, 0x6c, 0xd6, 0x18, 0x48, 0xf7, 0x01, + 0x1d, 0xec, 0x8a, 0x4e, 0xe8, 0x8a, 0xbf, 0x6f, 0xa8, 0x09, 0x72, 0x5e, + 0x32, 0x70, 0x52, 0xf5, 0x2e, 0x35, 0x03, 0x5f, 0x52, 0x7a, 0x02, 0x59, + 0xe0, 0x6f, 0xb1, 0x1f, 0x7f, 0x07, 0x7c, 0x4f, 0x5c, 0x4e, 0x5e, 0x2d, + 0x6f, 0xc8, 0x33, 0x31, 0x65, 0x4f, 0x6d, 0xb7, 0xc8, 0x5c, 0xe6, 0xca, + 0x5f, 0x45, 0x65, 0x0e, 0x5a, 0xd0, 0xc1, 0x96, 0xbc, 0xad, 0x3d, 0x5a, + 0x80, 0x28, 0x99, 0x07, 0x93, 0x9a, 0x03, 0xc1, 0xe7, 0x07, 0x64, 0x1f, + 0x46, 0x26, 0x44, 0xa4, 0xcb, 0x3a, 0x10, 0x95, 0x69, 0x6b, 0xeb, 0x24, + 0xcb, 0x39, 0xfd, 0xc6, 0x4d, 0x4b, 0x0d, 0x93, 0x0f, 0x5f, 0x33, 0x94, + 0x1e, 0x7d, 0xee, 0x85, 0xd8, 0x58, 0x31, 0xba, 0x8e, 0xbf, 0x6c, 0xb7, + 0xe5, 0x38, 0x99, 0xdf, 0x42, 0x5b, 0x0f, 0xb5, 0x29, 0x36, 0xbe, 0x2b, + 0xfc, 0x4f, 0x72, 0xae, 0x7b, 0x41, 0x53, 0x7d, 0x48, 0xf2, 0x72, 0x58, + 0x42, 0xb7, 0xca, 0xf4, 0xb7, 0x8a, 0x75, 0x1c, 0xa3, 0x99, 0x4e, 0x58, + 0xc4, 0xcf, 0xd9, 0x42, 0x65, 0x3e, 0xf1, 0x3c, 0x95, 0xae, 0x29, 0x53, + 0x9d, 0x93, 0x67, 0x59, 0x7d, 0x66, 0x7b, 0xf8, 0x1f, 0x77, 0xc4, 0x6e, + 0x46, 0x68, 0x8f, 0xe9, 0x7d, 0x31, 0x29, 0x6f, 0x5b, 0x8b, 0x0f, 0x7f, + 0x7c, 0xe6, 0x36, 0x7b, 0xbc, 0xdc, 0x66, 0x82, 0xa5, 0xe3, 0x53, 0xb1, + 0x9b, 0xfd, 0xe3, 0x99, 0xdd, 0xec, 0x4e, 0x77, 0xbd, 0x9c, 0x4e, 0x40, + 0xbb, 0x05, 0x9a, 0xb0, 0x69, 0x55, 0x73, 0x6a, 0xa3, 0x25, 0xd6, 0x32, + 0x2d, 0x52, 0x40, 0x6f, 0xd2, 0xc1, 0xd6, 0xcc, 0x27, 0x0b, 0xf1, 0x67, + 0x53, 0xb2, 0xb3, 0xae, 0x99, 0x8e, 0x23, 0x16, 0xe3, 0xcb, 0xdc, 0xea, + 0xd4, 0xa6, 0x9a, 0x49, 0x22, 0x85, 0x12, 0x00, 0x02, 0xd8, 0x76, 0xd7, + 0x68, 0x4a, 0x89, 0x74, 0x4d, 0xed, 0xce, 0x5d, 0x49, 0xd5, 0x04, 0xd3, + 0xb6, 0x33, 0xee, 0xc2, 0x1c, 0x1d, 0x45, 0x65, 0x1d, 0x5f, 0x0d, 0x1f, + 0x85, 0xbe, 0x0a, 0xbb, 0xda, 0x75, 0x4b, 0xe9, 0x9e, 0x42, 0xa8, 0xcb, + 0xe0, 0xea, 0x95, 0xbf, 0xcc, 0x05, 0x5e, 0xa9, 0xfc, 0x00, 0x39, 0xbe, + 0x36, 0x88, 0x74, 0x8e, 0x5d, 0xd5, 0x5c, 0x17, 0x79, 0xe3, 0x75, 0x39, + 0x9a, 0x94, 0xe7, 0x6c, 0x17, 0xcb, 0xf1, 0xa0, 0xab, 0xce, 0x9d, 0x5c, + 0xb5, 0xef, 0x28, 0x49, 0x1e, 0xf1, 0xf1, 0x52, 0xb4, 0xa7, 0x66, 0x00, + 0xe7, 0xb6, 0x39, 0x98, 0xbe, 0x93, 0x92, 0xe4, 0xdc, 0x3d, 0xa3, 0x0a, + 0x19, 0x33, 0x31, 0xed, 0x68, 0x1f, 0x7c, 0xb3, 0x3b, 0x2b, 0xa9, 0x55, + 0x90, 0x7d, 0xa6, 0x69, 0x7b, 0x16, 0x5d, 0x90, 0x33, 0xa2, 0x99, 0xae, + 0x64, 0xc6, 0x59, 0xa2, 0x51, 0x3b, 0xf3, 0x56, 0x70, 0xde, 0x34, 0x47, + 0x26, 0xa9, 0xf6, 0x09, 0xf6, 0xe7, 0x66, 0x67, 0x75, 0x77, 0x49, 0x50, + 0xc9, 0x7e, 0x2d, 0x3f, 0x0a, 0xe5, 0x4a, 0x4c, 0x44, 0x5c, 0x71, 0xaa, + 0x00, 0xfb, 0x0f, 0x42, 0xe2, 0x9d, 0x76, 0x9c, 0x59, 0xf2, 0x27, 0xa5, + 0x6f, 0x59, 0x18, 0xec, 0x90, 0x8f, 0x24, 0x12, 0x85, 0x2e, 0x75, 0x64, + 0x63, 0xc9, 0x33, 0xd3, 0x56, 0xf6, 0x52, 0x68, 0x85, 0x58, 0x89, 0x7d, + 0xc1, 0x7a, 0x91, 0x9c, 0x3c, 0x7d, 0x44, 0x1b, 0x0e, 0x45, 0x93, 0xcc, + 0x2d, 0xf4, 0x9b, 0x34, 0x02, 0xcf, 0xc3, 0x42, 0xf8, 0xe6, 0xdb, 0x46, + 0xc8, 0x8a, 0x29, 0xd1, 0x5b, 0x66, 0xa7, 0x6c, 0xd5, 0x6f, 0x63, 0xf9, + 0x0a, 0x22, 0x07, 0xe8, 0x2b, 0x06, 0x76, 0x93, 0xfd, 0x97, 0xa0, 0xfb, + 0xe8, 0x97, 0x78, 0xb1, 0xc5, 0x70, 0x8d, 0x7f, 0xa9, 0x5d, 0x7e, 0xd6, + 0x97, 0xdc, 0x7f, 0x94, 0x23, 0x5a, 0x13, 0x84, 0xe3, 0xcc, 0xe8, 0xd9, + 0x1d, 0xa6, 0xc4, 0x39, 0x89, 0x78, 0xd9, 0x29, 0xe8, 0xcf, 0x4e, 0xb9, + 0x3c, 0xae, 0x46, 0x12, 0x73, 0x2e, 0x3f, 0x41, 0x76, 0x6a, 0x4e, 0x07, + 0x01, 0x1f, 0x35, 0x0f, 0x4d, 0xc1, 0x90, 0xfd, 0xcb, 0xc2, 0xd7, 0xcc, + 0x41, 0x3e, 0xbc, 0x51, 0x2d, 0xcf, 0x2c, 0xe4, 0xb4, 0x82, 0xc9, 0x34, + 0x06, 0xef, 0x08, 0x31, 0x0b, 0x6c, 0x35, 0xfb, 0x80, 0xd0, 0x09, 0x0d, + 0xa6, 0xed, 0x04, 0xdf, 0x05, 0x76, 0x71, 0x61, 0x88, 0x0f, 0x5c, 0xd0, + 0x87, 0xbe, 0xa4, 0xda, 0xc0, 0xb6, 0xca, 0xc6, 0x38, 0x72, 0xc4, 0xf1, + 0xcf, 0x1d, 0x27, 0xea, 0x24, 0xcf, 0x6d, 0x19, 0xaf, 0x51, 0xe2, 0x6f, + 0x7a, 0x86, 0x04, 0x99, 0x1f, 0x26, 0x27, 0x7f, 0xa7, 0xf8, 0x95, 0xa0, + 0x3b, 0x7a, 0x78, 0x43, 0x25, 0x2d, 0x00, 0x23, 0xc9, 0x84, 0x33, 0xe3, + 0xbc, 0xb3, 0x42, 0x00, 0x47, 0xbd, 0xd2, 0xf0, 0xe1, 0x82, 0x00, 0xaf, + 0x1a, 0x7e, 0x48, 0x46, 0xfe, 0x5c, 0xa3, 0xd4, 0x07, 0xe5, 0x86, 0x45, + 0x38, 0xee, 0x86, 0x94, 0xce, 0xbd, 0xf8, 0xf8, 0xe0, 0xed, 0x96, 0xdc, + 0x7c, 0x31, 0x75, 0xf3, 0xba, 0x4e, 0x5e, 0x64, 0x7a, 0x1b, 0x09, 0x87, + 0x1a, 0x84, 0x05, 0x19, 0x43, 0x3a, 0x8e, 0x97, 0xa8, 0xdf, 0x54, 0x3b, + 0x74, 0xf3, 0x8c, 0x38, 0x1b, 0x11, 0x8a, 0x03, 0x65, 0xd0, 0xe9, 0xa9, + 0x06, 0xaa, 0xde, 0xc8, 0xb7, 0xfe, 0x9e, 0xf0, 0x9f, 0xae, 0x31, 0x53, + 0x4a, 0x0a, 0x71, 0x94, 0x66, 0x69, 0x76, 0xb0, 0x74, 0x34, 0x25, 0x0b, + 0xa7, 0xca, 0x94, 0xa8, 0xfd, 0x62, 0x8b, 0x49, 0x96, 0x1f, 0x3b, 0x9b, + 0x6e, 0x4b, 0xda, 0xa5, 0xc6, 0x27, 0xc8, 0x0c, 0xcf, 0x85, 0xf9, 0x36, + 0xe7, 0x81, 0xcd, 0xca, 0x8d, 0x65, 0xfd, 0xc4, 0xa5, 0xa0, 0x1c, 0x1e, + 0xee, 0x52, 0xb1, 0x71, 0xa9, 0x29, 0xa4, 0xc2, 0xcd, 0x9f, 0x3f, 0x39, + 0xdc, 0x78, 0x6a, 0x46, 0x20, 0x08, 0x20, 0x04, 0xec, 0x6d, 0xd7, 0x43, + 0x98, 0x75, 0x83, 0xf3, 0xd6, 0x34, 0x4b, 0xeb, 0x82, 0x49, 0x64, 0x48, + 0x22, 0xd8, 0x0f, 0x35, 0x90, 0x69, 0x01, 0x26, 0x10, 0x6c, 0x89, 0x16, + 0x19, 0xec, 0x28, 0x06, 0x08, 0x25, 0x30, 0x00, 0x03, 0x81, 0x73, 0x0a, + 0xf1, 0x81, 0x07, 0x04, 0x57, 0x81, 0xdc, 0x50, 0x24, 0x07, 0x3c, 0x49, + 0x11, 0xb5, 0x95, 0x3b, 0x52, 0x53, 0x23, 0xcd, 0x3a, 0x72, 0xa0, 0x84, + 0x45, 0xdc, 0x8e, 0x07, 0x11, 0xc6, 0xa0, 0x4d, 0x88, 0xfd, 0x05, 0xee, + 0x0e, 0xb4, 0x51, 0x50, 0xd6, 0x66, 0x4a, 0xa5, 0xea, 0x31, 0x4e, 0x07, + 0xf7, 0xcc, 0x14, 0xbd, 0xba, 0xd9, 0x8d, 0x2b, 0x34, 0xfc, 0x33, 0x16, + 0x05, 0xde, 0x3e, 0x0a, 0x6b, 0x82, 0xb7, 0xc5, 0x68, 0x32, 0x48, 0xf7, + 0x84, 0x46, 0x4d, 0xca, 0xee, 0x48, 0xda, 0x68, 0x64, 0x07, 0x44, 0x02, + 0x5b, 0x0f, 0x43, 0x28, 0x35, 0x6e, 0x47, 0xe4, 0x03, 0xe2, 0x80, 0xfb, + 0x4a, 0x17, 0x52, 0x4a, 0x1b, 0x2e, 0x63, 0xf2, 0xe7, 0x22, 0xb4, 0x15, + 0x0d, 0x2a, 0x67, 0xcc, 0x2a, 0xa5, 0x21, 0x9d, 0x04, 0x97, 0xf3, 0x44, + 0x21, 0x18, 0xa8, 0x18, 0x34, 0x6d, 0x1c, 0xe2, 0x4c, 0x29, 0xc1, 0x04, + 0xd6, 0x89, 0x7e, 0xcf, 0x58, 0xfa, 0x0d, 0xaf, 0x86, 0x8c, 0x83, 0x81, + 0xe2, 0xfd, 0x4b, 0xcf, 0xa9, 0xe3, 0xfb, 0xda, 0x8b, 0x02, 0xe2, 0xac, + 0x2e, 0x96, 0xda, 0x73, 0x4b, 0x4c, 0x01, 0x9c, 0x7c, 0x0a, 0x12, 0xd3, + 0xa2, 0xb4, 0xd7, 0x08, 0x11, 0x45, 0x07, 0xfb, 0x50, 0x7f, 0xa7, 0x4a, + 0x28, 0x9c, 0xe2, 0xe1, 0x57, 0xc6, 0x0f, 0x88, 0x56, 0x6d, 0x09, 0x32, + 0xab, 0x30, 0xed, 0xd7, 0x78, 0x74, 0x68, 0xda, 0x7c, 0xc1, 0xc5, 0x42, + 0x29, 0x32, 0x30, 0xd1, 0xb8, 0xc2, 0x3b, 0xb6, 0x66, 0x70, 0xb6, 0x7e, + 0xcc, 0x78, 0x01, 0x29, 0xd6, 0x26, 0x4e, 0xc1, 0x40, 0x93, 0x12, 0x15, + 0xe4, 0x89, 0xb2, 0x5a, 0x4a, 0x27, 0xd5, 0xdc, 0x2a, 0xc5, 0x4f, 0x38, + 0x6e, 0x65, 0x04, 0x1c, 0x32, 0x21, 0x8b, 0x4a, 0x48, 0xe0, 0xd1, 0x31, + 0x72, 0x68, 0xf8, 0x02, 0xde, 0x3e, 0xb5, 0x76, 0xfd, 0x80, 0x70, 0x9f, + 0xae, 0x7f, 0x15, 0x05, 0xea, 0x3f, 0x15, 0x97, 0x04, 0x4c, 0x74, 0xd0, + 0x78, 0x74, 0x1d, 0xff, 0x47, 0x78, 0x23, 0xaa, 0x40, 0x37, 0x64, 0x4d, + 0x3c, 0xc8, 0xf2, 0x29, 0xd6, 0x01, 0x98, 0xca, 0xc1, 0x88, 0x6e, 0x7c, + 0xe9, 0xf5, 0xc2, 0x34, 0x83, 0xcf, 0xdc, 0x88, 0x1c, 0xc4, 0x1e, 0x9a, + 0x28, 0x1a, 0xa9, 0xf3, 0xf7, 0x92, 0xc0, 0x85, 0xa5, 0x88, 0x70, 0xf1, + 0x13, 0xa9, 0x18, 0xe7, 0x93, 0x54, 0x9f, 0x14, 0x6b, 0xd1, 0x61, 0x44, + 0xd1, 0x28, 0x0c, 0xcf, 0x50, 0x8b, 0x16, 0xdf, 0x16, 0x0f, 0x84, 0x79, + 0x05, 0x3b, 0xa1, 0x23, 0x37, 0x98, 0x38, 0x16, 0xc2, 0xcf, 0xc3, 0x18, + 0x5c, 0x37, 0xd3, 0x70, 0x15, 0xec, 0x75, 0x5b, 0xd7, 0x76, 0xcd, 0x51, + 0xa9, 0x5a, 0x87, 0x31, 0xd9, 0x86, 0x4f, 0x0f, 0xe3, 0xb6, 0x82, 0x7a, + 0xa7, 0x97, 0x06, 0x15, 0x0b, 0xea, 0x02, 0x17, 0xf2, 0xa0, 0xe3, 0x49, + 0x4a, 0x34, 0xad, 0x4d, 0x09, 0x3c, 0xb5, 0xba, 0x93, 0x9b, 0x92, 0x5f, + 0xf3, 0x86, 0x18, 0xd9, 0x9c, 0x43, 0x6d, 0x2e, 0x25, 0xd4, 0x89, 0x8c, + 0x29, 0x19, 0xd7, 0x50, 0xff, 0x87, 0x76, 0x20, 0xba, 0xa4, 0x57, 0xca, + 0x70, 0xc8, 0x2e, 0x0b, 0x52, 0x48, 0xd2, 0x93, 0x8b, 0x9a, 0x94, 0x2a, + 0x0f, 0x16, 0x27, 0x1f, 0x03, 0x68, 0xbc, 0xe9, 0xf1, 0x06, 0xc4, 0xb9, + 0x7f, 0x8d, 0x41, 0x8c, 0xc8, 0xe8, 0x51, 0xe9, 0xcd, 0x42, 0x18, 0x72, + 0x03, 0x9c, 0xa8, 0x2f, 0xf0, 0x42, 0x68, 0x4f, 0xf9, 0xe6, 0xc7, 0x06, + 0x45, 0xfa, 0xc5, 0x66, 0x44, 0x0a, 0x3d, 0x20, 0xb9, 0x6d, 0xdd, 0x42, + 0x3e, 0xf1, 0x2c, 0x6d, 0xbb, 0xae, 0x33, 0x53, 0xf3, 0x5b, 0x68, 0x5b, + 0x91, 0xa2, 0x51, 0x5d, 0xa7, 0x36, 0x97, 0x69, 0x5e, 0x7f, 0xb5, 0x32, + 0x30, 0x75, 0x3b, 0xed, 0xcc, 0x33, 0x4b, 0xe3, 0x9d, 0xb5, 0x08, 0x83, + 0xda, 0x62, 0x69, 0xbc, 0xd8, 0xae, 0x5e, 0x20, 0xc6, 0x1f, 0x90, 0x49, + 0x41, 0x69, 0x4f, 0xce, 0x2b, 0x88, 0xb3, 0x59, 0xf2, 0x5e, 0x19, 0x99, + 0x3d, 0xfd, 0xc2, 0xda, 0x4a, 0x0e, 0xc7, 0x99, 0x85, 0xbc, 0x6d, 0x24, + 0x6c, 0x64, 0xda, 0x6a, 0xdb, 0x01, 0x3f, 0x0f, 0xfa, 0xf4, 0x3c, 0xc1, + 0x3b, 0xbb, 0x8a, 0xda, 0x54, 0x3d, 0xef, 0x98, 0x55, 0x3b, 0x46, 0xe6, + 0x56, 0xaa, 0xae, 0xa8, 0x15, 0xfe, 0x67, 0x31, 0x5b, 0x5c, 0xf0, 0x78, + 0x31, 0x80, 0x93, 0x15, 0x52, 0xc5, 0x95, 0x1b, 0x0e, 0x21, 0xdf, 0xd9, + 0x92, 0x92, 0x6f, 0x30, 0x1d, 0x82, 0xa7, 0xfb, 0xd0, 0x11, 0x66, 0xff, + 0x43, 0xc3, 0x49, 0x9a, 0x6b, 0xb3, 0x7a, 0x06, 0x96, 0xa0, 0xe6, 0xdb, + 0x2d, 0xc3, 0x89, 0x0b, 0x06, 0x70, 0x88, 0x07, 0x74, 0x18, 0x24, 0x67, + 0x14, 0x45, 0xd3, 0x79, 0x45, 0x51, 0x73, 0x0b, 0xed, 0x69, 0x3d, 0xc3, + 0xac, 0xc8, 0xed, 0xad, 0xc9, 0x8b, 0x27, 0x5a, 0x72, 0xae, 0xce, 0x86, + 0x77, 0x3d, 0x40, 0xe5, 0xea, 0xf4, 0x77, 0x97, 0x6e, 0xe3, 0xb7, 0xeb, + 0xf2, 0xdd, 0x4d, 0x4b, 0x5f, 0xba, 0x41, 0x60, 0x42, 0x37, 0x9f, 0xcf, + 0x9e, 0x14, 0x83, 0xd8, 0x0e, 0x25, 0x5d, 0xc7, 0xa5, 0x5b, 0x92, 0x92, + 0x54, 0xd9, 0x63, 0x1a, 0x27, 0x6c, 0xd4, 0xa9, 0x6c, 0x96, 0x6e, 0x4f, + 0x38, 0x4b, 0xb8, 0x91, 0xdb, 0x42, 0x4d, 0xa3, 0x89, 0xae, 0x52, 0x53, + 0xb2, 0x6a, 0x32, 0xa0, 0x74, 0xd5, 0x58, 0x0e, 0x41, 0x2c, 0xf8, 0x3d, + 0xa8, 0x8a, 0x24, 0x4d, 0x4b, 0x44, 0x84, 0x66, 0x01, 0x82, 0xd9, 0x78, + 0x2b, 0x63, 0x0b, 0x5e, 0xf5, 0x63, 0x89, 0x87, 0xc5, 0x4b, 0x14, 0xdd, + 0xc9, 0x8b, 0x55, 0x9d, 0xac, 0x0b, 0x91, 0xfc, 0x74, 0x95, 0x39, 0x48, + 0xed, 0xab, 0xd5, 0xa4, 0xc4, 0x8f, 0xee, 0x4b, 0xa0, 0x2c, 0x18, 0x40, + 0xf0, 0x18, 0x05, 0xe6, 0x4d, 0x88, 0xaa, 0x3d, 0x30, 0x5d, 0x3c, 0x06, + 0xa3, 0x06, 0x02, 0xa3, 0x28, 0x17, 0x4b, 0xfb, 0x18, 0x16, 0x1c, 0x38, + 0x72, 0x0f, 0x63, 0x8a, 0x0a, 0x1f, 0x0b, 0x01, 0xdc, 0x3e, 0x94, 0x44, + 0xf7, 0xd6, 0x17, 0x24, 0x0b, 0x5a, 0x19, 0x3a, 0xa2, 0xef, 0xc4, 0x5e, + 0xb8, 0x02, 0x61, 0xd1, 0x23, 0xdc, 0x9b, 0xa0, 0xc1, 0xc7, 0x2e, 0x35, + 0x69, 0x82, 0x66, 0xb3, 0x03, 0x21, 0x2c, 0x27, 0x73, 0x73, 0x65, 0x7d, + 0xcf, 0x62, 0xe9, 0xf6, 0x62, 0xe9, 0xe7, 0x07, 0x16, 0x4b, 0x3c, 0xe9, + 0x9f, 0x91, 0x68, 0x12, 0x1d, 0xf8, 0xe4, 0x0b, 0x03, 0x83, 0xae, 0x1b, + 0x39, 0x79, 0x56, 0x85, 0xd6, 0x0a, 0x8e, 0xf5, 0x12, 0xfd, 0xca, 0xc1, + 0xe2, 0x15, 0xb8, 0xdd, 0x29, 0x12, 0x0d, 0xdb, 0xe2, 0xb1, 0xf0, 0x2a, + 0xb5, 0xae, 0xa7, 0x72, 0xce, 0x73, 0xc4, 0x3a, 0x1c, 0xd0, 0xbc, 0x49, + 0xde, 0x90, 0x72, 0xb5, 0x47, 0xa1, 0xe5, 0x08, 0x39, 0x8b, 0x72, 0xcf, + 0xb7, 0x95, 0x71, 0x27, 0xc6, 0x5b, 0xdc, 0xb9, 0x07, 0x3f, 0x76, 0xc0, + 0x0a, 0x00, 0x49, 0x3b, 0x5a, 0xef, 0x18, 0xbb, 0x15, 0xf9, 0x48, 0x10, + 0x46, 0xa3, 0x97, 0x2a, 0x59, 0x81, 0x47, 0xb8, 0x68, 0x13, 0xa7, 0x58, + 0x22, 0x66, 0x44, 0x79, 0x21, 0x46, 0xbc, 0x25, 0x5e, 0x63, 0x3b, 0xad, + 0x6e, 0x9d, 0xff, 0xaf, 0x44, 0xee, 0xdc, 0x86, 0xb7, 0x51, 0x71, 0x60, + 0xc6, 0x84, 0x52, 0xb6, 0xd0, 0xea, 0xdf, 0x8e, 0x04, 0xd2, 0xed, 0x25, + 0x7b, 0xe0, 0xdc, 0x7d, 0xbf, 0x58, 0x4b, 0x5a, 0xb0, 0xe2, 0x3d, 0xcc, + 0x2e, 0xff, 0x24, 0x72, 0xe5, 0x5b, 0x31, 0xcd, 0x2f, 0xae, 0xda, 0x44, + 0x06, 0xcb, 0x21, 0xc9, 0xc9, 0xea, 0x74, 0x9f, 0x63, 0x0a, 0xb4, 0x59, + 0xe8, 0x3e, 0x5c, 0xc3, 0xcb, 0x5d, 0xbc, 0x81, 0x99, 0x13, 0x43, 0x32, + 0xe7, 0x55, 0x25, 0x32, 0x1d, 0x9a, 0x84, 0x6a, 0xd0, 0x01, 0x11, 0x37, + 0x1c, 0x7c, 0x1a, 0xab, 0x34, 0x64, 0xbd, 0xa8, 0x64, 0x02, 0xc5, 0xe8, + 0x7e, 0xbb, 0x90, 0x2e, 0x45, 0xb6, 0xfc, 0x09, 0xf0, 0x57, 0x12, 0x33, + 0x62, 0x74, 0x59, 0x33, 0xb0, 0xff, 0x6e, 0x68, 0xd7, 0x1f, 0xaa, 0x0c, + 0xcd, 0x55, 0x4c, 0xcd, 0x90, 0x4f, 0x1d, 0x53, 0x23, 0xe4, 0x33, 0x2f, + 0xab, 0x9d, 0x4b, 0x97, 0xa4, 0x12, 0x6d, 0x62, 0xd6, 0x4b, 0x28, 0xa6, + 0xb6, 0x48, 0xf3, 0xe7, 0xfc, 0x11, 0x97, 0xe6, 0xb9, 0xa0, 0xb0, 0x45, + 0xf4, 0xfb, 0xdc, 0x47, 0xb2, 0x86, 0xd1, 0xba, 0xf2, 0x4a, 0x1f, 0x57, + 0xf4, 0x7c, 0xbf, 0xd0, 0xf3, 0x4f, 0xd2, 0xe3, 0xa7, 0x21, 0xd6, 0x64, + 0xb8, 0x51, 0x81, 0xe5, 0xc0, 0xb6, 0xed, 0x97, 0xb6, 0xf0, 0xb4, 0xda, + 0x20, 0xa1, 0xc2, 0x11, 0xe6, 0xa8, 0xc9, 0xfd, 0x0b, 0x54, 0x42, 0x71, + 0x14, 0xd7, 0x96, 0x10, 0x92, 0xdd, 0x12, 0x32, 0x6c, 0xa5, 0x5c, 0x0a, + 0x40, 0xd9, 0x14, 0x04, 0xd7, 0x28, 0x3c, 0x2e, 0xeb, 0x5e, 0x8e, 0x62, + 0xee, 0xc7, 0x01, 0xf7, 0x05, 0x2e, 0xd5, 0x27, 0xb7, 0x25, 0xde, 0x57, + 0x8a, 0x82, 0xed, 0xbd, 0x25, 0x23, 0x8f, 0x77, 0x9c, 0x73, 0xb2, 0x89, + 0xd2, 0x17, 0x35, 0xab, 0x79, 0x8c, 0x52, 0xec, 0xc6, 0xa0, 0x7f, 0x54, + 0x17, 0xf1, 0x62, 0xd0, 0xac, 0x37, 0xca, 0x08, 0x63, 0x70, 0x89, 0x55, + 0x5e, 0xd8, 0xbc, 0x7e, 0x5b, 0xf2, 0x25, 0x49, 0x71, 0x3a, 0xd3, 0x5e, + 0x5d, 0x24, 0xd9, 0xc2, 0x10, 0x20, 0xb4, 0x88, 0x58, 0x9e, 0x0a, 0xb6, + 0x8b, 0x6e, 0x37, 0x79, 0x31, 0xee, 0x4c, 0xb8, 0x20, 0x07, 0xce, 0xc1, + 0x14, 0x94, 0x78, 0x83, 0xbb, 0xed, 0x60, 0xfc, 0xb0, 0xf6, 0x5c, 0x09, + 0x0d, 0xa9, 0x8b, 0x00, 0xf8, 0xb5, 0x10, 0x2a, 0x40, 0xd9, 0x0c, 0x76, + 0xd2, 0xf3, 0xf9, 0xf1, 0xba, 0x88, 0x4e, 0x56, 0x10, 0x1e, 0x9c, 0xbc, + 0x82, 0xea, 0x02, 0xaa, 0x75, 0x8d, 0x64, 0x57, 0xe8, 0x4e, 0xd5, 0x2b, + 0xc9, 0x45, 0x3c, 0x7e, 0x1e, 0xb0, 0xea, 0xe7, 0x30, 0x9d, 0x11, 0xcf, + 0x0d, 0x78, 0x72, 0x5c, 0xf2, 0x50, 0xc2, 0x73, 0x44, 0x59, 0x87, 0x89, + 0x0a, 0xba, 0xde, 0xf5, 0x7c, 0x03, 0x67, 0xd6, 0xad, 0xdd, 0xf8, 0xcb, + 0x8a, 0x45, 0x40, 0x3e, 0xae, 0x3b, 0x57, 0xf5, 0xa0, 0xc7, 0xf5, 0xaa, + 0xdc, 0xd8, 0x10, 0xb0, 0xf5, 0x97, 0x36, 0xfe, 0xc3, 0xc9, 0x48, 0x31, + 0xbb, 0x2d, 0x63, 0xfc, 0x12, 0x92, 0x35, 0x11, 0x1e, 0x11, 0x50, 0x77, + 0x86, 0x55, 0xc0, 0xe2, 0xbf, 0x8e, 0xeb, 0x38, 0x43, 0x30, 0x38, 0x4a, + 0x94, 0x6d, 0x8a, 0xa5, 0x27, 0xb1, 0xf5, 0x92, 0xd1, 0xf8, 0x88, 0x1a, + 0x26, 0x92, 0xd4, 0x69, 0x66, 0x03, 0xd0, 0xdc, 0xb4, 0x26, 0x68, 0x68, + 0xc1, 0x7b, 0x03, 0x3e, 0x07, 0x0b, 0x78, 0xbb, 0x2d, 0x15, 0x74, 0x9c, + 0x6f, 0xd1, 0x85, 0x63, 0x49, 0x2b, 0x00, 0xd4, 0x6e, 0x14, 0x0f, 0x83, + 0xe4, 0xd6, 0x88, 0x84, 0x21, 0xca, 0x02, 0x80, 0x1f, 0x31, 0xf5, 0x5b, + 0x01, 0x1e, 0x51, 0x89, 0x44, 0xcf, 0x20, 0xaa, 0x06, 0x60, 0x53, 0x4e, + 0xe3, 0x43, 0xce, 0x33, 0x4e, 0x09, 0x9f, 0x6a, 0x7b, 0x67, 0x45, 0x8c, + 0x20, 0xdc, 0xb6, 0xe7, 0x83, 0x40, 0x64, 0x29, 0x79, 0xc3, 0x7a, 0x36, + 0xa2, 0x69, 0x00, 0xef, 0x60, 0xb8, 0x27, 0x6c, 0x3f, 0xb7, 0x70, 0x9d, + 0x07, 0xbe, 0xdb, 0x55, 0xb4, 0x23, 0x77, 0xc2, 0x5c, 0xd2, 0xac, 0xe2, + 0x91, 0xb1, 0x96, 0xdc, 0x42, 0x22, 0x43, 0x32, 0xe0, 0xee, 0x62, 0xed, + 0x74, 0x86, 0x24, 0x2c, 0x19, 0x5f, 0xda, 0x08, 0xbf, 0x19, 0x9b, 0x01, + 0xae, 0x7f, 0xe0, 0x8d, 0x37, 0x64, 0xc7, 0x05, 0xdb, 0x08, 0x6c, 0xae, + 0xc3, 0x98, 0x9d, 0xb1, 0x81, 0xf7, 0x5b, 0xe0, 0xc8, 0x03, 0x0f, 0x0f, + 0x55, 0xd4, 0x2d, 0xa5, 0xf7, 0x7c, 0x18, 0x21, 0xf3, 0x69, 0xc4, 0x9a, + 0x9c, 0x23, 0x78, 0x40, 0x10, 0x9f, 0x8f, 0x6f, 0x99, 0x5a, 0x45, 0x75, + 0x2c, 0x62, 0x4f, 0xda, 0xf3, 0xf9, 0xe7, 0xd8, 0xd0, 0x72, 0xd8, 0x26, + 0xcf, 0xe4, 0xe2, 0x11, 0xf7, 0x38, 0x19, 0xee, 0x09, 0xa0, 0x12, 0x28, + 0x8f, 0x27, 0xa6, 0x15, 0x5e, 0x08, 0x5d, 0x71, 0x4b, 0x6e, 0x68, 0x79, + 0x6f, 0xcb, 0x49, 0x3f, 0x63, 0x6a, 0x96, 0x48, 0x62, 0x89, 0x87, 0xda, + 0xba, 0x1b, 0x97, 0xb4, 0x2d, 0x71, 0x2a, 0x92, 0x2a, 0x08, 0xbf, 0x97, + 0x08, 0x37, 0x98, 0xe2, 0x5d, 0x3e, 0x46, 0x57, 0xee, 0xdf, 0xeb, 0x96, + 0xf0, 0xc9, 0x12, 0xf8, 0x7c, 0xec, 0xc5, 0xdf, 0xca, 0x9c, 0x5f, 0x2a, + 0x34, 0x33, 0xfa, 0x4e, 0x2b, 0x0a, 0xb9, 0xe3, 0x52, 0x42, 0x05, 0x85, + 0x08, 0xda, 0x88, 0x1c, 0x4d, 0xa0, 0x59, 0x39, 0x58, 0xbe, 0xd6, 0x17, + 0x9f, 0x6e, 0xdf, 0x4e, 0xa5, 0x63, 0x42, 0x67, 0xbc, 0x9e, 0xcb, 0xd7, + 0x59, 0x2b, 0x44, 0x0c, 0xc2, 0xf5, 0xb5, 0x81, 0x4d, 0x9f, 0x05, 0x72, + 0xe2, 0xe1, 0xce, 0xb4, 0x5f, 0xf3, 0xa6, 0x48, 0xb7, 0xce, 0x6b, 0x3d, + 0x33, 0x5c, 0x4c, 0x95, 0x71, 0xae, 0xe1, 0xe9, 0x9d, 0x23, 0xef, 0xee, + 0xfa, 0x1c, 0x89, 0x1c, 0xf9, 0xc1, 0x41, 0x3e, 0xba, 0x04, 0xf9, 0x70, + 0xae, 0xca, 0x91, 0x83, 0x65, 0x1c, 0x22, 0x02, 0x4a, 0x77, 0x79, 0x94, + 0x7f, 0xb7, 0x35, 0x40, 0xd7, 0x57, 0xbf, 0x6f, 0xfd, 0x11, 0xd1, 0xdb, + 0xec, 0x57, 0x2e, 0x60, 0x12, 0xfb, 0x91, 0x31, 0xe7, 0xd8, 0x9e, 0xe2, + 0x5b, 0x90, 0x1e, 0xf9, 0x8c, 0x20, 0x68, 0x68, 0x14, 0xf6, 0xbb, 0xe5, + 0x13, 0x4a, 0x55, 0x92, 0x40, 0xfd, 0xb1, 0x38, 0xa1, 0xd9, 0xd8, 0xc0, + 0x84, 0xd2, 0x55, 0x11, 0x99, 0x6d, 0x77, 0x25, 0x9f, 0x5a, 0x70, 0x2c, + 0x72, 0x57, 0x11, 0xa1, 0x5e, 0x92, 0x9d, 0x60, 0xc7, 0x7d, 0xea, 0xb0, + 0xa3, 0xa9, 0x57, 0x5d, 0xee, 0x82, 0x49, 0x25, 0x8c, 0x9f, 0x3b, 0x29, + 0x1c, 0x8e, 0x0d, 0x8f, 0x13, 0xa9, 0x40, 0xe7, 0x5d, 0x41, 0x73, 0xe7, + 0x8f, 0x6f, 0x9b, 0xa6, 0x63, 0x67, 0x1a, 0x4e, 0x5a, 0x26, 0xf0, 0x6e, + 0x61, 0xbc, 0xc4, 0x52, 0xa1, 0x79, 0x7e, 0x87, 0x2b, 0x53, 0x6b, 0xc3, + 0xe2, 0xdd, 0x19, 0x7b, 0x81, 0xc5, 0x01, 0x47, 0xed, 0x6c, 0xc4, 0x25, + 0xab, 0x97, 0x27, 0x9e, 0x9b, 0x53, 0x43, 0xc5, 0x4a, 0xcf, 0x0d, 0x9c, + 0x23, 0x1c, 0xd9, 0x16, 0x1f, 0x4d, 0xf0, 0xa4, 0x53, 0xad, 0x79, 0x71, + 0x6a, 0x98, 0x97, 0xab, 0xe5, 0xcb, 0xfb, 0x46, 0x44, 0xa4, 0xbb, 0x85, + 0x80, 0x91, 0xaf, 0xd6, 0x8a, 0xef, 0xd7, 0x35, 0xf2, 0x87, 0xae, 0xbc, + 0xcc, 0x90, 0xee, 0xd0, 0x61, 0x96, 0xb5, 0x51, 0x8a, 0xb4, 0x41, 0xe4, + 0xb1, 0xc9, 0x3f, 0x22, 0xab, 0xb9, 0x63, 0x37, 0x4a, 0xe7, 0x08, 0xf7, + 0x01, 0xe4, 0x06, 0x04, 0x3f, 0x21, 0x0c, 0x19, 0x38, 0x85, 0x35, 0x19, + 0x3c, 0x95, 0xa6, 0x47, 0xd1, 0x01, 0x1d, 0x43, 0xa1, 0x7a, 0xf7, 0xe8, + 0x3a, 0xce, 0x37, 0xe5, 0x44, 0x88, 0x33, 0xb8, 0xa4, 0x1f, 0x08, 0x7c, + 0x82, 0xe4, 0xe4, 0x78, 0x77, 0x47, 0x6c, 0x04, 0x79, 0x62, 0x50, 0x32, + 0xa9, 0x98, 0x7b, 0x89, 0x25, 0x13, 0x64, 0x6a, 0xda, 0x87, 0xc2, 0x9a, + 0x0e, 0xd8, 0x11, 0x18, 0x11, 0xcc, 0xdd, 0x8a, 0xb5, 0x50, 0x8f, 0xb1, + 0xd7, 0x2c, 0xc8, 0xb4, 0xc6, 0xc0, 0xc8, 0xde, 0xe0, 0x25, 0xdf, 0x5a, + 0x0e, 0x67, 0xf1, 0xbe, 0x70, 0xd0, 0x3b, 0x7e, 0x98, 0x63, 0x87, 0x0c, + 0x05, 0x46, 0xd6, 0x07, 0x9d, 0xc3, 0x58, 0x1e, 0x7c, 0xde, 0x50, 0x44, + 0x12, 0xe1, 0x54, 0x30, 0xee, 0x26, 0x76, 0xdb, 0x6d, 0x8d, 0x37, 0x52, + 0x08, 0x76, 0x21, 0x7e, 0x78, 0x8d, 0xee, 0x6a, 0xa8, 0xae, 0x53, 0x84, + 0x77, 0x83, 0x2a, 0x3b, 0x8b, 0x15, 0xe2, 0x4f, 0x1e, 0x80, 0x2f, 0xd0, + 0xc4, 0x96, 0x49, 0x8a, 0x49, 0xfe, 0xd2, 0xcf, 0x89, 0x7e, 0x87, 0xf1, + 0x81, 0xe6, 0x30, 0xe1, 0x10, 0x3e, 0x06, 0xe3, 0xa1, 0x89, 0xf5, 0x89, + 0xde, 0x8a, 0x06, 0x02, 0xba, 0x6b, 0xb0, 0x18, 0xf6, 0x77, 0x4f, 0x10, + 0x1d, 0xc8, 0xae, 0x19, 0x39, 0xd0, 0x27, 0x9c, 0x8e, 0x09, 0xfe, 0xd7, + 0xd4, 0x2c, 0xe7, 0x54, 0x9c, 0x4a, 0x63, 0xe1, 0x2d, 0x0d, 0x0c, 0x82, + 0xf6, 0x74, 0xc0, 0x5e, 0xe5, 0x66, 0xa0, 0x03, 0x80, 0xfa, 0xd8, 0x42, + 0x1b, 0x95, 0x14, 0x1f, 0x78, 0x45, 0x78, 0xa4, 0x0b, 0x3a, 0x00, 0x56, + 0x82, 0xa7, 0x61, 0x84, 0xef, 0xf0, 0xbd, 0x3a, 0x1a, 0x44, 0x00, 0xb1, + 0x07, 0xb4, 0xe4, 0xb4, 0x13, 0x79, 0xc1, 0xff, 0x4d, 0x4d, 0xac, 0xb4, + 0xaa, 0x25, 0x37, 0x1f, 0x62, 0x92, 0xf8, 0xe4, 0xc1, 0x25, 0xda, 0x8e, + 0x68, 0x56, 0x9f, 0xf4, 0x22, 0xf3, 0xe8, 0xca, 0x80, 0x9c, 0xd9, 0x69, + 0x77, 0x6b, 0xbd, 0xb0, 0x0a, 0xa2, 0x65, 0x9b, 0x03, 0xd7, 0xf3, 0xe4, + 0xb4, 0xc3, 0xef, 0x7e, 0x68, 0x90, 0xc0, 0xb1, 0x7f, 0x29, 0x71, 0x30, + 0x38, 0x59, 0x52, 0x4d, 0xa1, 0x2b, 0x4d, 0x85, 0x4b, 0x17, 0x7d, 0xeb, + 0x81, 0xfe, 0x4c, 0xe5, 0xd2, 0xb4, 0x2b, 0x3c, 0x1c, 0x76, 0x4d, 0x62, + 0xd5, 0x49, 0x4c, 0xd0, 0xf4, 0x12, 0x45, 0xce, 0x83, 0x12, 0xdf, 0x8d, + 0xe4, 0x98, 0x3d, 0x1a, 0x32, 0xe3, 0xf0, 0x25, 0x90, 0xb6, 0x32, 0xa8, + 0x8f, 0xcc, 0xe9, 0xa2, 0xad, 0xd1, 0x48, 0x46, 0xbe, 0xda, 0xfa, 0xa4, + 0x5d, 0x3b, 0xe8, 0xa2, 0xf0, 0x3a, 0xc4, 0x7b, 0x24, 0xbe, 0x4f, 0x83, + 0x69, 0x6a, 0xe9, 0xa5, 0x0a, 0x03, 0xce, 0x6e, 0x3d, 0xbc, 0x67, 0xde, + 0x43, 0x08, 0xf2, 0x5a, 0xaa, 0xc7, 0xaf, 0xab, 0xe7, 0xf1, 0xed, 0xf4, + 0xbc, 0x26, 0x77, 0xc6, 0x01, 0xc3, 0x63, 0xd7, 0x27, 0x02, 0x56, 0x6a, + 0x8b, 0x07, 0x06, 0x8a, 0x70, 0xc0, 0xf4, 0xe5, 0xb3, 0x1f, 0xcf, 0x34, + 0xc0, 0x50, 0x26, 0xcc, 0x84, 0xde, 0xa6, 0x89, 0xda, 0x4c, 0x24, 0xc2, + 0xa9, 0xe3, 0x65, 0x62, 0xce, 0x64, 0x56, 0x86, 0x23, 0x04, 0x2c, 0xc3, + 0xb1, 0x21, 0xc5, 0x04, 0x2a, 0x3f, 0x56, 0x27, 0xd1, 0x5e, 0xa9, 0x7c, + 0xf1, 0x4c, 0xcb, 0xae, 0x70, 0x8a, 0xeb, 0x3f, 0xb5, 0x9a, 0x16, 0x27, + 0x0e, 0xb2, 0xc9, 0xf4, 0x7a, 0xf8, 0x26, 0xe5, 0x73, 0x9a, 0xff, 0xcc, + 0xda, 0x45, 0xc7, 0x37, 0x18, 0x4a, 0xe5, 0x60, 0xe4, 0xe8, 0xd3, 0xe0, + 0xa6, 0x5d, 0x0a, 0x40, 0x51, 0x2a, 0x1b, 0x60, 0x45, 0x17, 0x1c, 0xed, + 0x9e, 0x85, 0xe7, 0xdd, 0xf4, 0x1d, 0x68, 0x13, 0xf2, 0xd6, 0x14, 0x02, + 0x62, 0x45, 0xde, 0x91, 0x69, 0x22, 0x98, 0x31, 0x5c, 0xe9, 0x2f, 0x3d, + 0x43, 0x8f, 0x79, 0xdc, 0x2f, 0xd8, 0xa4, 0x73, 0x9e, 0xc4, 0x4d, 0xe1, + 0x54, 0x07, 0x01, 0xad, 0xab, 0x83, 0x9d, 0x3e, 0x56, 0xae, 0x0b, 0xc8, + 0x4e, 0x9f, 0x37, 0x6d, 0x8d, 0x1e, 0x05, 0x7e, 0x6b, 0xd3, 0x75, 0x65, + 0xa6, 0x7b, 0x4f, 0xb4, 0x12, 0x7a, 0xa0, 0xc5, 0x26, 0x7a, 0x16, 0xe6, + 0x02, 0xe1, 0x1b, 0x0d, 0xf9, 0xd2, 0x40, 0x2c, 0xd3, 0x78, 0x97, 0x87, + 0xa5, 0x20, 0x48, 0xc1, 0xf7, 0x3e, 0x3e, 0x71, 0xa6, 0xc7, 0xcd, 0x69, + 0xc7, 0x49, 0x5f, 0x4b, 0xc3, 0x21, 0xe3, 0xe8, 0x27, 0xe8, 0x8f, 0x66, + 0x03, 0xc5, 0xf8, 0x69, 0x53, 0xb4, 0x3b, 0x7a, 0x9a, 0x33, 0x0b, 0x8c, + 0x5e, 0x9d, 0xd2, 0x79, 0x96, 0x12, 0xa4, 0xb9, 0xd2, 0x14, 0xf5, 0xa5, + 0x54, 0x05, 0x93, 0x87, 0xd1, 0x81, 0x37, 0x1e, 0xb0, 0x2d, 0x1d, 0xae, + 0x0e, 0xbc, 0x37, 0xc4, 0xdc, 0x52, 0xd1, 0x0c, 0xd0, 0x68, 0x41, 0xbb, + 0xd7, 0x5e, 0x78, 0xa1, 0x8d, 0xac, 0xa2, 0x5b, 0xfe, 0x2e, 0x99, 0xa1, + 0xe5, 0x7b, 0x18, 0xfe, 0xb9, 0x7a, 0x3c, 0x1d, 0xff, 0xab, 0x75, 0x98, + 0x46, 0x10, 0xeb, 0x60, 0x5b, 0xc2, 0xc1, 0x59, 0x97, 0x2e, 0x5a, 0xca, + 0x8a, 0x6b, 0x28, 0xab, 0x8e, 0x3f, 0x68, 0x47, 0x5c, 0xfc, 0x2e, 0xb6, + 0x03, 0x5b, 0x57, 0x62, 0x62, 0x4a, 0x90, 0x77, 0x6f, 0x1d, 0x05, 0x18, + 0x78, 0xbc, 0xcb, 0x76, 0x44, 0x4a, 0xd0, 0xac, 0x3d, 0x48, 0x1c, 0x27, + 0x93, 0xda, 0xbb, 0x05, 0x6f, 0x69, 0xb7, 0x32, 0x57, 0xcf, 0xa3, 0xd3, + 0x0a, 0x2e, 0xd3, 0x24, 0x7e, 0xdc, 0xec, 0xf2, 0x70, 0x42, 0x92, 0x9d, + 0xbc, 0x43, 0x7a, 0xa7, 0x97, 0x48, 0x94, 0xce, 0xa8, 0x0a, 0xe7, 0xb2, + 0x92, 0xf2, 0x33, 0x67, 0x3c, 0x9b, 0xdd, 0x23, 0x31, 0x0e, 0x3d, 0x4c, + 0x8b, 0x30, 0x05, 0xad, 0x88, 0xda, 0xd0, 0xf2, 0x91, 0x4d, 0x2b, 0x9a, + 0x32, 0x11, 0x81, 0x4d, 0xa6, 0x59, 0x78, 0x63, 0x04, 0xfa, 0xc8, 0x83, + 0xf3, 0xcd, 0xe7, 0xdd, 0x33, 0xb7, 0xfa, 0x68, 0xbf, 0xbc, 0x86, 0x0c, + 0x27, 0xeb, 0x69, 0xee, 0xae, 0x5b, 0x8e, 0x9f, 0xe1, 0x62, 0x96, 0x83, + 0x5d, 0xcd, 0xc5, 0xf9, 0x05, 0x10, 0x77, 0x99, 0xaf, 0x71, 0xd5, 0x65, + 0x01, 0xe7, 0x71, 0x65, 0x62, 0x95, 0x8f, 0x17, 0x89, 0x20, 0xb5, 0x55, + 0x4f, 0x68, 0xd7, 0xe3, 0x84, 0x7a, 0x1e, 0xdd, 0x8a, 0x7c, 0xb8, 0x95, + 0xff, 0x36, 0x9f, 0x14, 0xc5, 0xeb, 0xb8, 0xa6, 0xd8, 0xb9, 0x23, 0xe2, + 0x89, 0x49, 0x79, 0x39, 0xe2, 0x54, 0xef, 0x9b, 0x70, 0x93, 0x69, 0x45, + 0x53, 0xe7, 0x39, 0x58, 0x73, 0x3b, 0xb8, 0x7a, 0xd9, 0x42, 0x76, 0x90, + 0x16, 0x72, 0x6b, 0x48, 0x7b, 0x82, 0x94, 0x2c, 0x0e, 0x1d, 0xad, 0x28, + 0x34, 0xb1, 0xb8, 0x94, 0x99, 0x03, 0xf2, 0x09, 0x57, 0x3d, 0x5a, 0xc6, + 0x40, 0x22, 0x04, 0x72, 0xea, 0x41, 0xa3, 0xab, 0x20, 0x04, 0x72, 0x20, + 0x8f, 0x27, 0x32, 0x7a, 0xe1, 0x1f, 0x4c, 0xd6, 0x22, 0x39, 0xff, 0xc8, + 0xb3, 0xf6, 0x89, 0x20, 0x2b, 0x44, 0x01, 0xb4, 0x47, 0xf2, 0xab, 0xd8, + 0x1c, 0x23, 0x5f, 0x51, 0x2b, 0x79, 0xae, 0x77, 0x3a, 0xc5, 0x56, 0x1a, + 0x2c, 0x54, 0xb5, 0x20, 0x53, 0xad, 0x3e, 0x76, 0x48, 0xe7, 0xbd, 0xe8, + 0xb3, 0xaf, 0xb4, 0x51, 0x27, 0xd6, 0x9b, 0x27, 0x99, 0x99, 0xea, 0xbb, + 0x06, 0xd4, 0xe5, 0x72, 0x47, 0x3d, 0xba, 0x30, 0x1a, 0x65, 0x6b, 0x84, + 0x63, 0x92, 0xfd, 0xda, 0x7d, 0x38, 0x2c, 0xd2, 0x1c, 0xb7, 0xfc, 0xd5, + 0x91, 0x52, 0x90, 0xb6, 0x3d, 0xcf, 0x2d, 0x44, 0x17, 0x06, 0x71, 0x2f, + 0x45, 0x16, 0x27, 0xd9, 0xfb, 0x4c, 0xc9, 0x8e, 0xbb, 0xbd, 0x46, 0x92, + 0x37, 0xb8, 0x48, 0xe5, 0x75, 0x6c, 0xfb, 0xd4, 0xb5, 0x73, 0xe5, 0xc9, + 0x1e, 0xfd, 0x8b, 0x36, 0x4f, 0x2b, 0x94, 0x6c, 0x93, 0x46, 0xe3, 0x03, + 0x53, 0xbb, 0x33, 0x97, 0x04, 0x24, 0xc2, 0x55, 0xf0, 0x76, 0xf4, 0x23, + 0x5f, 0x7c, 0xe9, 0x38, 0x32, 0x51, 0xa6, 0x06, 0x3b, 0x31, 0x7a, 0x4d, + 0x4c, 0x5e, 0x6a, 0x66, 0x22, 0x8b, 0xb7, 0x6a, 0x1b, 0x11, 0xef, 0xd8, + 0xe6, 0x17, 0x13, 0x8b, 0xde, 0x7d, 0xbc, 0xca, 0xb5, 0x7d, 0xfb, 0x94, + 0x42, 0x05, 0xb6, 0x89, 0x5f, 0x5a, 0xec, 0xdd, 0x40, 0x9d, 0x7f, 0xad, + 0x5c, 0x79, 0xf5, 0x95, 0x24, 0x57, 0xba, 0x17, 0x8d, 0x9d, 0x3d, 0xad, + 0x65, 0x1e, 0x3e, 0xd3, 0xa9, 0x56, 0xb7, 0x3b, 0x65, 0xe7, 0x29, 0x41, + 0x66, 0xc5, 0x5f, 0x2c, 0x86, 0x4d, 0x76, 0xbe, 0x13, 0xee, 0x70, 0x97, + 0x0c, 0xf2, 0x5f, 0xa2, 0x0c, 0x4c, 0xdf, 0x4e, 0xdb, 0xcb, 0x34, 0xd3, + 0xdb, 0x60, 0x58, 0xf4, 0x5e, 0x22, 0x91, 0xbd, 0xf5, 0x1e, 0x7b, 0x72, + 0x06, 0x8e, 0x57, 0x5f, 0x4b, 0xdb, 0xeb, 0x43, 0x71, 0x8e, 0xae, 0xd8, + 0x5f, 0x1c, 0x5c, 0x42, 0xec, 0x88, 0x12, 0xa1, 0x1e, 0x12, 0x9d, 0x04, + 0x24, 0x2f, 0xed, 0x14, 0x81, 0x56, 0x3a, 0x45, 0xc4, 0x2a, 0xcc, 0x32, + 0x92, 0x30, 0x60, 0xaa, 0xb0, 0x11, 0x14, 0xdc, 0x8c, 0x29, 0x8c, 0x26, + 0xc0, 0x20, 0xcb, 0x01, 0x50, 0x10, 0xa7, 0x81, 0x4e, 0x8d, 0x80, 0x58, + 0x3c, 0x8b, 0x9e, 0x0d, 0xc5, 0xc0, 0x13, 0x55, 0x80, 0x7c, 0x80, 0xcf, + 0x50, 0x45, 0x65, 0xf6, 0x54, 0x23, 0xf7, 0x04, 0x91, 0x74, 0xf9, 0xa4, + 0x35, 0xc4, 0x52, 0x4b, 0x28, 0x0a, 0xcb, 0x58, 0x8c, 0x1e, 0x4c, 0xa3, + 0x9c, 0xaa, 0xc7, 0x63, 0x00, 0x16, 0x13, 0xc1, 0x10, 0x51, 0x0b, 0xba, + 0x26, 0x2a, 0xd9, 0x78, 0x9f, 0x15, 0xec, 0xf2, 0x30, 0x32, 0xa6, 0x20, + 0x41, 0xec, 0x01, 0x78, 0x57, 0xeb, 0x8b, 0x05, 0xe2, 0x48, 0x27, 0xd2, + 0x16, 0x78, 0x22, 0x32, 0x08, 0xa5, 0x23, 0xd3, 0x33, 0x63, 0x0a, 0x35, + 0x13, 0xbc, 0x1c, 0x2a, 0x0f, 0x4c, 0xfe, 0xca, 0x33, 0xfd, 0x0a, 0xbc, + 0x91, 0x27, 0xd6, 0xf1, 0x34, 0xb0, 0xde, 0x12, 0x09, 0x0d, 0xba, 0x26, + 0x2c, 0xf7, 0x40, 0x11, 0x73, 0x8c, 0xe5, 0x3e, 0xb1, 0x75, 0xbb, 0x04, + 0x43, 0x32, 0x6d, 0x0d, 0x8f, 0x3a, 0x73, 0xbf, 0x38, 0x82, 0xc1, 0x33, + 0x2a, 0x91, 0xe1, 0x33, 0x98, 0x79, 0x9d, 0xea, 0x22, 0x0a, 0x74, 0x7a, + 0x7b, 0x5b, 0x48, 0x7e, 0x2b, 0x6e, 0x86, 0x52, 0x49, 0x60, 0xdd, 0x4c, + 0xfd, 0x4f, 0x9c, 0xbf, 0x95, 0xdf, 0x46, 0xd3, 0x28, 0x80, 0x0b, 0x1e, + 0x87, 0xc8, 0x78, 0xa6, 0xb2, 0x30, 0x85, 0x5b, 0x86, 0x1e, 0xf0, 0xa5, + 0x8d, 0x93, 0x6e, 0xd2, 0x8b, 0x15, 0x9a, 0x19, 0x66, 0xbb, 0x29, 0xaf, + 0x5d, 0x38, 0x71, 0x78, 0xe4, 0xa9, 0x5a, 0xfa, 0xc3, 0x31, 0x5e, 0x12, + 0x2c, 0xde, 0xd8, 0xd1, 0x40, 0x57, 0xb0, 0xae, 0xa4, 0xd1, 0xd6, 0x40, + 0x75, 0x51, 0x08, 0x76, 0xa1, 0x38, 0xbf, 0xb5, 0xa6, 0x45, 0x60, 0x6a, + 0xe5, 0xf6, 0x50, 0x46, 0x92, 0x26, 0xd7, 0xa3, 0xf1, 0xae, 0x92, 0x03, + 0x11, 0xc1, 0x31, 0x1c, 0xe4, 0x3c, 0xbb, 0x35, 0x7a, 0x60, 0x58, 0x71, + 0x00, 0x38, 0xf2, 0x05, 0x9c, 0x45, 0x61, 0x9a, 0xbd, 0xb3, 0x8e, 0xb9, + 0x79, 0x02, 0xa2, 0x8c, 0x3e, 0x30, 0x5b, 0x0f, 0x91, 0x1d, 0xef, 0x0b, + 0xf9, 0x6f, 0x49, 0x3b, 0x67, 0x09, 0xc9, 0xe5, 0x0a, 0x89, 0x30, 0xe1, + 0xa6, 0x42, 0x5d, 0x9f, 0xf1, 0x00, 0xf7, 0xb5, 0x2d, 0xe3, 0xa3, 0xbc, + 0x89, 0x14, 0x9d, 0xe5, 0x6d, 0xc0, 0xd8, 0x2c, 0x28, 0x93, 0xff, 0x24, + 0x52, 0x23, 0x8f, 0xe4, 0xd2, 0x94, 0xaf, 0x8e, 0x16, 0x22, 0x20, 0x92, + 0xf0, 0xa2, 0xd7, 0x51, 0xdd, 0x86, 0xde, 0x88, 0x17, 0x05, 0x6c, 0xc3, + 0x0e, 0xe2, 0x63, 0x10, 0xba, 0xe6, 0x39, 0xe5, 0x07, 0xf6, 0x60, 0xdb, + 0x2b, 0xdb, 0xf1, 0xb4, 0x38, 0x0d, 0x6f, 0xa7, 0xb4, 0x29, 0x70, 0x26, + 0x6d, 0x29, 0xb0, 0x8c, 0xc8, 0x83, 0xb0, 0x3e, 0x1d, 0x70, 0x25, 0xe2, + 0x1b, 0xe7, 0x09, 0xa7, 0x89, 0x8f, 0x7e, 0xcb, 0x2d, 0x15, 0x86, 0x56, + 0x20, 0xde, 0xa4, 0x95, 0xae, 0x93, 0x3b, 0x38, 0x58, 0x70, 0xc6, 0x95, + 0xac, 0x7b, 0x16, 0xc7, 0xc4, 0xf6, 0x5e, 0xe5, 0x66, 0x30, 0xbb, 0xc2, + 0xa1, 0xc3, 0x51, 0x83, 0xc7, 0x82, 0xcd, 0xe3, 0xe6, 0x0a, 0x9e, 0x0d, + 0x9f, 0xf4, 0x78, 0x3b, 0x1c, 0xd6, 0x16, 0x62, 0xc0, 0x2c, 0x0e, 0xb8, + 0xeb, 0x78, 0x78, 0x0d, 0xba, 0x48, 0xf3, 0x8e, 0xd0, 0x90, 0x29, 0x84, + 0xc7, 0x38, 0xb0, 0xd1, 0xb5, 0x37, 0x01, 0x5b, 0xc1, 0x11, 0x8d, 0x1c, + 0x26, 0x14, 0xcb, 0xcb, 0x39, 0x04, 0xc2, 0x15, 0xa8, 0x6f, 0x47, 0x8d, + 0x21, 0xaa, 0x0f, 0x22, 0x38, 0x35, 0x89, 0x0b, 0x17, 0x0d, 0x01, 0xca, + 0xf8, 0xb7, 0x54, 0x51, 0x7c, 0x51, 0xc1, 0xcb, 0x23, 0xaa, 0xcf, 0xe0, + 0x02, 0x80, 0x7e, 0x27, 0x97, 0x5f, 0xae, 0x24, 0xd0, 0x56, 0xc1, 0xc7, + 0x58, 0xf9, 0xb8, 0xe9, 0xd4, 0xea, 0x95, 0x4f, 0x21, 0x14, 0x72, 0x11, + 0x31, 0xdb, 0x57, 0x23, 0x89, 0xcb, 0x58, 0x50, 0xcf, 0xf5, 0xa2, 0x50, + 0x5c, 0xd3, 0xdc, 0x36, 0xe7, 0x80, 0xa8, 0x0e, 0x44, 0x5d, 0xc2, 0x9e, + 0x71, 0x97, 0x14, 0xa1, 0x52, 0xd6, 0x92, 0x1b, 0x80, 0xcd, 0x34, 0xde, + 0x1f, 0x98, 0xe5, 0x01, 0x37, 0x2c, 0xc6, 0xf4, 0x85, 0x32, 0x4e, 0xf8, + 0xf2, 0x35, 0x21, 0x42, 0x8f, 0xeb, 0x8f, 0x5b, 0xe0, 0x5d, 0x4a, 0x5b, + 0xaa, 0xb6, 0x44, 0x93, 0x02, 0x28, 0xbe, 0xc2, 0xaa, 0x95, 0xdf, 0x9e, + 0xa8, 0xab, 0x3e, 0x70, 0xb0, 0x20, 0x8b, 0x8b, 0x32, 0x44, 0xf4, 0x0d, + 0x3f, 0x9d, 0xcf, 0x05, 0x0d, 0xeb, 0xd5, 0x8c, 0x6a, 0x6c, 0xbb, 0xa8, + 0xec, 0xba, 0xfc, 0x66, 0xb1, 0x4c, 0x39, 0x40, 0xe8, 0xd0, 0x33, 0x89, + 0xc1, 0x65, 0x84, 0x21, 0x82, 0x3f, 0x16, 0xb2, 0x95, 0x8d, 0xbc, 0x58, + 0xb3, 0xdb, 0x2b, 0xef, 0x23, 0x7e, 0x29, 0xc5, 0xe6, 0xa3, 0xfc, 0x74, + 0x81, 0x79, 0xcb, 0x21, 0x80, 0x32, 0xd1, 0xff, 0xac, 0xd3, 0xb0, 0xc9, + 0x60, 0x41, 0x5b, 0xcc, 0x8c, 0xd7, 0xe3, 0xba, 0xae, 0x2e, 0x52, 0x76, + 0xbb, 0x49, 0x28, 0x72, 0x2b, 0xa2, 0x8f, 0x84, 0xfc, 0x71, 0x61, 0x21, + 0x1b, 0xc1, 0xba, 0x3e, 0x3a, 0xdf, 0xaa, 0xc1, 0xf9, 0x76, 0x0d, 0xa0, + 0xc8, 0xec, 0xac, 0x1d, 0x2e, 0xa9, 0x9b, 0x2f, 0xfe, 0xbf, 0x0a, 0xa2, + 0x69, 0x5f, 0x52, 0xc3, 0xd8, 0x00, 0x3a, 0xe1, 0x00, 0xe7, 0x0d, 0x41, + 0x47, 0x81, 0x07, 0xe7, 0xdb, 0xf4, 0x2b, 0xdb, 0x60, 0xe2, 0x1f, 0xc5, + 0x60, 0x37, 0x1c, 0x69, 0x1a, 0x30, 0x40, 0x18, 0xcc, 0xda, 0xf9, 0xcb, + 0xe3, 0x0c, 0xeb, 0x2a, 0x57, 0x3d, 0xa4, 0x11, 0xc0, 0x23, 0xb8, 0x81, + 0xc6, 0x80, 0x68, 0x02, 0xaa, 0x66, 0xe7, 0x84, 0x10, 0xc8, 0x88, 0x31, + 0x90, 0xf9, 0x9d, 0x52, 0x16, 0x82, 0x7d, 0xb2, 0x5b, 0xa6, 0x5e, 0xa7, + 0xdf, 0x7c, 0xda, 0x06, 0x16, 0xeb, 0xbd, 0x49, 0x79, 0xa5, 0xf8, 0x98, + 0x9f, 0xf1, 0xe5, 0x21, 0x13, 0x83, 0xe1, 0x9f, 0x75, 0xfe, 0x1d, 0xa3, + 0x28, 0xb7, 0x08, 0x61, 0x4d, 0x01, 0x9e, 0xdd, 0x1e, 0x90, 0xea, 0x3e, + 0x97, 0x08, 0xc2, 0x80, 0x9d, 0x64, 0x6c, 0x70, 0xd3, 0xe4, 0xd1, 0x02, + 0x71, 0x7b, 0x1c, 0xb1, 0xa1, 0x4f, 0x69, 0xe7, 0x69, 0x6f, 0xf1, 0x7f, + 0xea, 0x7f, 0x87, 0x3f, 0xa4, 0xea, 0xac, 0xdb, 0xde, 0xe4, 0x97, 0xb9, + 0x81, 0x1d, 0x31, 0x8b, 0x80, 0x07, 0x67, 0x35, 0xfc, 0x6b, 0xf9, 0x3f, + 0xbe, 0xfc, 0xd7, 0x9e, 0xb9, 0xd2, 0xb7, 0xa7, 0x0d, 0x37, 0x61, 0x21, + 0x99, 0x86, 0xf3, 0x47, 0x18, 0x14, 0x0c, 0x2a, 0x3c, 0x5b, 0x91, 0x00, + 0x1e, 0x02, 0x0d, 0xb6, 0x8c, 0xcf, 0x34, 0x0f, 0x37, 0xfe, 0xb4, 0x44, + 0x93, 0x1e, 0x58, 0x11, 0x84, 0x1c, 0xd1, 0x9a, 0x32, 0x23, 0x20, 0xac, + 0x18, 0x55, 0x6f, 0xcb, 0x4a, 0x31, 0x92, 0x17, 0x00, 0x1f, 0x9d, 0xca, + 0xeb, 0xcd, 0x2c, 0x60, 0x80, 0x83, 0xb7, 0x4d, 0x49, 0x7a, 0x37, 0x89, + 0x4a, 0x19, 0xdd, 0x80, 0xab, 0xcb, 0xb9, 0x6d, 0x53, 0x6e, 0xb8, 0xb6, + 0xdc, 0xb8, 0xfa, 0xfe, 0xf4, 0x8d, 0x68, 0xf6, 0xb4, 0xd7, 0xb2, 0x55, + 0xda, 0x60, 0x58, 0x85, 0x34, 0xc4, 0x26, 0xe1, 0x53, 0x09, 0x00, 0x00, + 0x1d, 0x35, 0x32, 0xa5, 0x2c, 0x88, 0x8f, 0x98, 0x0f, 0x36, 0xb7, 0x67, + 0x9c, 0xbf, 0x4d, 0x14, 0x5a, 0x80, 0x7a, 0x57, 0xec, 0xf3, 0xc6, 0x4c, + 0x1d, 0x28, 0x19, 0x07, 0xcf, 0xb9, 0xda, 0x5c, 0xcc, 0xfa, 0x0b, 0x24, + 0xa3, 0xe9, 0xfa, 0x64, 0xda, 0x06, 0xf3, 0xdc, 0xbe, 0xf6, 0x69, 0x1d, + 0x05, 0x2c, 0xf5, 0xb5, 0x10, 0x03, 0x04, 0x8a, 0xa3, 0xe7, 0x7b, 0x16, + 0x42, 0x4f, 0x5c, 0x64, 0xad, 0x90, 0x83, 0x17, 0x0c, 0x91, 0x4e, 0x76, + 0x6a, 0xa9, 0x79, 0xcb, 0x86, 0x94, 0xb3, 0xcd, 0x3f, 0x53, 0x3d, 0xde, + 0xba, 0x0b, 0xb0, 0x6c, 0x1f, 0x96, 0xea, 0x31, 0x4f, 0xe8, 0xe7, 0x13, + 0xb6, 0xfb, 0xaa, 0xc1, 0x5b, 0x84, 0x17, 0xbe, 0xd5, 0xde, 0x0c, 0xd1, + 0x2b, 0x88, 0xd1, 0x7b, 0x25, 0xc3, 0x98, 0x2d, 0x37, 0xd5, 0xc0, 0x97, + 0x16, 0x7b, 0x53, 0xf9, 0x1f, 0x35, 0xa7, 0x94, 0x61, 0x03, 0x05, 0xdf, + 0xf9, 0xe0, 0x02, 0x82, 0x50, 0xf1, 0xb0, 0x10, 0xa9, 0x6e, 0x24, 0xee, + 0x36, 0xea, 0xd5, 0xb4, 0x47, 0x94, 0x72, 0xdc, 0x1e, 0x2d, 0xa1, 0xb8, + 0x48, 0xaf, 0x89, 0x68, 0xf2, 0xa8, 0x89, 0x8a, 0x07, 0x15, 0xbe, 0x41, + 0x08, 0xe9, 0x96, 0xf2, 0xa4, 0xde, 0x22, 0xee, 0xef, 0x5e, 0xd7, 0xc4, + 0xb5, 0x3b, 0x35, 0x74, 0xbe, 0x79, 0xd0, 0x8d, 0xcc, 0xdd, 0xb0, 0x76, + 0x76, 0x29, 0xb9, 0x0b, 0x02, 0x80, 0x25, 0x86, 0xc4, 0x05, 0x8b, 0xa7, + 0xb1, 0x2d, 0x55, 0x6f, 0x39, 0x51, 0x22, 0xaa, 0xb6, 0xcb, 0x05, 0x57, + 0x75, 0xc0, 0x0d, 0x6c, 0x66, 0xd7, 0xc9, 0x86, 0xd9, 0x46, 0x5b, 0x39, + 0xd4, 0x9f, 0x44, 0x32, 0x7c, 0x27, 0x87, 0x23, 0xfb, 0x4b, 0x9d, 0x9c, + 0x2e, 0xe1, 0x9e, 0xef, 0xd0, 0xf9, 0x07, 0x16, 0x25, 0x36, 0x6a, 0x55, + 0x0b, 0x14, 0x9b, 0xca, 0x42, 0xb1, 0x49, 0x1a, 0xb2, 0xb4, 0xd9, 0x36, + 0x9c, 0x20, 0x57, 0xa9, 0x24, 0x44, 0x81, 0x4f, 0x96, 0x2f, 0xca, 0xe5, + 0x5a, 0x5c, 0x6c, 0x97, 0x60, 0x66, 0x6d, 0xbb, 0xce, 0x93, 0x95, 0x00, + 0x0a, 0x8f, 0x79, 0xb3, 0xde, 0x6b, 0x19, 0x58, 0x03, 0xbb, 0x3c, 0xc6, + 0xf7, 0xbc, 0xc3, 0xb9, 0xbe, 0x27, 0x87, 0x23, 0x78, 0x25, 0xf2, 0x61, + 0x51, 0x32, 0xb8, 0x42, 0x1b, 0xb8, 0x42, 0xa9, 0xae, 0x7e, 0x89, 0x19, + 0xad, 0x85, 0x8d, 0xea, 0x50, 0x33, 0x59, 0x8a, 0xe4, 0xc9, 0xf9, 0x09, + 0x2d, 0xa5, 0xab, 0x14, 0x6a, 0x03, 0x8d, 0x3a, 0x44, 0x3c, 0xb2, 0x23, + 0x86, 0x2e, 0xf4, 0x09, 0xa2, 0x34, 0xc3, 0x02, 0x04, 0x3a, 0x44, 0x89, + 0x72, 0xf8, 0x13, 0xdb, 0x97, 0xf0, 0x1a, 0xfa, 0x6c, 0x5e, 0x5a, 0x30, + 0x2f, 0xbd, 0x3a, 0x35, 0x2f, 0x2d, 0xee, 0x79, 0x71, 0x0f, 0x3c, 0xe0, + 0xed, 0xfa, 0xce, 0x76, 0xfd, 0x63, 0xb8, 0x60, 0xcb, 0x44, 0x52, 0xda, + 0x14, 0x6c, 0x50, 0xd9, 0x11, 0x67, 0x45, 0x82, 0xcc, 0xff, 0x56, 0x22, + 0x50, 0x90, 0x82, 0x0e, 0x37, 0x43, 0x07, 0x26, 0x69, 0x1f, 0x8e, 0xec, + 0x1f, 0xf0, 0xc5, 0x81, 0xd4, 0x71, 0xcc, 0x3b, 0xdd, 0x69, 0xeb, 0x77, + 0x66, 0xf0, 0x23, 0xd4, 0xef, 0x4a, 0xb6, 0x17, 0x53, 0x5c, 0x73, 0xa3, + 0xdf, 0xf8, 0x22, 0x0c, 0xea, 0x7d, 0xfd, 0x2e, 0xf2, 0x77, 0x7a, 0xf4, + 0x1d, 0x6e, 0x50, 0x1d, 0x8f, 0x5d, 0x1f, 0x16, 0x0d, 0xd6, 0xa6, 0x13, + 0x8d, 0xfd, 0xc2, 0xab, 0x52, 0x23, 0x10, 0xa2, 0x11, 0x07, 0xbe, 0xbf, + 0x2e, 0xeb, 0x1c, 0x25, 0xef, 0x85, 0x5a, 0xb8, 0x54, 0x68, 0x71, 0x8b, + 0x36, 0x78, 0xdf, 0x65, 0xaa, 0xf5, 0x3b, 0x64, 0xf3, 0x7c, 0xcc, 0x65, + 0x60, 0xc9, 0xee, 0xf4, 0xed, 0x01, 0x53, 0xeb, 0xac, 0x87, 0xb8, 0xf2, + 0x97, 0xd5, 0xf7, 0x89, 0x81, 0x37, 0x2e, 0x98, 0xfc, 0x56, 0xbf, 0x94, + 0x2c, 0xd2, 0x1e, 0x6a, 0xba, 0xaf, 0x16, 0x22, 0x72, 0x9c, 0x38, 0xdf, + 0xc3, 0x2f, 0xcd, 0x14, 0xd8, 0x15, 0xf6, 0x5c, 0xca, 0x43, 0x89, 0x44, + 0x11, 0xa8, 0x02, 0x10, 0xad, 0x6d, 0x11, 0x17, 0xba, 0xec, 0x30, 0xc7, + 0xdf, 0x37, 0x89, 0x7a, 0x75, 0x93, 0xa8, 0x37, 0x1f, 0x10, 0xe8, 0x3b, + 0xf7, 0xba, 0x7d, 0x0f, 0x7f, 0x66, 0xe2, 0x3a, 0xdd, 0x85, 0x18, 0x87, + 0xbd, 0x3e, 0x1a, 0x44, 0x54, 0xd4, 0x27, 0x5b, 0x49, 0x3f, 0x39, 0x78, + 0xd0, 0x9b, 0x06, 0xaa, 0xd7, 0xb7, 0xa9, 0x18, 0xa7, 0x55, 0x09, 0x56, + 0x30, 0x95, 0xc8, 0xb4, 0x75, 0x24, 0xd6, 0x3a, 0xb4, 0x68, 0x43, 0x6c, + 0x69, 0x28, 0x28, 0x9b, 0xd6, 0x65, 0xd4, 0x68, 0x85, 0x6c, 0xc4, 0xd3, + 0x0a, 0x11, 0x8b, 0xa3, 0x06, 0xcc, 0x46, 0x1b, 0x2c, 0xaf, 0x45, 0xb0, + 0x7c, 0xeb, 0xf1, 0xf8, 0x99, 0xdd, 0x7c, 0x37, 0xa6, 0xc4, 0xda, 0x8a, + 0xa3, 0x17, 0x0b, 0x0a, 0x3e, 0xcf, 0xeb, 0x4e, 0xa7, 0x74, 0x67, 0xe9, + 0x37, 0xc7, 0x87, 0xd4, 0x13, 0xdb, 0x21, 0x72, 0x50, 0xd5, 0x82, 0xf9, + 0x7e, 0x5a, 0x91, 0xa0, 0xa6, 0x59, 0x52, 0x48, 0x0b, 0x9c, 0x81, 0x28, + 0x9d, 0x00, 0x4e, 0x85, 0x10, 0x33, 0x46, 0x64, 0x30, 0xea, 0xc2, 0x59, + 0x52, 0x26, 0x91, 0x81, 0x8e, 0x33, 0x27, 0x53, 0xb8, 0x33, 0xb2, 0x20, + 0x81, 0xc6, 0x87, 0x69, 0xd5, 0x21, 0x7d, 0xb8, 0x8d, 0x5b, 0xbe, 0x41, + 0x66, 0x01, 0xd7, 0x3a, 0x85, 0x9c, 0xf7, 0x52, 0x14, 0xa2, 0x46, 0x52, + 0xa6, 0xa6, 0xcd, 0x59, 0x3a, 0xb9, 0x1e, 0xf3, 0x4e, 0xb9, 0xd7, 0x32, + 0xb0, 0x2a, 0x76, 0x5a, 0x5f, 0x79, 0xf8, 0x3c, 0xdd, 0x80, 0xac, 0x57, + 0x3f, 0xc9, 0x0e, 0x18, 0x26, 0x05, 0x0c, 0x6b, 0x88, 0x79, 0xe6, 0x94, + 0x33, 0xa6, 0x63, 0x08, 0x03, 0x44, 0xf7, 0x70, 0xb2, 0x3d, 0xe6, 0x38, + 0x43, 0x7a, 0x34, 0x04, 0xa7, 0x02, 0xb2, 0x14, 0xee, 0xde, 0x0a, 0xd8, + 0xf7, 0xdb, 0xe7, 0x50, 0xde, 0x8c, 0x67, 0xa1, 0xe2, 0x98, 0x9a, 0xbc, + 0xad, 0x62, 0x42, 0x50, 0xd2, 0xfd, 0x24, 0x9f, 0x7a, 0xcc, 0x65, 0x36, + 0x41, 0xeb, 0xa6, 0x4d, 0x43, 0x4c, 0x3a, 0x94, 0x78, 0x45, 0xe4, 0x0d, + 0x75, 0x01, 0x97, 0x62, 0xe3, 0xc0, 0x6a, 0xfb, 0x35, 0xcc, 0x34, 0x2c, + 0xfe, 0x76, 0x6e, 0x19, 0x1f, 0x1e, 0x0b, 0x83, 0xe2, 0xc3, 0xed, 0xd6, + 0x5f, 0xee, 0xdc, 0x29, 0x42, 0x38, 0x41, 0x24, 0xf4, 0x43, 0x34, 0x01, + 0xd9, 0xcc, 0x88, 0xea, 0xce, 0x80, 0x55, 0xa4, 0x2f, 0x2c, 0x7e, 0x07, + 0x46, 0xe6, 0x12, 0xb4, 0x3c, 0x74, 0x68, 0xcc, 0x44, 0x8d, 0x72, 0x51, + 0x91, 0xcc, 0x4d, 0x88, 0x61, 0x97, 0x9e, 0x9b, 0x26, 0xe6, 0xc5, 0x0a, + 0x52, 0x6c, 0x3b, 0x47, 0xba, 0xee, 0x33, 0x53, 0x11, 0xef, 0xb5, 0x0c, + 0xac, 0x85, 0x5d, 0x1e, 0xdb, 0x5b, 0x07, 0x8b, 0xe5, 0xc5, 0x92, 0xda, + 0x19, 0x4c, 0xf6, 0x77, 0x47, 0x72, 0x77, 0x37, 0xc8, 0xa3, 0x87, 0xdb, + 0x5b, 0x7f, 0x6b, 0x99, 0x3f, 0xe3, 0xc5, 0x81, 0x95, 0x85, 0x46, 0x13, + 0x78, 0x70, 0x38, 0x53, 0x1b, 0xd2, 0x5c, 0x62, 0x85, 0x10, 0x6d, 0xb1, + 0x25, 0xa2, 0x20, 0xfd, 0x71, 0xc8, 0x12, 0x29, 0x1e, 0x82, 0xc6, 0x74, + 0x49, 0x0e, 0x5d, 0xd6, 0x5a, 0x23, 0xc5, 0xa5, 0x5b, 0xc8, 0xea, 0xae, + 0x65, 0xfc, 0x0d, 0x5e, 0xc6, 0x46, 0x24, 0xc8, 0xab, 0xe1, 0x03, 0x94, + 0xdf, 0x7d, 0xb1, 0x64, 0xfa, 0x4c, 0x80, 0x07, 0x30, 0xed, 0x3b, 0x6d, + 0xaf, 0xd4, 0x1f, 0x17, 0xa8, 0x83, 0xc9, 0x88, 0x28, 0x9f, 0x73, 0x53, + 0xd8, 0x60, 0x4c, 0x4f, 0xef, 0x44, 0x93, 0x83, 0x99, 0x75, 0xc1, 0xc2, + 0xaf, 0x43, 0xf5, 0xcd, 0x2d, 0x86, 0x1c, 0xbf, 0xca, 0x86, 0x41, 0x66, + 0xe7, 0x2a, 0xb1, 0x1f, 0x1c, 0x88, 0xe1, 0x28, 0x5a, 0xa4, 0xc6, 0x5a, + 0x20, 0x91, 0xeb, 0x81, 0x18, 0xd3, 0x4a, 0x12, 0x6a, 0xc6, 0x08, 0x29, + 0x8c, 0xca, 0x00, 0x5e, 0x4b, 0x04, 0xee, 0x43, 0x0d, 0x86, 0x8a, 0x60, + 0x78, 0x15, 0x33, 0xed, 0x26, 0x0e, 0x5f, 0x1d, 0xa3, 0x8b, 0xb0, 0x6e, + 0x0a, 0x39, 0xc0, 0x52, 0x44, 0x10, 0xa5, 0x28, 0x80, 0x26, 0x11, 0x0f, + 0x2e, 0x11, 0x16, 0x92, 0x1f, 0x0f, 0x5b, 0xb7, 0x95, 0xbc, 0xd8, 0x12, + 0xa5, 0xb1, 0xe3, 0x68, 0x15, 0x5f, 0x1e, 0x04, 0xcd, 0xda, 0xba, 0xf1, + 0xab, 0x70, 0x94, 0x93, 0xc7, 0x0a, 0x10, 0xf0, 0x0c, 0x24, 0xbf, 0x9c, + 0x4d, 0xad, 0xb2, 0x72, 0xd1, 0xbb, 0x50, 0xf5, 0xfe, 0x64, 0x24, 0x38, + 0xec, 0x04, 0xae, 0xb0, 0x89, 0xa9, 0x08, 0x98, 0x0c, 0x77, 0x54, 0x0c, + 0xc2, 0x43, 0xa8, 0x7f, 0x89, 0x8a, 0x2c, 0xb8, 0x31, 0x5a, 0x81, 0xe3, + 0xbe, 0x19, 0x0b, 0xed, 0xc7, 0xc1, 0xd0, 0x82, 0xf5, 0xfb, 0x4c, 0x5a, + 0x9f, 0xa9, 0x8c, 0x02, 0x2a, 0x88, 0xb6, 0xa3, 0x55, 0x4e, 0x00, 0xb2, + 0xe1, 0x54, 0xdf, 0x79, 0x6c, 0x94, 0xee, 0xb5, 0x6b, 0x7a, 0x6a, 0x6b, + 0x3e, 0xdb, 0x69, 0x05, 0xab, 0x1c, 0xa7, 0x97, 0x0a, 0x2b, 0x88, 0x0f, + 0xbf, 0x40, 0x56, 0x01, 0xbf, 0xc5, 0x87, 0x11, 0xb1, 0x60, 0x0b, 0x2b, + 0xaf, 0xfa, 0xd0, 0x92, 0x55, 0x6d, 0x3f, 0x89, 0x3e, 0x10, 0x30, 0xfe, + 0xe0, 0xe3, 0x29, 0xd3, 0x95, 0x5e, 0x90, 0x75, 0x54, 0x88, 0x30, 0xf5, + 0x4f, 0x4e, 0xe6, 0xc9, 0x4c, 0xe8, 0x25, 0xd8, 0x19, 0x02, 0x33, 0x0f, + 0xeb, 0x41, 0xcd, 0x71, 0x4e, 0x45, 0x97, 0xa5, 0x40, 0x38, 0x2e, 0xe2, + 0x5a, 0xb5, 0xb6, 0x73, 0xdc, 0xc5, 0xf4, 0x56, 0x8d, 0xd1, 0x6e, 0xad, + 0xf5, 0x2f, 0xa6, 0x50, 0x9c, 0xd6, 0xa0, 0x62, 0xc9, 0x71, 0x23, 0x32, + 0x4b, 0x50, 0xa4, 0x40, 0x56, 0x4f, 0x4e, 0x92, 0xa4, 0xcc, 0x38, 0xe6, + 0x36, 0x94, 0x7e, 0x5b, 0x18, 0x8b, 0xfc, 0xcb, 0xba, 0x2a, 0xee, 0x75, + 0x3d, 0x5c, 0xb6, 0x95, 0xdf, 0x03, 0x85, 0xd6, 0x05, 0x49, 0x12, 0x1b, + 0x5b, 0x78, 0x14, 0x9b, 0x7d, 0xba, 0x81, 0xcf, 0x73, 0xcd, 0xa9, 0x27, + 0xb7, 0x01, 0x7f, 0x6b, 0x5c, 0xa3, 0xaf, 0x0c, 0x25, 0xf0, 0x41, 0xb1, + 0xc2, 0x0f, 0x28, 0x79, 0x00, 0x95, 0x00, 0xac, 0x10, 0x03, 0x05, 0x20, + 0x6b, 0x90, 0xf6, 0xac, 0x1a, 0x38, 0x5f, 0x73, 0xa6, 0x52, 0xac, 0x6e, + 0x09, 0x37, 0xa6, 0xc7, 0x30, 0x02, 0x32, 0xd2, 0x61, 0x6f, 0x0e, 0x35, + 0xe8, 0x96, 0x00, 0xcc, 0x18, 0xa1, 0xd9, 0x87, 0x08, 0xec, 0x92, 0xfb, + 0x51, 0x66, 0xad, 0x74, 0x0c, 0x88, 0x6c, 0xc4, 0x30, 0xce, 0x03, 0xaa, + 0x06, 0x21, 0x3f, 0x03, 0x50, 0x2e, 0x0e, 0xea, 0xc3, 0x8a, 0xd2, 0x31, + 0x42, 0x96, 0xcc, 0xc8, 0x91, 0xaf, 0x1a, 0x14, 0x8e, 0xfc, 0x45, 0xa0, + 0x10, 0x6a, 0x4c, 0x00, 0x80, 0x65, 0xf2, 0xf9, 0x0e, 0x56, 0xb9, 0xf6, + 0x75, 0x3c, 0x28, 0x33, 0x67, 0x4c, 0xa5, 0xb1, 0x79, 0x1e, 0x96, 0xe7, + 0x68, 0x8a, 0xfb, 0x8a, 0xa6, 0xf8, 0x6d, 0x5d, 0x34, 0x85, 0xba, 0x52, + 0x2a, 0xd5, 0xd9, 0xfc, 0x8c, 0x42, 0x29, 0xfe, 0x2e, 0x09, 0xb5, 0x12, + 0x2e, 0x44, 0xf7, 0x74, 0x26, 0xe3, 0xff, 0xb8, 0x2d, 0xa9, 0xed, 0x97, + 0x78, 0x4e, 0x79, 0xd5, 0xce, 0x19, 0xef, 0xad, 0x69, 0x4d, 0x70, 0xfe, + 0x49, 0xcf, 0x69, 0x94, 0xa7, 0x15, 0x60, 0x38, 0xf9, 0x0d, 0xa7, 0x7b, + 0xf6, 0x8c, 0xe0, 0xf0, 0x14, 0x63, 0x8e, 0x01, 0x58, 0x1f, 0x28, 0x28, + 0x19, 0x92, 0x04, 0x72, 0x62, 0x8d, 0xa6, 0x99, 0xc1, 0x39, 0x01, 0xfc, + 0xf2, 0x57, 0x37, 0xec, 0xdb, 0x26, 0x16, 0xc8, 0x36, 0x68, 0x7f, 0x61, + 0x75, 0xec, 0xb2, 0xce, 0x77, 0x5f, 0x66, 0x8e, 0x2c, 0x02, 0x12, 0xa6, + 0xb1, 0x69, 0x5d, 0x1f, 0x66, 0x79, 0x8b, 0x9f, 0x9c, 0xce, 0xf1, 0x47, + 0x43, 0xe9, 0xb7, 0x0b, 0xfc, 0x4e, 0xb3, 0xcd, 0x28, 0xe0, 0x0c, 0xd1, + 0xff, 0xec, 0x4b, 0x0c, 0x20, 0xb1, 0x76, 0xb0, 0xbd, 0xc1, 0x1d, 0x4e, + 0x79, 0x49, 0x34, 0xf3, 0x3d, 0x10, 0x90, 0x52, 0xd3, 0xa3, 0xe8, 0xc5, + 0xc6, 0x74, 0x3d, 0xf8, 0xc4, 0x91, 0xe2, 0xa5, 0xb7, 0x9c, 0xa4, 0x27, + 0x2c, 0x01, 0x3c, 0x44, 0xb3, 0x7e, 0x4b, 0x36, 0xf8, 0xa6, 0x05, 0x33, + 0xa6, 0x3e, 0x32, 0xdc, 0x4a, 0x6c, 0x27, 0x4a, 0x05, 0xf3, 0x71, 0x16, + 0x5b, 0x7e, 0x75, 0xf8, 0xed, 0x93, 0xf1, 0x24, 0xae, 0x2e, 0x03, 0x4b, + 0x62, 0xe7, 0x12, 0x5e, 0x01, 0x96, 0x42, 0x01, 0xcf, 0x6c, 0xca, 0xa7, + 0xeb, 0xbb, 0xfe, 0xbe, 0x41, 0x19, 0x8d, 0xbe, 0x66, 0xbe, 0x49, 0xc7, + 0xe2, 0xc5, 0x2e, 0x89, 0x66, 0xd6, 0x50, 0x2d, 0x8d, 0x78, 0xe7, 0x05, + 0x98, 0x36, 0x92, 0xf5, 0x63, 0x06, 0x28, 0x32, 0x8c, 0x15, 0xce, 0xa2, + 0x62, 0xda, 0xa7, 0xfd, 0x75, 0x50, 0x8e, 0xb8, 0x84, 0x48, 0x3f, 0xa5, + 0xcd, 0xe5, 0x07, 0x46, 0x1b, 0xe4, 0xcb, 0x89, 0x29, 0x2b, 0xb8, 0x78, + 0x47, 0x6e, 0x67, 0xd8, 0x5e, 0x73, 0xcf, 0xe6, 0x03, 0x95, 0x72, 0x18, + 0x8d, 0xc9, 0x7e, 0xf6, 0x04, 0xf9, 0xc2, 0xa8, 0x47, 0x3f, 0x10, 0x10, + 0x71, 0x56, 0x78, 0xeb, 0x2a, 0xc9, 0x07, 0x71, 0x29, 0xb9, 0x4a, 0xb9, + 0x13, 0x06, 0xde, 0x1e, 0x7c, 0x58, 0x31, 0xa9, 0x0f, 0xfa, 0x43, 0x6a, + 0x1e, 0x47, 0x06, 0xc1, 0x34, 0x3b, 0xbf, 0xca, 0x48, 0xb0, 0x2a, 0x7c, + 0x71, 0x5c, 0xc1, 0x4c, 0x9f, 0xe8, 0x38, 0xff, 0x63, 0x25, 0x26, 0x29, + 0xa9, 0x07, 0xd4, 0x4e, 0x4c, 0xd5, 0x38, 0xe4, 0xf1, 0x3e, 0x85, 0x72, + 0x97, 0x79, 0xbf, 0x0b, 0xeb, 0x01, 0xf3, 0x4d, 0x22, 0x93, 0x53, 0x91, + 0xcd, 0x74, 0x09, 0xe9, 0x90, 0x97, 0xbc, 0x39, 0x66, 0x62, 0xd0, 0xca, + 0xa5, 0x70, 0x5e, 0xd8, 0x23, 0xbb, 0xe8, 0x50, 0xc6, 0xe0, 0x02, 0x21, + 0x52, 0x2f, 0x64, 0x1a, 0x82, 0x84, 0x38, 0x2f, 0x16, 0xf6, 0x42, 0x83, + 0xe7, 0xbe, 0x69, 0x7b, 0x20, 0x88, 0x07, 0x58, 0xae, 0xc6, 0x6b, 0x6c, + 0x8f, 0x59, 0x4e, 0x06, 0xa5, 0x20, 0x9e, 0x4f, 0xb7, 0x18, 0x4f, 0x73, + 0x2d, 0xa6, 0x6e, 0xe2, 0xae, 0x94, 0x4b, 0x32, 0x2c, 0x20, 0xb5, 0x0a, + 0x4f, 0xd9, 0x38, 0xe8, 0x41, 0x89, 0x9b, 0x81, 0x10, 0x5d, 0x14, 0x20, + 0xc2, 0xfc, 0x37, 0x86, 0x62, 0x04, 0x03, 0x58, 0xca, 0xf1, 0xde, 0x49, + 0x88, 0x13, 0x0c, 0x14, 0x46, 0x6a, 0xaa, 0x03, 0xdd, 0x57, 0x89, 0xf4, + 0xaa, 0xb8, 0xf2, 0xc4, 0xa8, 0xa4, 0xd6, 0x96, 0xb8, 0x33, 0xf9, 0x4b, + 0xe8, 0x9b, 0x3a, 0x01, 0x2c, 0x0c, 0x61, 0x05, 0x42, 0x70, 0x49, 0x4c, + 0x0b, 0x50, 0x1b, 0xe5, 0x45, 0xa8, 0xcd, 0xd5, 0x82, 0x5a, 0x06, 0x19, + 0xe9, 0xca, 0xe3, 0x7a, 0x21, 0x2c, 0xbc, 0x70, 0xde, 0x25, 0xca, 0xf1, + 0x0a, 0xcc, 0xc4, 0x8c, 0xe5, 0x03, 0x79, 0x8b, 0x2e, 0x19, 0x40, 0x2d, + 0x30, 0xb1, 0x1c, 0x83, 0x5f, 0x21, 0x43, 0x21, 0xcf, 0x14, 0x5e, 0x30, + 0xf0, 0x7a, 0x14, 0x90, 0xa8, 0xce, 0x91, 0xea, 0x64, 0xf6, 0x85, 0xde, + 0x0d, 0x51, 0x10, 0x0e, 0xe1, 0x4b, 0xc5, 0x4b, 0xe3, 0x89, 0x55, 0xcd, + 0x11, 0x55, 0x34, 0x18, 0x0d, 0xd0, 0xd9, 0x62, 0xb7, 0x9c, 0x98, 0x96, + 0x03, 0xce, 0x55, 0x80, 0x9d, 0x6e, 0x39, 0x25, 0x64, 0x88, 0x95, 0x48, + 0x8f, 0xf9, 0xdb, 0xd8, 0x42, 0xe1, 0x0f, 0xf5, 0x4c, 0xd0, 0x6c, 0xf8, + 0x30, 0x96, 0x2d, 0x13, 0x21, 0x51, 0xb8, 0x98, 0x63, 0xc3, 0x83, 0x2a, + 0x14, 0x50, 0x6d, 0x85, 0x4c, 0x34, 0x0c, 0x1c, 0x96, 0x86, 0x79, 0xf3, + 0x69, 0xf3, 0xa0, 0x3f, 0xba, 0x32, 0xb0, 0x56, 0x77, 0xae, 0xbb, 0x10, + 0xfe, 0x34, 0x95, 0x8d, 0xfb, 0xa7, 0xa7, 0x93, 0xb5, 0xc8, 0xa9, 0x39, + 0xc3, 0x00, 0x68, 0x62, 0x87, 0x1a, 0x5e, 0xba, 0x02, 0x52, 0x21, 0x67, + 0xdd, 0x2b, 0x09, 0x86, 0x86, 0x88, 0xb0, 0xea, 0x2f, 0xed, 0x0a, 0x73, + 0x20, 0xee, 0x5b, 0x46, 0x45, 0xc8, 0x89, 0xfe, 0x24, 0x1d, 0x80, 0x62, + 0xd7, 0x72, 0x01, 0xc1, 0x68, 0xd1, 0x91, 0x8f, 0x56, 0x69, 0x57, 0xf9, + 0xcf, 0xc8, 0xcc, 0xc8, 0x78, 0xdd, 0xde, 0x29, 0x06, 0xfd, 0xaa, 0x9d, + 0xfe, 0xd8, 0x36, 0x5a, 0xc8, 0x3a, 0xdd, 0xec, 0x25, 0x63, 0x57, 0xbc, + 0x27, 0xf6, 0x16, 0x09, 0x00, 0xa5, 0xe1, 0xf2, 0x43, 0x08, 0xea, 0xbf, + 0xba, 0xdc, 0xb5, 0xac, 0xba, 0xd5, 0x57, 0x68, 0xdb, 0x32, 0xd5, 0xec, + 0x30, 0x10, 0xd8, 0xec, 0x2e, 0x59, 0x8d, 0x9b, 0x70, 0xb0, 0x6d, 0xea, + 0xef, 0x60, 0xef, 0x54, 0x01, 0x02, 0x97, 0x69, 0xbc, 0x35, 0x4b, 0x84, + 0xda, 0x4e, 0x9d, 0x27, 0x73, 0xa7, 0xc9, 0x8c, 0x11, 0x8a, 0x83, 0x70, + 0x27, 0x5a, 0xca, 0x4e, 0x0a, 0x2d, 0xdb, 0x4b, 0xa1, 0x65, 0x69, 0x55, + 0xe1, 0x34, 0x2f, 0x48, 0x11, 0x85, 0xa7, 0x98, 0xc9, 0xdd, 0xbc, 0xcf, + 0xf8, 0x98, 0xd0, 0x6f, 0x1f, 0x56, 0x76, 0xdb, 0x4b, 0xd4, 0xbf, 0xb4, + 0x4c, 0xcf, 0xb7, 0x1e, 0x97, 0x8b, 0x2e, 0xe8, 0x83, 0xf7, 0x16, 0x56, + 0x77, 0xd1, 0xe2, 0x85, 0x63, 0x1b, 0x5c, 0xdb, 0x2f, 0xfa, 0xd0, 0x8e, + 0x11, 0xf3, 0x12, 0xbe, 0x96, 0x36, 0xe6, 0xd5, 0x22, 0xb6, 0xe5, 0x3e, + 0xb6, 0xf1, 0x3a, 0x6d, 0x0a, 0x25, 0x18, 0x89, 0xd1, 0x48, 0xc0, 0xec, + 0x05, 0x3d, 0x16, 0x3c, 0xc8, 0xc6, 0xcc, 0x22, 0x84, 0x98, 0x3f, 0x54, + 0x54, 0x35, 0x8c, 0xcc, 0x96, 0xd1, 0x8a, 0x2a, 0x1e, 0x02, 0x1b, 0x1f, + 0xb7, 0xca, 0x30, 0x59, 0x1b, 0x89, 0xa3, 0x43, 0x88, 0x4f, 0x96, 0x34, + 0xb8, 0x0a, 0x92, 0x6d, 0x9f, 0x09, 0x31, 0xd5, 0xc4, 0x19, 0xdf, 0xa3, + 0x6b, 0xf8, 0x8e, 0x42, 0x86, 0xec, 0x53, 0x0e, 0x19, 0xfa, 0x5e, 0x76, + 0xf4, 0x16, 0xe0, 0xe2, 0xea, 0xe8, 0x06, 0x39, 0xb4, 0xee, 0x03, 0xd3, + 0x47, 0x25, 0xa2, 0x0d, 0x0e, 0x63, 0x6f, 0x24, 0xf3, 0xf1, 0xa2, 0x65, + 0x25, 0x11, 0x91, 0x6f, 0xa2, 0xfc, 0xf2, 0x8e, 0xd9, 0x9e, 0x90, 0x31, + 0xb9, 0x29, 0x3f, 0x64, 0xdd, 0x44, 0xee, 0x08, 0xe4, 0x9f, 0x39, 0x76, + 0x14, 0xfd, 0xde, 0xc4, 0x2b, 0x69, 0x31, 0x9d, 0xdf, 0x2c, 0x13, 0x88, + 0x8d, 0xc7, 0x05, 0x6b, 0xcc, 0xf9, 0x83, 0x79, 0x93, 0x8a, 0x9e, 0x21, + 0xfb, 0x20, 0xef, 0xf0, 0x68, 0xbf, 0x76, 0xaf, 0x6a, 0xd5, 0x1c, 0x2b, + 0xd5, 0x1a, 0x2b, 0x58, 0x51, 0x3b, 0xe3, 0x8b, 0x36, 0xe1, 0x4f, 0xd5, + 0x09, 0x81, 0x06, 0x6c, 0xa2, 0x4f, 0x2c, 0x82, 0x30, 0xf2, 0x63, 0x5f, + 0xaa, 0x6d, 0x2b, 0xf1, 0xec, 0xb2, 0x3a, 0x41, 0x89, 0x2f, 0xa8, 0xfc, + 0x9d, 0x07, 0x9f, 0x5f, 0xbf, 0x2a, 0x4c, 0x53, 0xc8, 0x53, 0xa4, 0xa4, + 0x34, 0xd6, 0xd7, 0x6e, 0xfe, 0x1f, 0x44, 0xc2, 0x48, 0x32, 0x93, 0x96, + 0xf8, 0x3a, 0x4c, 0x4b, 0xce, 0x36, 0x62, 0xa5, 0x56, 0xb9, 0x43, 0x6b, + 0xae, 0xee, 0x9d, 0xd2, 0x47, 0xb4, 0x19, 0x4a, 0xf0, 0x53, 0xf8, 0x5f, + 0x49, 0x9c, 0x3a, 0xca, 0x10, 0x0e, 0x99, 0x61, 0x39, 0x8b, 0x2d, 0x5b, + 0xa4, 0x21, 0xb9, 0xab, 0x2e, 0xb7, 0xa1, 0x92, 0x2c, 0x1d, 0x12, 0xb6, + 0x16, 0x4b, 0x33, 0x61, 0x4e, 0x2d, 0x99, 0x73, 0x19, 0xa7, 0xea, 0x2b, + 0x19, 0xba, 0x42, 0x82, 0x47, 0x44, 0xaa, 0xf6, 0x1c, 0x9a, 0xcb, 0x78, + 0x53, 0xcf, 0x40, 0x57, 0x0a, 0xb8, 0x42, 0x9e, 0xf9, 0xc1, 0x10, 0xcc, + 0xcc, 0xe3, 0x96, 0x0d, 0x45, 0x78, 0x40, 0x29, 0xa4, 0x48, 0x09, 0xd5, + 0x93, 0xe4, 0xa9, 0x26, 0x32, 0x56, 0x43, 0x65, 0x86, 0xae, 0x54, 0x81, + 0xd9, 0xd3, 0xd1, 0xfa, 0x85, 0xa4, 0x2a, 0x91, 0xc0, 0xa8, 0x6c, 0x21, + 0x19, 0x51, 0xe6, 0x6b, 0xc7, 0xbd, 0x29, 0x46, 0x70, 0xc5, 0x87, 0x21, + 0x42, 0x6f, 0x7d, 0xc1, 0xde, 0x32, 0xae, 0x35, 0xbd, 0xc0, 0x57, 0xf8, + 0xc0, 0x24, 0xed, 0x9e, 0x4b, 0xf8, 0x42, 0x73, 0xaf, 0xf1, 0xea, 0x75, + 0x2c, 0xc9, 0x96, 0x2b, 0xb3, 0x5f, 0x21, 0x69, 0x67, 0xc4, 0x08, 0x5b, + 0xad, 0x35, 0xbf, 0x11, 0xfc, 0x8a, 0xe4, 0xee, 0x81, 0xda, 0xa5, 0x3e, + 0x79, 0x8e, 0xb2, 0x84, 0x57, 0x70, 0x6c, 0x17, 0x32, 0x00, 0xc8, 0xdf, + 0x96, 0x6b, 0xaa, 0x74, 0x21, 0x92, 0x84, 0xf2, 0x38, 0x7b, 0xbb, 0xb4, + 0x1c, 0x8a, 0x8f, 0x0e, 0x51, 0x2b, 0x8a, 0x30, 0xbb, 0x40, 0x53, 0x42, + 0x43, 0x00, 0x87, 0x04, 0x46, 0xd2, 0x18, 0x57, 0x74, 0x04, 0xc4, 0x2c, + 0x63, 0xca, 0x72, 0x20, 0x47, 0x42, 0x36, 0x6d, 0x98, 0xff, 0x84, 0xb3, + 0x65, 0x7c, 0x9f, 0x54, 0x19, 0x68, 0xc4, 0xd0, 0x80, 0xe2, 0x77, 0x4c, + 0x5b, 0x5c, 0x1e, 0x21, 0x3f, 0x55, 0xd8, 0xc5, 0x3d, 0x94, 0x38, 0x10, + 0x8d, 0x3a, 0xce, 0x56, 0xc2, 0xe5, 0x92, 0xb7, 0x32, 0xf3, 0x9b, 0xaa, + 0x44, 0xab, 0x03, 0x12, 0x8f, 0x1d, 0x31, 0x4c, 0xdc, 0x70, 0x23, 0x0a, + 0xd2, 0x20, 0x20, 0xff, 0xb0, 0x03, 0x10, 0x71, 0xa2, 0xe9, 0xc1, 0x2f, + 0x91, 0x14, 0x15, 0x28, 0x86, 0xf2, 0x8f, 0x08, 0x82, 0x56, 0x89, 0x3a, + 0x43, 0xb1, 0xe6, 0x91, 0x1a, 0x04, 0xd4, 0x72, 0x82, 0x72, 0x58, 0x75, + 0x99, 0x5e, 0x9c, 0x13, 0xcd, 0x01, 0xb7, 0xb9, 0xa3, 0x61, 0x5b, 0xc2, + 0x67, 0xb1, 0x65, 0x0d, 0x41, 0x0c, 0xb9, 0x03, 0xa5, 0x46, 0xa4, 0x5f, + 0xd5, 0xf8, 0x66, 0xf8, 0x03, 0x00, 0x71, 0xa0, 0xf3, 0x3c, 0x43, 0xfe, + 0x23, 0xbe, 0x97, 0x71, 0xf5, 0x30, 0x97, 0x5c, 0x3b, 0x9b, 0x28, 0x4e, + 0xda, 0x68, 0x0b, 0x4f, 0x0c, 0x0b, 0x88, 0x37, 0xa0, 0xcd, 0x58, 0x38, + 0x37, 0x44, 0xe3, 0x41, 0x23, 0x3f, 0xee, 0xb0, 0x16, 0xa6, 0x77, 0xf9, + 0xd4, 0x56, 0x73, 0x93, 0x54, 0x93, 0xc0, 0x53, 0x65, 0xdb, 0x55, 0xd8, + 0x35, 0x55, 0xdc, 0xeb, 0xd1, 0x0a, 0xf2, 0x76, 0xe7, 0x35, 0xe7, 0xd0, + 0x85, 0xb9, 0x02, 0x99, 0xd2, 0x11, 0x50, 0x48, 0x81, 0x46, 0x0c, 0x29, + 0xde, 0x2e, 0x23, 0x69, 0xc1, 0x14, 0xd6, 0xa7, 0xf0, 0x61, 0x84, 0xc5, + 0x83, 0x10, 0xa0, 0x83, 0xb3, 0x9b, 0x9f, 0x9c, 0xa6, 0x5d, 0xb8, 0x23, + 0x01, 0x05, 0xc5, 0x8b, 0x5f, 0xcb, 0x3a, 0x4e, 0x1e, 0x35, 0xad, 0xea, + 0x94, 0x6b, 0x7a, 0x37, 0xb5, 0x08, 0xec, 0x39, 0x66, 0x2a, 0x5f, 0x53, + 0xcb, 0x6a, 0x3c, 0xc3, 0x57, 0x5d, 0x8d, 0x84, 0xd5, 0x23, 0xb1, 0xaa, + 0x8e, 0xac, 0x41, 0xb8, 0x91, 0xef, 0x64, 0xaa, 0x3e, 0x54, 0x92, 0xc8, + 0xa1, 0x40, 0xde, 0x60, 0x37, 0x65, 0x31, 0x9f, 0x52, 0x7d, 0x0b, 0xac, + 0x94, 0xd5, 0x2f, 0x83, 0x09, 0xbe, 0xa7, 0x6c, 0xdf, 0xc2, 0xe3, 0xf6, + 0x3c, 0x69, 0xb6, 0xc4, 0xdc, 0x5d, 0xe9, 0xb6, 0x57, 0xf8, 0x72, 0x62, + 0x77, 0x18, 0x67, 0xf4, 0xba, 0x07, 0x52, 0x9d, 0xd0, 0x4c, 0x51, 0x05, + 0xbf, 0xad, 0x61, 0x8f, 0x53, 0xc3, 0x79, 0x7e, 0x41, 0x75, 0xe1, 0x6e, + 0x32, 0x9b, 0xff, 0x20, 0xd3, 0xe8, 0xaa, 0xea, 0x10, 0x5d, 0xc9, 0xe4, + 0x17, 0x0b, 0x97, 0xdf, 0xfc, 0x18, 0x53, 0x45, 0x33, 0xe9, 0x6b, 0x78, + 0x0d, 0xaa, 0x33, 0x86, 0x2d, 0xb1, 0x87, 0xda, 0x56, 0x5e, 0xd5, 0xac, + 0x58, 0x68, 0xcb, 0x5f, 0xf4, 0x7c, 0xd6, 0xf1, 0xb3, 0x8e, 0x46, 0x09, + 0xe9, 0xb6, 0xe0, 0xd7, 0x9a, 0x9f, 0x88, 0x7e, 0x2f, 0x39, 0x2e, 0xd8, + 0x46, 0x98, 0x1f, 0xe0, 0x61, 0xed, 0x47, 0xd4, 0x08, 0xc5, 0xb7, 0x0f, + 0xad, 0xf9, 0xda, 0x23, 0x7c, 0xa4, 0x26, 0xb5, 0xff, 0x88, 0x19, 0x8a, + 0x06, 0x5e, 0x3c, 0x38, 0xcc, 0xb8, 0x6c, 0x1a, 0x17, 0xe9, 0xea, 0xd7, + 0x07, 0x33, 0xf0, 0x15, 0x0a, 0x8e, 0x63, 0x3d, 0xcf, 0xd9, 0x4e, 0x43, + 0x37, 0x1f, 0x2f, 0x24, 0x1a, 0xd3, 0xa5, 0x85, 0xe1, 0x94, 0x12, 0x59, + 0xf9, 0xdc, 0x1a, 0x37, 0xb7, 0x5a, 0x70, 0x94, 0x2b, 0xd9, 0x16, 0x2c, + 0xac, 0x56, 0x3c, 0x59, 0x91, 0xe3, 0x18, 0xff, 0xed, 0xc0, 0x1b, 0x15, + 0x97, 0x2e, 0xa2, 0x4e, 0xaf, 0xab, 0x39, 0x1e, 0xb2, 0x06, 0xb3, 0xd0, + 0x41, 0xf1, 0x1d, 0x05, 0xda, 0xc1, 0x66, 0x15, 0x61, 0x15, 0x18, 0x00, + 0x73, 0xdf, 0x88, 0x87, 0x64, 0xf0, 0xcd, 0x5b, 0x5d, 0xde, 0x3f, 0x3b, + 0xe3, 0x6e, 0xcd, 0x23, 0xa6, 0xa6, 0x87, 0x42, 0xeb, 0x5a, 0x27, 0x9c, + 0x4e, 0xf5, 0x68, 0x9b, 0xc5, 0xc5, 0xd8, 0xe2, 0x6a, 0x8e, 0xa8, 0xa5, + 0xb2, 0xb9, 0xa0, 0x9e, 0x0a, 0x8b, 0x47, 0xdd, 0x14, 0x65, 0x77, 0x40, + 0x40, 0x17, 0x6e, 0x25, 0xa9, 0xac, 0x8d, 0xe7, 0x42, 0x82, 0x6c, 0x14, + 0xcf, 0x44, 0x15, 0xcf, 0x1a, 0x6d, 0xcf, 0xbe, 0xf9, 0xf2, 0x8d, 0x96, + 0x00, 0x32, 0xb8, 0x65, 0xd7, 0x56, 0x34, 0xaf, 0x26, 0x78, 0xd0, 0x48, + 0xdb, 0x67, 0xb2, 0x70, 0x10, 0x59, 0xf1, 0x20, 0xa2, 0x4a, 0xdc, 0xbc, + 0x96, 0x70, 0x1e, 0xce, 0x10, 0x84, 0xe3, 0x73, 0x3c, 0xe8, 0xed, 0x92, + 0xa0, 0x54, 0x3b, 0x90, 0x8e, 0x0e, 0x40, 0x14, 0xbb, 0x93, 0xcf, 0xdd, + 0xf6, 0xde, 0x58, 0xa1, 0xef, 0x68, 0x2b, 0xe7, 0x45, 0xd2, 0x3c, 0x0d, + 0x55, 0x6c, 0x6c, 0xe5, 0xc6, 0x41, 0xcd, 0xe3, 0xdf, 0xd4, 0x7f, 0x9d, + 0x88, 0x34, 0x82, 0x2e, 0xc1, 0xee, 0x16, 0xa9, 0xb5, 0xf8, 0x08, 0xcb, + 0xb7, 0x7e, 0x64, 0x4f, 0x8d, 0x25, 0x81, 0x73, 0x1e, 0x63, 0x5a, 0x95, + 0xf9, 0x66, 0xfe, 0x02, 0xb1, 0x93, 0x70, 0xb6, 0x87, 0xd5, 0xa7, 0xa8, + 0xdd, 0x4d, 0x6c, 0x04, 0x73, 0xc3, 0xa1, 0x63, 0x70, 0x92, 0xc6, 0xa6, + 0x6d, 0x11, 0xbf, 0xb2, 0x29, 0x4a, 0xbc, 0x64, 0x14, 0xeb, 0xc3, 0xd4, + 0x4b, 0xc9, 0x79, 0xa3, 0x6c, 0x39, 0x02, 0x39, 0x95, 0x54, 0xa7, 0x7a, + 0x4a, 0x38, 0x66, 0xf0, 0xb6, 0x98, 0xef, 0x67, 0x70, 0x0f, 0x75, 0x14, + 0xf1, 0x02, 0x49, 0xbd, 0xf8, 0x0a, 0xad, 0x08, 0xcb, 0xe2, 0x8b, 0x85, + 0x12, 0x11, 0x63, 0x05, 0xd2, 0xdf, 0x46, 0x79, 0xad, 0x32, 0x2d, 0xc2, + 0xe2, 0x8d, 0x84, 0xd6, 0xe0, 0x31, 0xd5, 0x4c, 0x74, 0x2a, 0x66, 0xd6, + 0x6a, 0x39, 0x37, 0xe7, 0x07, 0x0f, 0x1c, 0xb4, 0x4a, 0xf7, 0x6c, 0x7a, + 0xa7, 0x9c, 0x57, 0x2a, 0x5f, 0x1b, 0x75, 0xd7, 0x71, 0x22, 0xed, 0xa6, + 0x8b, 0x53, 0x25, 0x95, 0x64, 0x3f, 0x8d, 0xd0, 0xce, 0xc2, 0xd1, 0xa4, + 0xe4, 0xb3, 0xe9, 0x2e, 0xee, 0x5f, 0x04, 0x47, 0x8a, 0x6c, 0x6b, 0x36, + 0x6c, 0x1d, 0x29, 0x14, 0xaa, 0x16, 0x49, 0x4c, 0x3d, 0x50, 0x4e, 0xc1, + 0x1f, 0x81, 0xe7, 0x3c, 0x16, 0x77, 0x8e, 0x31, 0x10, 0x59, 0x82, 0x2c, + 0xb7, 0x5b, 0x98, 0x51, 0x17, 0x96, 0xa7, 0x32, 0x88, 0xf0, 0xa4, 0xc4, + 0xbb, 0x68, 0x97, 0x42, 0xb9, 0xdf, 0x31, 0xa7, 0xf9, 0xad, 0x6e, 0x74, + 0x65, 0xad, 0x8b, 0xf2, 0x76, 0xb8, 0x03, 0xf1, 0x63, 0x52, 0xc6, 0x1d, + 0xc1, 0x4f, 0x29, 0x94, 0x77, 0x92, 0x97, 0x32, 0x6f, 0x3a, 0x2a, 0x80, + 0xae, 0xf9, 0xf3, 0x22, 0x3f, 0x3f, 0x3f, 0xbf, 0x51, 0x6d, 0x6f, 0x0e, + 0xc3, 0xce, 0x92, 0xa5, 0x37, 0xf5, 0x63, 0xcf, 0x95, 0xe0, 0xe3, 0xf3, + 0x7a, 0x60, 0xe5, 0x4f, 0x4b, 0xe1, 0xf3, 0x5a, 0xb8, 0xc6, 0xe9, 0xd6, + 0x11, 0x33, 0xbc, 0x72, 0x7e, 0x46, 0x28, 0xa7, 0xb4, 0x4c, 0xa3, 0x33, + 0x2e, 0x37, 0x4f, 0xe5, 0xac, 0x5c, 0x4a, 0xa7, 0x21, 0xbb, 0xa5, 0x73, + 0x2e, 0xc1, 0x19, 0x94, 0x7f, 0x16, 0xca, 0xa8, 0x73, 0x83, 0xbb, 0xc7, + 0xc1, 0x2d, 0xe3, 0xe2, 0xe6, 0xed, 0x0e, 0x0f, 0xff, 0x1f, 0x90, 0xe5, + 0x1d, 0xd7, 0x81, 0x8f, 0xc3, 0xe8, 0xdd, 0xfd, 0x31, 0x57, 0x37, 0x74, + 0xcf, 0x4d, 0x35, 0x85, 0x91, 0xbc, 0xbd, 0xed, 0x5c, 0x48, 0x9c, 0x54, + 0xd4, 0xc3, 0x58, 0xb5, 0xf5, 0xea, 0x24, 0x89, 0x1e, 0xbb, 0x70, 0x21, + 0x84, 0x61, 0x83, 0xea, 0xa2, 0x74, 0x0c, 0xc1, 0x8f, 0x50, 0x5f, 0xd7, + 0x9d, 0x7a, 0x0d, 0x0f, 0x7c, 0x08, 0xc1, 0x0e, 0x96, 0x09, 0xf4, 0x6e, + 0x4b, 0xf8, 0x2e, 0x93, 0xbd, 0x7b, 0x6d, 0x0f, 0x8e, 0xed, 0xdc, 0x22, + 0xd7, 0x7b, 0x7e, 0x20, 0xcc, 0x62, 0x8e, 0xa9, 0x46, 0x89, 0xeb, 0xdd, + 0xba, 0xac, 0xbc, 0x81, 0x1e, 0xa2, 0x91, 0xe0, 0x1c, 0xaa, 0x67, 0x34, + 0x73, 0x5b, 0x78, 0x25, 0x5d, 0xa0, 0x23, 0x53, 0xcb, 0x59, 0x54, 0xe8, + 0xb2, 0x6f, 0x30, 0x4f, 0xc2, 0xaf, 0x2d, 0x0e, 0x77, 0xad, 0x53, 0x42, + 0x9e, 0x59, 0x08, 0x21, 0x84, 0x44, 0x74, 0xad, 0x6a, 0x52, 0x87, 0xaf, + 0x18, 0xd3, 0xd4, 0x25, 0x5e, 0xb8, 0xda, 0xb3, 0x36, 0x6e, 0xb3, 0x5a, + 0xe5, 0x7b, 0xe7, 0xf1, 0x9d, 0xc0, 0x8a, 0xca, 0x7f, 0xb5, 0x16, 0x5e, + 0xb4, 0x4e, 0xae, 0xf3, 0xf6, 0x24, 0x03, 0xeb, 0xe8, 0xd8, 0x69, 0x95, + 0x5c, 0xc9, 0xbf, 0x7e, 0xdd, 0xbe, 0x5c, 0x5d, 0xfa, 0xc4, 0xbf, 0x04, + 0x67, 0x12, 0x4f, 0x32, 0x99, 0x24, 0x1c, 0x91, 0x39, 0x0a, 0x83, 0x0e, + 0x8f, 0xd2, 0x87, 0x1e, 0x26, 0xf7, 0x43, 0x71, 0xcb, 0xe7, 0x0d, 0xeb, + 0x5c, 0x73, 0x8c, 0xdc, 0x68, 0x8c, 0xae, 0xea, 0x37, 0x0c, 0xb1, 0x88, + 0x87, 0xe5, 0x80, 0x96, 0xc4, 0xe6, 0x8e, 0xac, 0xea, 0x90, 0x7e, 0xc8, + 0x31, 0xc9, 0xab, 0x22, 0x17, 0xc6, 0x8a, 0xe7, 0x4e, 0x19, 0x11, 0xc9, + 0x06, 0xfa, 0x84, 0xc2, 0x2c, 0xbc, 0x47, 0x8c, 0xde, 0x44, 0x98, 0x6a, + 0x48, 0xdb, 0x31, 0x01, 0x81, 0x89, 0xb1, 0xc8, 0xc6, 0xd8, 0x61, 0x90, + 0x52, 0xfd, 0x89, 0x8d, 0xfd, 0x48, 0xa2, 0x6e, 0x39, 0xab, 0x89, 0x26, + 0x26, 0x12, 0x50, 0x2a, 0x61, 0xcb, 0x22, 0xf3, 0x88, 0xc7, 0xdc, 0x29, + 0x70, 0x83, 0x03, 0xf7, 0xf4, 0xe0, 0x60, 0x21, 0xfb, 0x11, 0xfa, 0xac, + 0xd1, 0x65, 0x6d, 0x06, 0x87, 0x08, 0x64, 0xaf, 0xa6, 0x82, 0x40, 0xa1, + 0x89, 0xc1, 0xbc, 0xca, 0x51, 0x06, 0x65, 0x48, 0xc3, 0x42, 0x71, 0x4b, + 0xbe, 0x78, 0xb5, 0x28, 0xe4, 0x17, 0x9b, 0x89, 0x05, 0x42, 0x0b, 0x3e, + 0xa5, 0x88, 0x1e, 0x1d, 0x26, 0x61, 0x01, 0x13, 0x2f, 0x92, 0x97, 0x58, + 0x4a, 0xf2, 0xe4, 0xc8, 0x07, 0x44, 0xde, 0x34, 0x3d, 0x8e, 0xc7, 0x28, + 0x4e, 0x20, 0x24, 0x42, 0xc1, 0xc4, 0x2f, 0xc8, 0x80, 0x42, 0x06, 0x93, + 0x4e, 0x3b, 0x36, 0x17, 0xc3, 0x1f, 0x5a, 0x83, 0xa7, 0x3f, 0x96, 0xaa, + 0x2a, 0x91, 0xa1, 0x2b, 0x9e, 0x2c, 0x0d, 0x66, 0xa8, 0x3c, 0x1a, 0xaa, + 0x77, 0x01, 0x49, 0x55, 0x2a, 0x1d, 0x4b, 0xc7, 0x2e, 0x0f, 0x0d, 0x9d, + 0x22, 0x9a, 0x17, 0x43, 0x0a, 0x39, 0xd1, 0xb0, 0x40, 0x33, 0x79, 0xac, + 0x15, 0x46, 0x3a, 0x47, 0x02, 0x1c, 0x6b, 0x1a, 0x49, 0x70, 0xa3, 0x91, + 0xcb, 0xcc, 0x50, 0x3e, 0x4b, 0x52, 0xd6, 0xa1, 0x78, 0x52, 0xdb, 0x61, + 0xfa, 0x3c, 0xce, 0x51, 0x9d, 0x26, 0xc3, 0x3e, 0x38, 0x43, 0x48, 0x63, + 0x5b, 0x90, 0xea, 0x38, 0x51, 0x00, 0x62, 0xdf, 0x33, 0x50, 0xc1, 0xd1, + 0x60, 0x98, 0xc2, 0x12, 0xac, 0x39, 0x67, 0xb5, 0x66, 0x17, 0x8d, 0xe5, + 0x9c, 0xcd, 0x79, 0xac, 0x62, 0x4d, 0x94, 0xe5, 0x80, 0xda, 0x9b, 0x2e, + 0x11, 0x9a, 0x43, 0x1d, 0xc0, 0x29, 0xb8, 0x0f, 0x8c, 0x76, 0xb0, 0x9c, + 0x91, 0x9b, 0x32, 0x5b, 0x51, 0x4a, 0x6f, 0x95, 0x95, 0x47, 0x8a, 0x89, + 0x60, 0xc8, 0x26, 0xb9, 0xe4, 0xd0, 0x37, 0x57, 0xea, 0xa2, 0x60, 0x02, + 0x70, 0xce, 0x85, 0x02, 0x9c, 0x80, 0x35, 0x58, 0x66, 0x55, 0x51, 0x46, + 0x68, 0xcd, 0x37, 0x18, 0xc3, 0x3f, 0x43, 0x7a, 0x07, 0xe2, 0x3a, 0x46, + 0x6c, 0xbe, 0x81, 0x72, 0xc4, 0x50, 0x97, 0x6b, 0x8c, 0x25, 0x9c, 0x1c, + 0xd8, 0x5d, 0x0e, 0x8c, 0x02, 0x87, 0x59, 0x60, 0x1f, 0x25, 0xac, 0x4e, + 0x5c, 0xc5, 0x9c, 0x10, 0xdc, 0x7a, 0xc2, 0x6d, 0x58, 0x6a, 0x1e, 0x97, + 0xa1, 0xb6, 0x95, 0x85, 0x07, 0xce, 0x4d, 0xec, 0x02, 0xb2, 0x8e, 0x0f, + 0x37, 0xab, 0x12, 0x07, 0xe1, 0x90, 0x82, 0xa3, 0xbc, 0x8f, 0xa5, 0x70, + 0xf5, 0xc8, 0xfe, 0xcc, 0x58, 0x6a, 0x60, 0x77, 0xab, 0x2e, 0xb3, 0x04, + 0xd0, 0xf2, 0x30, 0x04, 0x0c, 0x21, 0x98, 0x84, 0x54, 0xfc, 0x92, 0xb2, + 0xa8, 0xf8, 0x7f, 0xc9, 0x3b, 0x88, 0xd7, 0x34, 0x4b, 0x6e, 0x4b, 0x5c, + 0x59, 0xb4, 0x5c, 0x29, 0x24, 0x49, 0xd7, 0xf9, 0x35, 0x40, 0x09, 0x52, + 0x3d, 0xb0, 0x3e, 0x32, 0x46, 0x85, 0xc6, 0x80, 0xd0, 0x4a, 0x94, 0xb3, + 0x9b, 0x4f, 0xa3, 0x9a, 0x27, 0x01, 0x20, 0xf5, 0x5d, 0x09, 0x76, 0xda, + 0x8e, 0x56, 0x99, 0x78, 0xc6, 0x0f, 0x94, 0x3f, 0x73, 0x85, 0x61, 0x37, + 0x4f, 0x84, 0x0c, 0x48, 0xba, 0xae, 0x2b, 0xa9, 0x90, 0x49, 0x32, 0x17, + 0xd5, 0x09, 0x93, 0xa6, 0x53, 0xe0, 0x02, 0xde, 0x69, 0x81, 0xdf, 0x33, + 0xd4, 0x4b, 0x2d, 0xec, 0x1d, 0xb8, 0xae, 0x92, 0x70, 0xe4, 0xa4, 0xc5, + 0xfb, 0x12, 0xce, 0xe4, 0x11, 0x6a, 0x1f, 0x31, 0x5d, 0xb2, 0x21, 0x54, + 0xfe, 0x28, 0xa9, 0x33, 0x7e, 0xc1, 0x89, 0x95, 0xb3, 0x20, 0x0c, 0xa8, + 0xb6, 0x6c, 0xb9, 0x19, 0x48, 0xeb, 0x88, 0xbf, 0xf6, 0x45, 0x9b, 0xc1, + 0x6c, 0xc6, 0xb5, 0x25, 0x4a, 0xec, 0x54, 0x3e, 0x29, 0xb5, 0x2d, 0xe9, + 0x5d, 0xd8, 0x7c, 0x4d, 0x99, 0x58, 0x4a, 0xe3, 0x35, 0xf4, 0xba, 0xb6, + 0xab, 0x5c, 0x7d, 0xce, 0x70, 0x43, 0x96, 0x9e, 0xee, 0x39, 0x9a, 0x21, + 0x52, 0xd8, 0x4c, 0x28, 0xdd, 0x28, 0x89, 0x99, 0xe9, 0x45, 0xf6, 0xfc, + 0x66, 0xec, 0x2a, 0xb6, 0xb3, 0x97, 0xe9, 0x28, 0x63, 0x38, 0x73, 0x42, + 0xd2, 0xb3, 0xa1, 0xf5, 0x54, 0xac, 0x71, 0x53, 0xb5, 0x39, 0x53, 0xda, + 0xa3, 0xf7, 0xda, 0x7b, 0xfe, 0x21, 0x9c, 0x76, 0x87, 0x77, 0x12, 0xe4, + 0xb8, 0x98, 0x0e, 0xed, 0x78, 0x70, 0x68, 0x50, 0x6b, 0x32, 0x69, 0x55, + 0x5e, 0x7a, 0x8b, 0xd2, 0xbe, 0x3c, 0x39, 0x69, 0xaa, 0xdc, 0xb1, 0xb6, + 0x43, 0x6a, 0x74, 0xb4, 0x69, 0x50, 0x1d, 0xb8, 0x7a, 0xb9, 0x12, 0x8e, + 0xd4, 0x21, 0x49, 0x35, 0xd0, 0x35, 0x0f, 0xab, 0x66, 0x6f, 0xb9, 0xd0, + 0xbe, 0x96, 0xa1, 0x71, 0xd4, 0x75, 0x20, 0x99, 0x25, 0x6a, 0x8b, 0xd8, + 0x0b, 0xfa, 0x8a, 0xad, 0x28, 0xc6, 0xd7, 0x51, 0x29, 0x59, 0x46, 0xd9, + 0x63, 0xcd, 0xcc, 0x95, 0xe4, 0x39, 0x84, 0x78, 0x91, 0xf2, 0x9c, 0xae, + 0x09, 0xbb, 0xb1, 0xad, 0x8a, 0x34, 0xd3, 0x1f, 0xeb, 0x60, 0x0f, 0x8b, + 0x38, 0x4a, 0xd3, 0x92, 0x4a, 0xa2, 0xf3, 0xf2, 0x0b, 0x3c, 0x69, 0x94, + 0xe1, 0x49, 0xd4, 0x1c, 0x76, 0x98, 0x68, 0x9c, 0x21, 0x17, 0x7d, 0xac, + 0x63, 0xa4, 0xdc, 0x50, 0xc4, 0x33, 0xaa, 0x77, 0x5e, 0xce, 0x51, 0x1b, + 0x25, 0xa7, 0xb1, 0x1b, 0xd9, 0x8a, 0x14, 0xbf, 0x78, 0x59, 0xa4, 0xb6, + 0x38, 0x66, 0x4a, 0x74, 0xcb, 0x90, 0x8f, 0x1c, 0x17, 0x10, 0x2f, 0xda, + 0xe9, 0x4f, 0xf8, 0xe6, 0xf6, 0x28, 0x95, 0xe8, 0xf9, 0x28, 0x28, 0x83, + 0x42, 0xb3, 0x61, 0xe6, 0x9d, 0x18, 0x97, 0xf3, 0x75, 0x7b, 0xf2, 0x97, + 0xa1, 0x72, 0x8f, 0x0e, 0x18, 0x96, 0x30, 0xce, 0x74, 0x3e, 0xef, 0x2d, + 0xb8, 0x9f, 0xfb, 0xe2, 0x52, 0xca, 0x02, 0x86, 0x9e, 0x60, 0xa1, 0xda, + 0x6c, 0x39, 0xd6, 0x05, 0x33, 0xfd, 0x96, 0x5b, 0x18, 0x7f, 0xc9, 0x10, + 0x4f, 0x5a, 0x21, 0xc3, 0x3e, 0x20, 0x28, 0x4b, 0x11, 0x5c, 0x59, 0x34, + 0xc9, 0x23, 0x59, 0xf6, 0xe2, 0x30, 0x3a, 0x8d, 0x96, 0x69, 0xcf, 0xdb, + 0x93, 0x01, 0x8a, 0xc3, 0xaa, 0xd1, 0xd3, 0xf7, 0x19, 0xd6, 0x24, 0x8e, + 0xe4, 0x96, 0xc9, 0x1f, 0x6c, 0x3b, 0x40, 0x21, 0x36, 0xe5, 0xf8, 0x71, + 0xaa, 0xb1, 0x16, 0x62, 0x36, 0xca, 0xcc, 0xd1, 0x0d, 0x4a, 0x63, 0x91, + 0x7c, 0x36, 0x5f, 0x29, 0x49, 0x23, 0x4f, 0x1f, 0xb7, 0x82, 0xef, 0x4b, + 0xb5, 0x38, 0x26, 0x55, 0x44, 0xf4, 0x08, 0x95, 0x94, 0xca, 0xf9, 0xd6, + 0x71, 0x63, 0x66, 0xae, 0x29, 0xdf, 0xa4, 0x8f, 0x83, 0xdf, 0x72, 0x25, + 0xb3, 0x48, 0x87, 0x07, 0x25, 0x90, 0x82, 0x0b, 0xc1, 0x2e, 0xa9, 0x4b, + 0xd2, 0xd8, 0x14, 0xcf, 0x3e, 0xe6, 0x89, 0xf4, 0xc0, 0x8a, 0x92, 0xff, + 0xf5, 0xfc, 0x9f, 0x62, 0x64, 0xa1, 0x72, 0xea, 0xd4, 0xd6, 0xe2, 0x64, + 0x9f, 0x51, 0x9e, 0xc3, 0x91, 0xc8, 0xc8, 0xe7, 0x30, 0x88, 0x0c, 0x43, + 0x9a, 0x60, 0x64, 0xfb, 0xea, 0xc0, 0xd8, 0x9b, 0xd7, 0xd2, 0x66, 0x37, + 0x2a, 0x13, 0x8e, 0xe5, 0xe4, 0x1e, 0x8e, 0x6d, 0x8e, 0x35, 0x2e, 0xe7, + 0x75, 0x95, 0xc0, 0xfc, 0x83, 0x19, 0xfd, 0x62, 0x8b, 0xfc, 0xf1, 0x24, + 0x75, 0xc3, 0xf0, 0x93, 0xe3, 0x3e, 0xb1, 0xca, 0xa2, 0xdc, 0xf0, 0x93, + 0xaf, 0xeb, 0xbe, 0x1f, 0x4e, 0x83, 0xb1, 0xbc, 0x45, 0xc5, 0x3e, 0x16, + 0x6c, 0x18, 0x89, 0x6a, 0x33, 0x96, 0xb7, 0x13, 0x11, 0x4a, 0xc2, 0xb3, + 0xfe, 0x5e, 0xc4, 0xa2, 0x2b, 0xa9, 0x21, 0x07, 0xbd, 0x18, 0x35, 0x73, + 0xfa, 0xa2, 0x3f, 0x51, 0x72, 0x07, 0x45, 0x0e, 0xb5, 0xf6, 0x52, 0x06, + 0xed, 0xee, 0x27, 0xa2, 0xa7, 0x47, 0x75, 0xbe, 0xfc, 0xce, 0xa3, 0x18, + 0x6b, 0x9d, 0x28, 0x3b, 0x4e, 0x85, 0x03, 0xe8, 0x23, 0x45, 0x45, 0xb4, + 0x61, 0x3f, 0xbc, 0x56, 0x19, 0x01, 0x1d, 0xf8, 0x14, 0x19, 0x4d, 0x4d, + 0x27, 0xcc, 0x4b, 0x38, 0x9d, 0x98, 0xd2, 0x08, 0x86, 0xbd, 0x8a, 0x1a, + 0x54, 0xd1, 0x61, 0x48, 0x1f, 0x70, 0xa3, 0x51, 0x98, 0xa8, 0x4d, 0x83, + 0xce, 0x34, 0x52, 0x98, 0x4e, 0xb4, 0x25, 0x3a, 0x2d, 0x8b, 0xaa, 0x84, + 0xbe, 0x87, 0x41, 0x65, 0xc2, 0x28, 0xca, 0xd2, 0x18, 0x2f, 0x20, 0x6d, + 0xcb, 0x01, 0x0e, 0xdc, 0x4c, 0x3c, 0xb5, 0x23, 0x1d, 0x69, 0xae, 0x20, + 0x6d, 0x71, 0x01, 0xd5, 0x09, 0x5f, 0xa1, 0xf7, 0x9c, 0x68, 0x35, 0xa7, + 0xab, 0x8c, 0xdf, 0xd3, 0xf0, 0x8c, 0xd6, 0xc1, 0xf1, 0xe3, 0xe7, 0x47, + 0xba, 0x48, 0x55, 0x3f, 0x4e, 0x74, 0x8f, 0x86, 0x62, 0x31, 0xd2, 0x2a, + 0x86, 0x59, 0x1c, 0x14, 0x88, 0xd3, 0xa5, 0xcc, 0x7b, 0x90, 0x5f, 0x29, + 0x56, 0xfa, 0x81, 0xed, 0xe9, 0xea, 0x1e, 0x2b, 0x0c, 0x0b, 0xda, 0x42, + 0x59, 0xea, 0x27, 0xcf, 0x4a, 0x1a, 0xc2, 0x89, 0x6e, 0x20, 0x2a, 0x06, + 0x2d, 0xad, 0x40, 0x52, 0x09, 0x66, 0xfa, 0xc0, 0xa9, 0x26, 0x30, 0x9c, + 0xc4, 0x73, 0x05, 0x60, 0xf9, 0xf4, 0x9f, 0xf5, 0xa7, 0x9e, 0xfb, 0xd2, + 0xb6, 0x13, 0xba, 0x3e, 0x3a, 0xbc, 0x79, 0xf7, 0x9d, 0x9c, 0xd9, 0x8d, + 0x03, 0x7b, 0x38, 0xaa, 0xa5, 0x73, 0x5a, 0x3e, 0xa4, 0x47, 0xc7, 0xf3, + 0xf8, 0x6c, 0x2e, 0xae, 0x0b, 0x51, 0x68, 0xcf, 0x30, 0x64, 0x73, 0x9f, + 0xb1, 0x60, 0xda, 0x61, 0x52, 0x35, 0x32, 0xe4, 0x1c, 0x17, 0x1b, 0x38, + 0x4f, 0xf7, 0xb9, 0xca, 0xf8, 0x73, 0x00, 0x3e, 0x09, 0xc5, 0xd7, 0x55, + 0x30, 0xf5, 0x7c, 0xc6, 0x66, 0x1f, 0xad, 0x07, 0xcb, 0xcf, 0x79, 0xb3, + 0x4f, 0xde, 0xf2, 0x0a, 0x1e, 0x60, 0x36, 0xdd, 0xfb, 0x37, 0xfc, 0x2c, + 0x4e, 0xe7, 0x3a, 0x8c, 0x01, 0xec, 0x41, 0x3c, 0x0c, 0x6c, 0x99, 0xb6, + 0x2d, 0xa1, 0x83, 0x56, 0xad, 0x45, 0x33, 0x59, 0x93, 0x22, 0x94, 0x2f, + 0xab, 0x8a, 0xd7, 0xae, 0x3b, 0xdb, 0x2d, 0xa9, 0x33, 0x76, 0x70, 0x72, + 0xb5, 0x2a, 0xf0, 0xa0, 0x5d, 0xe5, 0x7f, 0x57, 0xd5, 0x63, 0xa7, 0x7c, + 0x11, 0x59, 0x51, 0xdd, 0x90, 0xba, 0xba, 0xaa, 0x1b, 0x4b, 0x98, 0xa0, + 0x5b, 0xd5, 0xb4, 0x88, 0x2e, 0x8a, 0x7e, 0x43, 0x3a, 0xec, 0xaa, 0x9a, + 0xd6, 0xf0, 0x67, 0x00, 0x65, 0xab, 0x3f, 0x4e, 0xaa, 0xbb, 0x73, 0xdf, + 0xdb, 0xc2, 0xcd, 0xa1, 0x5c, 0xaf, 0x67, 0x97, 0x07, 0x32, 0x06, 0x70, + 0xa1, 0xe1, 0x6a, 0xb0, 0xbd, 0xdd, 0xad, 0xc2, 0xb6, 0xaf, 0x02, 0xb6, + 0x4b, 0xa6, 0x73, 0xda, 0x77, 0xf3, 0x5b, 0xcf, 0xd5, 0x16, 0xff, 0x9f, + 0x25, 0x8b, 0x7f, 0x8b, 0x47, 0x6f, 0x5a, 0xc9, 0x2c, 0x93, 0x6a, 0x68, + 0xdd, 0xdc, 0x4c, 0xe8, 0x92, 0x9a, 0x05, 0x65, 0x9a, 0xd8, 0x7c, 0xfe, + 0x73, 0x4b, 0xbb, 0x76, 0xcf, 0xf7, 0xb0, 0x9f, 0x81, 0x25, 0xcf, 0x3f, + 0x27, 0x93, 0xba, 0x70, 0x95, 0xcb, 0x29, 0x34, 0x0a, 0xf9, 0x43, 0x58, + 0xe3, 0x5d, 0xae, 0x10, 0xe4, 0xb9, 0xe3, 0xea, 0x84, 0xf4, 0x81, 0x98, + 0xf4, 0x0d, 0x12, 0xc5, 0x06, 0xe2, 0x7d, 0x40, 0xe5, 0xa0, 0x33, 0x44, + 0xce, 0xe3, 0xef, 0x8c, 0xf9, 0x21, 0x20, 0x8b, 0xde, 0x87, 0x96, 0xbf, + 0x35, 0x89, 0x95, 0x3d, 0x68, 0xe8, 0xc5, 0x63, 0x2e, 0x03, 0x8b, 0x62, + 0x97, 0xfc, 0x5a, 0x87, 0xf2, 0x2d, 0x03, 0x26, 0x67, 0x04, 0x0c, 0x7e, + 0x35, 0x01, 0x83, 0x17, 0x40, 0x42, 0xa1, 0xa1, 0xd7, 0x4c, 0x11, 0x9d, + 0x8f, 0x8a, 0x90, 0xe0, 0xe1, 0xb6, 0x77, 0x8b, 0xdb, 0x85, 0x51, 0x1f, + 0x70, 0x58, 0xa7, 0x91, 0xd9, 0x1d, 0x52, 0x86, 0xa7, 0x6a, 0xa4, 0x3a, + 0xd3, 0x06, 0xf8, 0x87, 0x70, 0xdf, 0x67, 0xc5, 0x4b, 0x72, 0x14, 0xdd, + 0x90, 0xc3, 0x2c, 0xa0, 0x5a, 0x6f, 0x38, 0x3d, 0x55, 0xbe, 0x74, 0xc4, + 0x7a, 0xf9, 0x70, 0x98, 0xe0, 0x14, 0xf5, 0x64, 0x4e, 0x7f, 0xe1, 0x29, + 0x39, 0x87, 0x41, 0xcf, 0xe1, 0x0d, 0xe1, 0x3a, 0x23, 0xca, 0x0f, 0x7c, + 0xa4, 0x58, 0xeb, 0x5f, 0xb0, 0xfb, 0x1f, 0x6e, 0x5f, 0x78, 0x9f, 0x44, + 0x65, 0x24, 0xdf, 0xae, 0xd1, 0xc4, 0x80, 0xce, 0x04, 0x36, 0x1a, 0x03, + 0x43, 0x56, 0x6f, 0x51, 0x85, 0x68, 0xb3, 0x30, 0x89, 0x56, 0x49, 0x7a, + 0x49, 0xe9, 0xdd, 0x52, 0xb9, 0x2b, 0xb3, 0x1b, 0x0c, 0xd3, 0x50, 0x12, + 0x54, 0x01, 0xee, 0x0f, 0xdc, 0x32, 0xe5, 0x2c, 0xe7, 0x9f, 0xd3, 0xcd, + 0xe0, 0x56, 0xc2, 0x47, 0xfb, 0xa8, 0x3a, 0xfa, 0x16, 0x80, 0x79, 0x70, + 0xeb, 0x48, 0x68, 0x13, 0x59, 0xe0, 0x1b, 0x58, 0x67, 0xe2, 0x7d, 0x74, + 0xe2, 0xe4, 0x5a, 0xa0, 0x08, 0xde, 0x76, 0xf2, 0xde, 0xc7, 0x19, 0x4e, + 0xc9, 0x34, 0x81, 0xb7, 0xf9, 0x37, 0x89, 0xc2, 0x03, 0x07, 0x08, 0x76, + 0xc2, 0x2e, 0xc5, 0x6b, 0xd2, 0x8e, 0xb7, 0x75, 0x7a, 0xdc, 0x4f, 0x32, + 0x62, 0x5c, 0xb7, 0xee, 0x26, 0x0b, 0x65, 0x86, 0x67, 0x91, 0x3b, 0xc6, + 0xcb, 0x4f, 0xcd, 0xae, 0x06, 0x8b, 0xbc, 0x33, 0x77, 0x7e, 0x1d, 0xc8, + 0xb3, 0x92, 0xac, 0x52, 0x64, 0xc7, 0x49, 0x36, 0xef, 0xb0, 0xf6, 0xc2, + 0xcd, 0xcf, 0x29, 0x35, 0x47, 0xb9, 0x5d, 0xba, 0x70, 0xaf, 0x16, 0x8a, + 0xef, 0x44, 0xa1, 0x58, 0x03, 0xaf, 0x00, 0x4b, 0xd3, 0x58, 0x63, 0xd3, + 0x1a, 0xe7, 0x54, 0xdb, 0x37, 0x84, 0x1c, 0x53, 0x03, 0x63, 0xa8, 0xa6, + 0x14, 0xb4, 0x07, 0x13, 0x98, 0x4c, 0x8e, 0x70, 0x02, 0x28, 0xfe, 0x88, + 0xae, 0x0e, 0xd9, 0x7e, 0x63, 0x09, 0xe0, 0xe6, 0x58, 0x2a, 0x07, 0xb6, + 0x4c, 0x0a, 0x98, 0x06, 0xeb, 0x10, 0x62, 0x11, 0x0c, 0x5b, 0x14, 0x91, + 0xcf, 0x2e, 0xb0, 0x41, 0x84, 0x51, 0x0a, 0xc5, 0xce, 0x97, 0xd0, 0x34, + 0x42, 0xa6, 0xb6, 0x18, 0xc0, 0x67, 0xdd, 0x94, 0x7b, 0x85, 0xdc, 0xe5, + 0xe4, 0x8d, 0x66, 0x34, 0x00, 0x87, 0xe2, 0xa2, 0x24, 0x94, 0x0a, 0x23, + 0x29, 0x4a, 0x8c, 0xb6, 0x27, 0x8d, 0xae, 0x58, 0xb7, 0x15, 0x01, 0x4a, + 0xc0, 0x42, 0xe4, 0x2a, 0x4e, 0x01, 0x87, 0x81, 0xbc, 0xdf, 0x60, 0x50, + 0xc9, 0x3f, 0x62, 0x6a, 0x26, 0x5f, 0xbc, 0xf5, 0x05, 0xb9, 0xe0, 0xd8, + 0x3c, 0x65, 0xd1, 0xae, 0xc1, 0xfc, 0x5c, 0x6c, 0x09, 0x8b, 0x0b, 0x0c, + 0xfe, 0x4a, 0x89, 0x79, 0xab, 0x17, 0x12, 0x57, 0x9f, 0x7f, 0xef, 0xd4, + 0x24, 0xec, 0x4e, 0xdd, 0x9c, 0x65, 0x2b, 0x7c, 0x22, 0xd9, 0x68, 0x53, + 0xab, 0x97, 0x96, 0x28, 0xcb, 0x66, 0xbd, 0x84, 0xd5, 0xbf, 0x33, 0xce, + 0x12, 0x0a, 0x1f, 0xaf, 0xed, 0xaa, 0xcf, 0x47, 0x91, 0xee, 0xb6, 0xf9, + 0x3f, 0xf9, 0x9f, 0xc5, 0x7b, 0x54, 0x83, 0x60, 0xb4, 0x41, 0x19, 0x8e, + 0x5b, 0x6a, 0x4c, 0xed, 0x69, 0x24, 0x65, 0x6d, 0x6e, 0xe0, 0x32, 0x8f, + 0x84, 0x69, 0xbc, 0x84, 0x80, 0xcb, 0x6b, 0x28, 0x89, 0xe3, 0xdb, 0x94, + 0x96, 0x1e, 0x17, 0x39, 0xee, 0xd5, 0xba, 0xe8, 0xd9, 0x87, 0x82, 0xa6, + 0xc6, 0xe4, 0x30, 0x99, 0x45, 0x73, 0x91, 0xeb, 0x20, 0xb5, 0x07, 0x13, + 0x2a, 0x93, 0x4b, 0x0d, 0xd0, 0x02, 0x87, 0x94, 0x19, 0xc4, 0x70, 0x3c, + 0xf2, 0x9e, 0xc7, 0x8f, 0x85, 0x91, 0x01, 0xaf, 0x79, 0xeb, 0xf4, 0xbd, + 0x56, 0xb0, 0x3c, 0xaa, 0x43, 0x9a, 0x6a, 0x43, 0x13, 0xd0, 0x0d, 0x81, + 0xd9, 0x48, 0x0e, 0x7c, 0x40, 0xf4, 0x4c, 0x38, 0x72, 0x22, 0x33, 0x85, + 0x86, 0x61, 0xcb, 0xc9, 0xcb, 0x7c, 0x21, 0xd9, 0xa9, 0x1e, 0x85, 0x52, + 0x44, 0xd7, 0xbc, 0x6a, 0x60, 0xbb, 0xb5, 0x91, 0xd3, 0xa4, 0x61, 0x62, + 0x91, 0x54, 0x72, 0xb9, 0x15, 0xab, 0xfd, 0xd0, 0x8e, 0x19, 0xb2, 0xdd, + 0x5b, 0x37, 0x26, 0xbe, 0x40, 0x5c, 0x98, 0x2a, 0x3e, 0x9d, 0x71, 0x2b, + 0x8e, 0xd0, 0x60, 0x25, 0xbd, 0x1a, 0x3a, 0x59, 0x2c, 0xa7, 0x64, 0x2b, + 0x30, 0x30, 0x83, 0xb2, 0x39, 0x4c, 0xcb, 0x6a, 0xe2, 0xee, 0x20, 0x2a, + 0x21, 0xc3, 0x0c, 0x19, 0xc6, 0x71, 0x28, 0x9c, 0x61, 0xe0, 0xd7, 0xde, + 0x0d, 0x4e, 0xa1, 0xa1, 0xb0, 0xb1, 0x2c, 0xd6, 0x11, 0xe2, 0xc5, 0x22, + 0x91, 0xd3, 0xbf, 0xa5, 0xe9, 0x5b, 0xf1, 0x2f, 0xc8, 0xd4, 0x70, 0x92, + 0x02, 0xaf, 0x50, 0x60, 0xe8, 0x9d, 0x18, 0xaa, 0xda, 0xe9, 0x06, 0xbc, + 0x58, 0x5a, 0x11, 0x14, 0x8a, 0x09, 0x31, 0xc3, 0xa6, 0xbd, 0x30, 0x36, + 0x46, 0x56, 0x45, 0x5b, 0x3c, 0x0a, 0x45, 0xf7, 0xf5, 0x5c, 0xab, 0x11, + 0x23, 0x6a, 0x45, 0xc0, 0xbe, 0x9f, 0x1d, 0xb0, 0x5d, 0x0c, 0x6c, 0x1b, + 0x43, 0x33, 0x24, 0x64, 0x32, 0x39, 0x20, 0x4a, 0xb5, 0x58, 0x23, 0x31, + 0x1b, 0x0c, 0xeb, 0xe0, 0x76, 0x7c, 0xb7, 0x01, 0x2c, 0x47, 0x81, 0x6a, + 0xd8, 0x8f, 0xd5, 0xb5, 0x37, 0xff, 0xd1, 0x97, 0x6c, 0x1b, 0x5e, 0xec, + 0xa8, 0x18, 0x05, 0xe0, 0x77, 0x62, 0x08, 0x52, 0x64, 0xb8, 0x57, 0x39, + 0x40, 0xc1, 0xcb, 0xd0, 0x1e, 0x02, 0x2b, 0xc5, 0xd8, 0xcd, 0x87, 0x00, + 0xde, 0x3b, 0x10, 0x9b, 0x4c, 0x6a, 0x47, 0x01, 0x07, 0x99, 0xa6, 0x67, + 0xde, 0xc7, 0x55, 0x10, 0xea, 0x71, 0x1d, 0xac, 0x51, 0xbf, 0xcf, 0x07, + 0xc9, 0x95, 0x94, 0x67, 0x4b, 0x96, 0xf2, 0x0e, 0xe4, 0x49, 0xef, 0xdc, + 0xf8, 0x00, 0xc1, 0xef, 0x4e, 0xd5, 0x71, 0x27, 0x17, 0x6c, 0x95, 0xda, + 0x4d, 0xb2, 0xda, 0xcd, 0x1f, 0x5e, 0xdf, 0x3f, 0xc5, 0x80, 0x01, 0xda, + 0xa6, 0xcd, 0x34, 0x7c, 0xf3, 0x26, 0x4f, 0x0b, 0x92, 0x01, 0x1d, 0x7c, + 0x7f, 0x2a, 0x10, 0x62, 0xd5, 0x51, 0x94, 0xd6, 0xf2, 0x73, 0xb0, 0xcc, + 0xd1, 0x4d, 0x8a, 0x6b, 0x78, 0xbb, 0x9d, 0xbd, 0xc4, 0x79, 0x07, 0xcd, + 0xa8, 0x05, 0x84, 0x69, 0xc4, 0xf9, 0x48, 0xd4, 0x04, 0xdf, 0x0b, 0x6f, + 0x21, 0x94, 0x5d, 0x7b, 0x43, 0xc1, 0x9b, 0x2f, 0xa7, 0x55, 0x02, 0x54, + 0x25, 0xbc, 0x3f, 0x87, 0xce, 0x0a, 0x3f, 0xa1, 0xf2, 0xe8, 0xd8, 0x77, + 0xde, 0xca, 0x9a, 0x36, 0x51, 0x42, 0x62, 0xca, 0x87, 0x26, 0xfc, 0x7b, + 0x70, 0xfb, 0xf6, 0x24, 0xb5, 0xa7, 0xf9, 0x4a, 0x65, 0x64, 0x9e, 0x52, + 0x19, 0xb6, 0x79, 0x6b, 0xd3, 0xca, 0x12, 0xe0, 0xd2, 0xe4, 0x38, 0x57, + 0x29, 0x42, 0x79, 0x87, 0xff, 0xd8, 0xe0, 0xa8, 0xb8, 0x93, 0xe8, 0x23, + 0x67, 0x18, 0x2f, 0xbd, 0x10, 0x80, 0x94, 0x9f, 0x69, 0xd9, 0x65, 0xa4, + 0x00, 0x24, 0x87, 0xea, 0x1a, 0xe1, 0x01, 0xba, 0x03, 0xb2, 0x5e, 0xa5, + 0x70, 0x60, 0x68, 0x91, 0xc6, 0xdf, 0x92, 0x59, 0x4c, 0x4e, 0x14, 0x42, + 0xe2, 0x78, 0xca, 0xd9, 0x6d, 0x02, 0x2a, 0x85, 0x9a, 0x8d, 0x43, 0x1d, + 0x02, 0xc8, 0x1f, 0x9b, 0xca, 0x5a, 0x3e, 0xcb, 0x42, 0xd6, 0xb1, 0x1b, + 0xf1, 0x49, 0x4a, 0x77, 0xbe, 0xa7, 0x54, 0xea, 0xde, 0xc3, 0x6a, 0xef, + 0x15, 0x18, 0x83, 0x30, 0xe5, 0x5a, 0x17, 0xb2, 0xc4, 0xdb, 0xb6, 0xef, + 0x3a, 0xb9, 0xd5, 0xfc, 0xac, 0x94, 0x6f, 0x95, 0x2f, 0x9e, 0xe5, 0x7f, + 0xf9, 0xfe, 0x68, 0x75, 0xef, 0x13, 0x84, 0x2c, 0x19, 0xbe, 0x52, 0x5a, + 0x05, 0x04, 0x49, 0x80, 0x98, 0xc8, 0x77, 0xf1, 0x76, 0xf6, 0x96, 0x68, + 0x6d, 0xe8, 0xe4, 0x3c, 0xa9, 0x10, 0xb1, 0xd6, 0x2a, 0x46, 0xbf, 0x5e, + 0x11, 0xc6, 0x94, 0x97, 0xdb, 0x95, 0x61, 0x4c, 0x9b, 0xe0, 0x19, 0x6b, + 0x03, 0xb4, 0x55, 0x07, 0xd4, 0xa9, 0x2c, 0x46, 0xb1, 0x60, 0x74, 0x00, + 0x41, 0xc1, 0x28, 0x4b, 0x00, 0x06, 0xd8, 0x02, 0x49, 0xc3, 0x02, 0x91, + 0x46, 0xf0, 0x76, 0x70, 0x49, 0x5e, 0xb5, 0x99, 0xe6, 0x91, 0x4f, 0xd2, + 0x72, 0x22, 0xed, 0xc8, 0x72, 0x18, 0xd4, 0xaa, 0x89, 0x24, 0xdb, 0xa7, + 0xee, 0x61, 0x4d, 0x95, 0x55, 0xf3, 0x50, 0x31, 0x51, 0x3f, 0xca, 0xc1, + 0x89, 0xe5, 0xda, 0x71, 0x69, 0x4a, 0xc6, 0x88, 0x93, 0x48, 0x7c, 0x32, + 0x4c, 0x09, 0xb7, 0x47, 0x2b, 0xb1, 0xc6, 0x10, 0x11, 0x6f, 0x86, 0x94, + 0x28, 0x84, 0x81, 0x28, 0xf8, 0xb9, 0x21, 0x93, 0x00, 0xe6, 0xca, 0x28, + 0x37, 0x05, 0x86, 0x9c, 0x38, 0x34, 0x92, 0x60, 0x1a, 0x64, 0x5b, 0x81, + 0x7b, 0x5d, 0x89, 0xf7, 0x40, 0x35, 0x9a, 0xcd, 0x30, 0x14, 0xa3, 0x61, + 0x8b, 0x12, 0xde, 0x91, 0xa6, 0x0d, 0xad, 0x50, 0x56, 0x80, 0x01, 0x98, + 0xad, 0xb1, 0x63, 0xed, 0xdd, 0x9a, 0x5f, 0xc5, 0xcd, 0xe5, 0x39, 0xbd, + 0xbb, 0xfc, 0xda, 0x18, 0xdc, 0xc2, 0x2a, 0xbf, 0xb1, 0x15, 0xa6, 0x4f, + 0xa3, 0xc1, 0xf9, 0xa2, 0x2b, 0xfe, 0x9b, 0xa0, 0x31, 0xe3, 0xb7, 0x01, + 0x34, 0x67, 0xa0, 0xd7, 0x50, 0xcc, 0xa9, 0x9e, 0x4e, 0x69, 0xf6, 0x00, + 0xc0, 0x83, 0x00, 0x51, 0x18, 0xba, 0xc5, 0x9e, 0xeb, 0xb9, 0x75, 0xa8, + 0xd1, 0xf3, 0x9b, 0xe7, 0xac, 0x88, 0xb7, 0xec, 0x02, 0xec, 0x9d, 0x55, + 0x59, 0x11, 0xdb, 0xb2, 0x6e, 0x75, 0x5b, 0x75, 0x42, 0x3f, 0x9f, 0xc4, + 0x88, 0x3f, 0x8a, 0xd8, 0x8b, 0x51, 0x1c, 0xc2, 0x6a, 0x1a, 0xe0, 0xd9, + 0xf1, 0xab, 0xab, 0x29, 0x66, 0xc8, 0xbc, 0x86, 0x38, 0xe1, 0x92, 0x99, + 0x34, 0x90, 0x5d, 0x96, 0x42, 0xe6, 0xe8, 0x42, 0x8e, 0x7e, 0x6a, 0xdc, + 0x47, 0x75, 0xa3, 0x91, 0x91, 0x00, 0xec, 0x66, 0x8c, 0x3f, 0xc3, 0x6a, + 0x4a, 0x12, 0x12, 0x45, 0x26, 0x50, 0x4c, 0x04, 0x82, 0x78, 0x5c, 0xcd, + 0x85, 0x7c, 0xe2, 0xbc, 0x27, 0x18, 0x70, 0x06, 0x76, 0x5d, 0x2a, 0xfb, + 0x81, 0x23, 0x37, 0x0c, 0x47, 0xa1, 0x61, 0x8b, 0x1e, 0x3c, 0xe3, 0x59, + 0xe2, 0x1b, 0xda, 0xda, 0xf8, 0xa3, 0x32, 0xfc, 0x63, 0xb1, 0x97, 0xda, + 0xc4, 0x2d, 0x11, 0xd0, 0x59, 0xa1, 0xa5, 0xc3, 0xba, 0x12, 0xb7, 0x36, + 0xde, 0xfe, 0xf4, 0xda, 0xae, 0x03, 0xe2, 0xe1, 0xb2, 0x65, 0x0b, 0x1c, + 0xb3, 0x03, 0x9a, 0x4e, 0x64, 0x88, 0xa0, 0x7e, 0xa1, 0xfd, 0xe2, 0x60, + 0x2a, 0xaa, 0x19, 0x9c, 0xf5, 0x25, 0xd2, 0xaf, 0x63, 0x99, 0x4a, 0x32, + 0x90, 0x72, 0x41, 0xb2, 0x49, 0xe5, 0x48, 0xd2, 0x53, 0x63, 0x4e, 0x94, + 0x32, 0xb2, 0x58, 0x5c, 0x05, 0x0a, 0x18, 0x24, 0x63, 0xb0, 0xaf, 0x5d, + 0x0e, 0xc8, 0x4f, 0x4a, 0x90, 0xbe, 0x3d, 0x21, 0x08, 0x3b, 0xbd, 0x37, + 0x84, 0xf1, 0x66, 0x8c, 0x6b, 0xee, 0x70, 0xa0, 0x0b, 0x40, 0xb7, 0x60, + 0x05, 0xd6, 0x82, 0x55, 0x77, 0xea, 0xb9, 0x43, 0x2d, 0xd1, 0x21, 0x02, + 0xd1, 0x31, 0x8e, 0x90, 0xd1, 0xa0, 0xa9, 0xfc, 0xd5, 0xd6, 0x06, 0x44, + 0x2a, 0xe4, 0x79, 0x06, 0x88, 0x05, 0x81, 0x37, 0xcf, 0xf4, 0x38, 0x73, + 0x2d, 0x76, 0x0b, 0x76, 0xe7, 0x15, 0xe5, 0xa3, 0x6b, 0x36, 0x2f, 0xa5, + 0xdd, 0x9c, 0x8d, 0x4f, 0x13, 0x6a, 0xb5, 0x8a, 0xca, 0xeb, 0x16, 0xf2, + 0xef, 0x67, 0x80, 0x18, 0xe8, 0x0b, 0xfc, 0x71, 0xe7, 0xee, 0xb4, 0x20, + 0x25, 0xc0, 0xe6, 0x16, 0x24, 0x0e, 0xaa, 0x70, 0xee, 0xb6, 0x07, 0x7b, + 0xa7, 0x10, 0x80, 0xb4, 0xbd, 0x79, 0x13, 0xba, 0xc5, 0x16, 0x5d, 0xd4, + 0x40, 0x67, 0x39, 0xb9, 0x3b, 0x47, 0x06, 0xce, 0x2e, 0xf9, 0xe7, 0x36, + 0x01, 0x76, 0x26, 0x9e, 0x47, 0xed, 0xeb, 0x8a, 0xf5, 0x5e, 0xce, 0xa5, + 0x7a, 0xdd, 0x91, 0x31, 0x3d, 0xdd, 0xb3, 0x9c, 0x8b, 0x4b, 0xd7, 0xa6, + 0x18, 0x05, 0x4f, 0xd2, 0x5d, 0xa4, 0xa1, 0xfa, 0xf1, 0x97, 0x45, 0x36, + 0x78, 0xa0, 0xd5, 0xe8, 0x29, 0x4d, 0x5a, 0xb5, 0x64, 0x2b, 0x5b, 0x58, + 0x0a, 0x77, 0x35, 0x99, 0xe0, 0x0a, 0xe3, 0xf6, 0x24, 0x0c, 0x3f, 0x57, + 0xb3, 0x53, 0x6e, 0xa7, 0xfc, 0x4e, 0x49, 0xc1, 0xf8, 0x04, 0x8c, 0xa6, + 0x08, 0x60, 0x48, 0x43, 0x85, 0x5e, 0x30, 0xc3, 0x46, 0x67, 0x8c, 0xc0, + 0x85, 0x94, 0x7b, 0x9a, 0x69, 0x8b, 0xc9, 0x55, 0x47, 0xd1, 0xba, 0x8c, + 0xd5, 0xd5, 0x45, 0xbf, 0x20, 0xa0, 0xb2, 0x2a, 0xd1, 0x7b, 0x30, 0xe5, + 0x8c, 0xea, 0xe7, 0x7c, 0xd9, 0x45, 0xd3, 0x74, 0x25, 0x1a, 0xc1, 0x17, + 0x94, 0x76, 0x7d, 0xaa, 0xc4, 0x7f, 0xe2, 0x7d, 0xe2, 0x50, 0x92, 0x17, + 0x72, 0xf2, 0x3f, 0x57, 0x02, 0xec, 0xe2, 0x0d, 0x25, 0xe1, 0xc6, 0x5f, + 0x51, 0xe6, 0x15, 0xdf, 0x5a, 0x09, 0x92, 0xd0, 0x1c, 0xae, 0xcb, 0x9a, + 0x22, 0x7c, 0x62, 0xe6, 0x66, 0x68, 0x84, 0x82, 0x29, 0x5b, 0xe2, 0xc5, + 0x88, 0x96, 0xc2, 0x19, 0x59, 0x3d, 0xec, 0xad, 0x6e, 0x60, 0xf3, 0x5f, + 0x20, 0x9c, 0x3f, 0x83, 0xce, 0x02, 0x02, 0x9d, 0x62, 0xf1, 0xad, 0xb8, + 0x54, 0x5c, 0x0a, 0x86, 0x89, 0xbf, 0x14, 0x84, 0x0c, 0xfa, 0xe1, 0xef, + 0x10, 0xd8, 0x76, 0x5f, 0x95, 0x6a, 0x36, 0x12, 0xc7, 0x62, 0x10, 0x8e, + 0x51, 0x13, 0x2d, 0x76, 0x95, 0x0d, 0xd3, 0xce, 0x29, 0x2d, 0x63, 0x54, + 0x53, 0x6a, 0x8a, 0xfd, 0xb4, 0xe6, 0xd8, 0xb8, 0x68, 0x67, 0xb6, 0x43, + 0xe4, 0xfc, 0x2a, 0x7a, 0x2f, 0xb7, 0x3c, 0x11, 0x6e, 0x61, 0x22, 0x60, + 0x63, 0xee, 0x22, 0x2a, 0xb0, 0xb7, 0xc6, 0x53, 0xb4, 0x30, 0xcd, 0x03, + 0xc7, 0x11, 0x81, 0xee, 0x5d, 0x00, 0xf3, 0xf6, 0x19, 0xd1, 0xda, 0xe6, + 0x94, 0x12, 0x39, 0x70, 0x25, 0xe1, 0xcf, 0x5c, 0x49, 0x5d, 0x17, 0xe0, + 0x4d, 0xba, 0x10, 0x5a, 0x3c, 0x47, 0x73, 0xcb, 0xf5, 0xa4, 0xc9, 0x5b, + 0x56, 0x21, 0x55, 0x10, 0xb1, 0x82, 0x18, 0x17, 0x2b, 0x98, 0x1b, 0x54, + 0xc7, 0x55, 0x80, 0x40, 0xd9, 0x70, 0xf6, 0x48, 0x13, 0xf2, 0x16, 0xd8, + 0x2e, 0x56, 0xb6, 0xc4, 0x6d, 0x7c, 0xeb, 0xca, 0xdc, 0xec, 0xc4, 0xbb, + 0xa2, 0x32, 0x5f, 0xfe, 0x5b, 0xe9, 0x8d, 0x2f, 0xa8, 0xac, 0x85, 0xde, + 0x19, 0x93, 0x97, 0xc1, 0x55, 0xb8, 0x83, 0x60, 0x1b, 0xd5, 0x3c, 0xf9, + 0xb9, 0x78, 0xab, 0x0e, 0x45, 0xf1, 0x2e, 0xe6, 0x40, 0xe8, 0x0c, 0xe7, + 0x89, 0xd7, 0x82, 0xb0, 0x6d, 0x06, 0xfd, 0x79, 0x36, 0x11, 0x49, 0x7a, + 0xf0, 0x7d, 0x0a, 0x59, 0x56, 0x5b, 0xcf, 0x12, 0x19, 0xef, 0x0c, 0xa1, + 0x77, 0x0a, 0x4d, 0x1b, 0x20, 0x79, 0xb3, 0x4e, 0x1f, 0x81, 0xe5, 0x55, + 0xf9, 0xca, 0x21, 0x99, 0x45, 0x33, 0x2a, 0xed, 0x59, 0xea, 0x5b, 0x72, + 0x12, 0x84, 0x12, 0xb0, 0xe4, 0x30, 0x1c, 0x2c, 0xbf, 0x3f, 0x56, 0xcf, + 0x2c, 0xa4, 0x16, 0x38, 0x01, 0x03, 0x2b, 0xfd, 0x86, 0x1c, 0xa1, 0x36, + 0x96, 0x4e, 0x6d, 0xb1, 0x3b, 0x40, 0x8d, 0x11, 0x8f, 0xa3, 0x4e, 0x25, + 0xe8, 0x55, 0xa4, 0x6e, 0x81, 0xa5, 0x12, 0xbd, 0xd5, 0x29, 0x57, 0x6c, + 0x03, 0xf4, 0x0f, 0x99, 0x49, 0xbd, 0xf1, 0xa5, 0x93, 0xf9, 0x05, 0x3a, + 0x4d, 0xb4, 0xbc, 0xc8, 0x54, 0xe8, 0xd3, 0xf6, 0xc1, 0xba, 0x9b, 0x72, + 0x7f, 0x4b, 0x42, 0x16, 0xb9, 0xd7, 0x85, 0x7d, 0x63, 0xda, 0xfb, 0x62, + 0x3f, 0x59, 0x7c, 0x8b, 0x45, 0x99, 0xd3, 0xde, 0xbf, 0x4c, 0xdf, 0x32, + 0x57, 0x07, 0x1c, 0x1f, 0xd6, 0x1e, 0xb5, 0x02, 0x56, 0x07, 0xfc, 0x90, + 0x24, 0xb2, 0xb0, 0x59, 0xc0, 0xc5, 0x69, 0xcf, 0xfc, 0x28, 0x66, 0xef, + 0x62, 0x09, 0xdb, 0xa3, 0xab, 0x93, 0x25, 0x7d, 0x82, 0x33, 0x24, 0xe4, + 0x4b, 0x8c, 0xe7, 0xe3, 0x7b, 0x48, 0x51, 0xa3, 0x0c, 0x0f, 0xb3, 0xc6, + 0xb0, 0x27, 0x73, 0x28, 0x77, 0xb6, 0xc2, 0xce, 0xd2, 0xd1, 0x2d, 0x0e, + 0xd7, 0x17, 0x2d, 0x4c, 0x87, 0x43, 0xae, 0xe8, 0x96, 0x88, 0x3c, 0x93, + 0x21, 0x72, 0x8c, 0xd7, 0x9e, 0xf3, 0x46, 0x0c, 0xea, 0x46, 0x3c, 0xd0, + 0x6d, 0x77, 0x6c, 0x44, 0xc3, 0x2c, 0x00, 0xb9, 0x29, 0x37, 0x56, 0x3c, + 0xd0, 0x09, 0x5e, 0xd2, 0x3c, 0x58, 0x7e, 0xd5, 0x4e, 0xd9, 0x1a, 0x1c, + 0xa9, 0x0f, 0x96, 0x5f, 0x33, 0x92, 0x42, 0x42, 0xd4, 0x34, 0x54, 0xb6, + 0xdc, 0x0d, 0x5d, 0x28, 0xfa, 0x89, 0x63, 0x56, 0x1a, 0x74, 0xc2, 0xa3, + 0x7a, 0x92, 0x27, 0xab, 0xe3, 0xe4, 0x81, 0x9e, 0xb4, 0x99, 0x8e, 0xb2, + 0xa5, 0xa3, 0xef, 0x9e, 0xbb, 0x6c, 0x43, 0x1d, 0x22, 0xec, 0x35, 0xc0, + 0xa6, 0xea, 0x22, 0x15, 0x67, 0x8a, 0xaa, 0xf6, 0x94, 0x2d, 0xd9, 0x1d, + 0xcb, 0x1a, 0x3b, 0x3f, 0x75, 0x37, 0xc4, 0x9b, 0x51, 0xd8, 0x6d, 0x0c, + 0x86, 0xd4, 0x4e, 0x27, 0x91, 0x1e, 0xa2, 0xba, 0xb0, 0xcf, 0x21, 0x16, + 0xca, 0x9a, 0x12, 0x07, 0xc9, 0xe3, 0x66, 0x31, 0xd6, 0x76, 0x3b, 0x4a, + 0x57, 0x88, 0x30, 0x89, 0x50, 0x61, 0x04, 0xba, 0x80, 0x07, 0xca, 0x05, + 0x76, 0x30, 0xf2, 0x29, 0xc5, 0xe4, 0x36, 0x1c, 0x9d, 0x4b, 0x4b, 0xab, + 0xe4, 0x33, 0xe2, 0xd0, 0xf0, 0xd9, 0xda, 0xc0, 0x5a, 0x5d, 0x3a, 0x0e, + 0x6b, 0x75, 0x7b, 0xfd, 0x3a, 0x81, 0x4a, 0x6d, 0xc9, 0x32, 0x7c, 0x18, + 0x45, 0x6c, 0xae, 0x5e, 0x35, 0x34, 0x28, 0x6c, 0x46, 0xf0, 0x65, 0x99, + 0xd8, 0x10, 0x07, 0xfb, 0x2e, 0x87, 0x76, 0xc2, 0x6b, 0xe6, 0x7e, 0x31, + 0xef, 0xcf, 0xc0, 0x04, 0x81, 0x6c, 0x1f, 0xba, 0xf4, 0xae, 0xe0, 0x4d, + 0x30, 0xe9, 0xc5, 0xc9, 0xb2, 0xc3, 0x67, 0xc7, 0x94, 0x44, 0x35, 0x03, + 0x14, 0xd5, 0xc8, 0x76, 0x94, 0xbb, 0x5f, 0x96, 0x38, 0xb2, 0x14, 0x5b, + 0xa8, 0x29, 0x7e, 0xd5, 0xed, 0x39, 0xf9, 0xc2, 0xf3, 0x42, 0xfd, 0x8b, + 0x2f, 0x54, 0xf8, 0xd8, 0x01, 0xdd, 0x7c, 0xa0, 0xf1, 0xb7, 0x54, 0x3d, + 0xa4, 0x91, 0x99, 0x2f, 0x5f, 0x9c, 0xf3, 0xbd, 0x63, 0x2b, 0x1c, 0x25, + 0x8a, 0x59, 0x5e, 0xca, 0xf8, 0x5a, 0xc4, 0xb3, 0x55, 0xa4, 0xaf, 0xa7, + 0x5a, 0x8a, 0xad, 0xcd, 0x97, 0x6a, 0xb8, 0x37, 0x65, 0x51, 0x25, 0x5c, + 0x1a, 0xf7, 0xb5, 0xdc, 0x71, 0x8e, 0x3a, 0x5d, 0x22, 0xd3, 0xb5, 0xe5, + 0xe0, 0xf0, 0xe7, 0x0d, 0xf0, 0xbc, 0x01, 0x78, 0x01, 0x3b, 0x8c, 0xdf, + 0xf6, 0xdd, 0xf6, 0x79, 0x23, 0x34, 0x34, 0xd2, 0x05, 0xe6, 0xde, 0xa2, + 0x91, 0xb2, 0x5a, 0x49, 0xc7, 0x1a, 0x39, 0x09, 0x2c, 0x05, 0xec, 0x9b, + 0x84, 0xc1, 0xe8, 0x45, 0x5b, 0xa4, 0x25, 0x66, 0x91, 0x4e, 0x10, 0xc3, + 0xe9, 0x8b, 0xef, 0x14, 0x92, 0x5d, 0xd1, 0x2a, 0xd0, 0x48, 0x7d, 0x01, + 0x0b, 0x96, 0x43, 0xcf, 0x07, 0xaf, 0x22, 0xdb, 0xc2, 0x92, 0xc1, 0x2d, + 0x3b, 0x6e, 0x14, 0x7e, 0x25, 0xb8, 0x37, 0xa5, 0xae, 0x50, 0x38, 0xf2, + 0x27, 0x7d, 0x08, 0xa3, 0xb5, 0xdf, 0xe1, 0x83, 0xf0, 0x1c, 0xee, 0xd7, + 0xeb, 0x3b, 0x04, 0xe7, 0xea, 0xb9, 0x4e, 0xc1, 0x46, 0x44, 0x6b, 0xc3, + 0x83, 0xf6, 0x0c, 0x66, 0x5e, 0xf5, 0xf6, 0xf2, 0xeb, 0x06, 0x25, 0x9b, + 0xb3, 0xc7, 0x80, 0xdc, 0x71, 0x70, 0x7b, 0x43, 0xfe, 0x05, 0x58, 0x74, + 0x00, 0x78, 0x81, 0x60, 0x19, 0xb1, 0xea, 0x73, 0x37, 0x62, 0xc3, 0x6b, + 0x02, 0xa9, 0x3b, 0x30, 0x45, 0x25, 0xcb, 0x8c, 0x4b, 0x57, 0x21, 0xdc, + 0x02, 0xd9, 0x96, 0x38, 0xb2, 0x78, 0x3f, 0x2a, 0xab, 0xd0, 0xb3, 0x9d, + 0xe0, 0xd9, 0x4e, 0xf0, 0x6c, 0x27, 0x78, 0xb6, 0x13, 0x3c, 0xdb, 0x09, + 0x9e, 0x96, 0xf6, 0xf9, 0x6c, 0x27, 0x78, 0x5e, 0xa8, 0x9f, 0xc5, 0x42, + 0x95, 0xaf, 0x49, 0xcf, 0x76, 0x82, 0xe7, 0x0d, 0xf0, 0xa4, 0x37, 0xc0, + 0xcd, 0xb3, 0x9d, 0xe0, 0xd9, 0x4e, 0xf0, 0x6c, 0x27, 0xf8, 0x4b, 0xdb, + 0x09, 0x46, 0xd8, 0x12, 0xdd, 0xcc, 0xa2, 0xa3, 0x17, 0xe0, 0x2a, 0x22, + 0x0c, 0x6d, 0x73, 0xef, 0x68, 0x21, 0x40, 0x82, 0x40, 0x72, 0x9f, 0x69, + 0x3c, 0x4c, 0x68, 0x82, 0x85, 0x5c, 0x68, 0x81, 0x85, 0xae, 0x45, 0xd2, + 0xbd, 0x16, 0x63, 0xb9, 0x18, 0x43, 0x05, 0x48, 0xb9, 0x81, 0xff, 0xe2, + 0x56, 0x89, 0x87, 0xa5, 0xe9, 0xc1, 0xfa, 0x6a, 0x22, 0x05, 0xaa, 0x5d, + 0x15, 0x80, 0x1e, 0xe6, 0x1d, 0xe6, 0x34, 0xc1, 0xbb, 0x92, 0x39, 0xb8, + 0x44, 0xc8, 0xe2, 0x93, 0x85, 0x6f, 0x9f, 0x7e, 0xe6, 0x23, 0x74, 0x88, + 0x52, 0x46, 0x5c, 0x9f, 0xe6, 0xa7, 0xfd, 0x08, 0x20, 0x32, 0x5f, 0x11, + 0x5a, 0x80, 0xbc, 0x62, 0xcf, 0x05, 0x58, 0x30, 0x91, 0xfc, 0x4e, 0x48, + 0xf4, 0x09, 0xb0, 0x3c, 0xc2, 0x09, 0xb7, 0xd1, 0xc1, 0x4a, 0xe2, 0x9e, + 0x99, 0xa3, 0x83, 0xbb, 0xc3, 0x10, 0xf2, 0xb6, 0x6b, 0xc5, 0x45, 0x08, + 0x15, 0xcd, 0xc7, 0x1a, 0xe2, 0x24, 0x2a, 0x75, 0x7c, 0x03, 0x30, 0x2c, + 0xd5, 0xf4, 0xc8, 0xa9, 0x7f, 0x60, 0xa5, 0xee, 0xb4, 0xc3, 0x38, 0x30, + 0x01, 0x5b, 0xd6, 0xb9, 0x7e, 0x75, 0x06, 0xfa, 0x09, 0x4c, 0x17, 0x33, + 0xd4, 0x36, 0x64, 0x93, 0x19, 0x30, 0x47, 0x27, 0xc8, 0xde, 0xcb, 0xb9, + 0x77, 0x40, 0x3b, 0x7a, 0x9a, 0xa4, 0x63, 0xaf, 0x5f, 0x35, 0xa3, 0x37, + 0x62, 0x85, 0xed, 0x9e, 0x95, 0x30, 0xcd, 0xb4, 0xe6, 0xac, 0x0c, 0x11, + 0x0b, 0x2e, 0x33, 0xe4, 0x18, 0x66, 0x7c, 0x08, 0xac, 0xb9, 0x6b, 0xe2, + 0x91, 0x21, 0xad, 0xaa, 0xab, 0x2c, 0x11, 0xf9, 0x7b, 0x47, 0xa9, 0x52, + 0x3d, 0xc2, 0x5c, 0x5d, 0x79, 0x96, 0xc2, 0x3e, 0x12, 0x7f, 0xed, 0xcb, + 0xa3, 0xa4, 0x46, 0xfb, 0x0a, 0xae, 0xa5, 0x67, 0x7d, 0x24, 0x9a, 0x88, + 0x84, 0x45, 0x38, 0x69, 0x07, 0x1d, 0xda, 0x98, 0x66, 0x0a, 0xc3, 0xc5, + 0xb0, 0x10, 0x47, 0xaa, 0xa5, 0x1e, 0x39, 0x84, 0x51, 0x7d, 0xff, 0xb0, + 0x00, 0xa3, 0x36, 0x0d, 0x19, 0xd2, 0x18, 0x05, 0x8d, 0x41, 0x21, 0xae, + 0xc6, 0xab, 0x84, 0x92, 0x5d, 0x22, 0x94, 0x94, 0x2a, 0x57, 0x24, 0xe5, + 0x2e, 0x99, 0xcb, 0x45, 0x32, 0xc6, 0x06, 0x55, 0xeb, 0xa3, 0x93, 0x25, + 0x97, 0xc9, 0x9f, 0x57, 0x9b, 0x5d, 0x4a, 0xfe, 0x12, 0xaa, 0xb0, 0x65, + 0xba, 0x5e, 0x76, 0x22, 0x60, 0xc0, 0x0f, 0xd0, 0x6a, 0x2f, 0xbb, 0x10, + 0xa6, 0x59, 0x1e, 0x70, 0xcd, 0x23, 0x49, 0xf6, 0x81, 0xd2, 0xb8, 0xae, + 0x91, 0x4c, 0x52, 0x37, 0x4a, 0x82, 0xec, 0x27, 0x2a, 0x9c, 0xbe, 0x5f, + 0x8c, 0x28, 0xb8, 0x96, 0xf0, 0x74, 0x6c, 0x84, 0x60, 0x3e, 0x19, 0xcd, + 0x29, 0x05, 0x30, 0xb9, 0x98, 0x43, 0x56, 0xc3, 0x92, 0x23, 0x9e, 0x3d, + 0x40, 0xb0, 0x6d, 0x41, 0x5e, 0xbc, 0x60, 0xc9, 0xd0, 0x6b, 0x83, 0xf7, + 0x5e, 0x0d, 0xa6, 0xbe, 0xc8, 0x67, 0x1a, 0x2d, 0x0d, 0x41, 0xcb, 0x31, + 0xf3, 0x1c, 0x9d, 0x4d, 0x62, 0xd4, 0x9b, 0xca, 0xca, 0x63, 0x58, 0xcb, + 0x02, 0x4a, 0x45, 0x7c, 0x73, 0xcc, 0x03, 0xcb, 0xc1, 0x0c, 0x36, 0x32, + 0x5d, 0x50, 0x0d, 0x40, 0xc5, 0x97, 0xb1, 0x71, 0xcb, 0xef, 0x83, 0x3e, + 0x17, 0x78, 0x9b, 0xfc, 0x07, 0x2b, 0x68, 0x27, 0xd9, 0xb4, 0xe0, 0x49, + 0x4e, 0x8c, 0x51, 0xbe, 0x56, 0x7e, 0x54, 0x17, 0x3d, 0x11, 0x27, 0x5d, + 0x29, 0xaf, 0x8a, 0xa2, 0xd4, 0xf3, 0xd3, 0xa1, 0x74, 0xae, 0xe7, 0xc0, + 0xb3, 0x0f, 0x25, 0x0c, 0x61, 0x89, 0x24, 0x71, 0x36, 0x1a, 0x93, 0xe0, + 0x81, 0x88, 0xca, 0x3f, 0xc4, 0xb2, 0x63, 0x04, 0x5f, 0x6a, 0x13, 0x2f, + 0x35, 0xd2, 0x5a, 0xcf, 0xe3, 0x11, 0xd2, 0x49, 0x95, 0x4b, 0x35, 0xa6, + 0x7b, 0x4b, 0x3d, 0x7d, 0xcf, 0x92, 0xf1, 0xfb, 0xcd, 0x2e, 0x3a, 0x07, + 0x92, 0x91, 0xc2, 0x94, 0x2f, 0xa5, 0x52, 0x5c, 0xd2, 0x9b, 0x60, 0x00, + 0x6b, 0xd4, 0x89, 0x74, 0x95, 0x54, 0xa0, 0x59, 0xb5, 0x12, 0x2c, 0x8f, + 0xea, 0xc1, 0xc7, 0x1e, 0x09, 0x93, 0xd8, 0xc3, 0x89, 0xb7, 0x1f, 0x64, + 0xdd, 0xcb, 0x52, 0xfc, 0x0e, 0xb0, 0x03, 0x10, 0xc9, 0x00, 0x5e, 0xca, + 0x6a, 0x8a, 0xd0, 0xb3, 0x22, 0x4f, 0x24, 0x78, 0x05, 0x57, 0xe9, 0x48, + 0xfb, 0x72, 0x1d, 0xde, 0x93, 0xdc, 0xb1, 0xe4, 0x66, 0x85, 0x5d, 0x8c, + 0x01, 0xd6, 0x44, 0x93, 0xa5, 0x34, 0x8a, 0x3b, 0xad, 0x0f, 0x94, 0xbe, + 0x25, 0x3f, 0xd9, 0x71, 0x8e, 0x05, 0xcd, 0x34, 0xbe, 0xf9, 0x60, 0xec, + 0xba, 0x7e, 0xa1, 0x0c, 0xe6, 0x23, 0xc9, 0x8f, 0x20, 0x8d, 0x17, 0x50, + 0x20, 0x34, 0x13, 0xf1, 0x1a, 0x81, 0x13, 0xf0, 0x86, 0x63, 0x7f, 0x3b, + 0x4a, 0x39, 0x6f, 0x3a, 0xbe, 0xdf, 0x73, 0x27, 0xca, 0xd7, 0x37, 0x14, + 0x6f, 0x4b, 0xb9, 0x0c, 0x95, 0x5d, 0x6a, 0x25, 0xac, 0x88, 0x3a, 0x7d, + 0x74, 0x1b, 0xf9, 0x6a, 0x02, 0x0b, 0x4e, 0xa6, 0x57, 0x6d, 0x23, 0x4a, + 0x93, 0x89, 0x5a, 0x73, 0x7c, 0xae, 0x96, 0xe6, 0x23, 0x0f, 0xd4, 0x8c, + 0x03, 0x34, 0xf2, 0x9a, 0xdd, 0xf9, 0x28, 0x53, 0xb8, 0x3f, 0xde, 0x04, + 0xc6, 0x0f, 0xb7, 0xa5, 0x65, 0x9a, 0x0d, 0x63, 0x43, 0x61, 0x15, 0x3b, + 0x6f, 0xad, 0x99, 0xda, 0x3b, 0x0e, 0x76, 0x21, 0x27, 0xa8, 0xcc, 0x80, + 0x03, 0x7b, 0xaf, 0x75, 0xa5, 0x60, 0xde, 0xdd, 0x3b, 0xe0, 0x63, 0x88, + 0xad, 0x26, 0x0a, 0x67, 0xe7, 0xe3, 0xde, 0x25, 0x30, 0x59, 0x3b, 0xed, + 0x2f, 0x64, 0x45, 0x9b, 0x5a, 0x72, 0xf5, 0xe9, 0xa1, 0xf6, 0xc4, 0x4e, + 0x32, 0x31, 0xe3, 0xf6, 0xf5, 0xec, 0x32, 0x3e, 0x15, 0x43, 0x7d, 0xea, + 0x01, 0xa3, 0x64, 0x3a, 0x5d, 0xc2, 0x6e, 0x29, 0x4b, 0x5e, 0x58, 0x20, + 0x19, 0xc8, 0xa5, 0xb5, 0xf1, 0x2b, 0x69, 0x51, 0xb0, 0x25, 0x87, 0x0e, + 0x2a, 0x4f, 0xfe, 0x34, 0xf4, 0xd1, 0x90, 0x99, 0xb9, 0x0f, 0x9e, 0x73, + 0x5d, 0x2d, 0xb4, 0x15, 0xbc, 0xd3, 0x49, 0x85, 0x15, 0x6d, 0xdd, 0x3c, + 0x53, 0xb0, 0xdc, 0x7a, 0xab, 0xfe, 0xf4, 0xd0, 0x14, 0x2c, 0x3e, 0x7d, + 0x3e, 0x14, 0x2c, 0xaf, 0xc5, 0xc8, 0x7b, 0x45, 0x5b, 0xaf, 0x5e, 0x1a, + 0x57, 0x68, 0x8e, 0xb1, 0x75, 0x55, 0x2e, 0x26, 0xfc, 0x36, 0x65, 0x85, + 0x16, 0x2f, 0x73, 0x62, 0x65, 0x2a, 0x61, 0xa6, 0xe2, 0x46, 0x9f, 0xf2, + 0xcf, 0x62, 0x5d, 0x8f, 0xfe, 0xca, 0xf5, 0x70, 0xe7, 0x16, 0xc4, 0x73, + 0xbb, 0x0e, 0xce, 0xad, 0x3e, 0xa5, 0x6b, 0xed, 0x5e, 0xab, 0x52, 0x7f, + 0x7c, 0x38, 0xcf, 0xe5, 0xa1, 0xd7, 0x39, 0x12, 0xe7, 0x97, 0xbf, 0xfb, + 0x33, 0x6e, 0x6d, 0x38, 0x4d, 0xa4, 0x2e, 0xee, 0xb2, 0x9a, 0xf4, 0xb7, + 0x5a, 0x31, 0x4a, 0x8e, 0xd2, 0xb6, 0xc5, 0x26, 0xce, 0xb9, 0xb9, 0x2f, + 0xbd, 0x33, 0x5c, 0xbd, 0xcf, 0xc5, 0x0c, 0x21, 0xe4, 0x1a, 0x2d, 0xb6, + 0x7a, 0xb2, 0xc1, 0xa4, 0x9d, 0x52, 0x1f, 0xb7, 0x7d, 0xcd, 0x0d, 0x84, + 0x34, 0xcf, 0xb1, 0xe1, 0x8e, 0x9d, 0xb6, 0xe6, 0x76, 0x7e, 0x37, 0xa7, + 0xd8, 0xc8, 0xaf, 0x6c, 0xe6, 0x72, 0xa1, 0x1a, 0xe3, 0xd0, 0x73, 0x58, + 0x30, 0x2a, 0xe8, 0x1d, 0x3f, 0x12, 0x89, 0xb3, 0x23, 0x8e, 0x64, 0x36, + 0xb7, 0xfc, 0x4b, 0xef, 0xcc, 0xc7, 0xfe, 0xa4, 0x94, 0xe4, 0x0d, 0x94, + 0x6c, 0xeb, 0x43, 0xb7, 0xc4, 0xae, 0xa8, 0x92, 0x7a, 0x90, 0x4c, 0x83, + 0x92, 0xdb, 0x19, 0xef, 0x34, 0xdd, 0xec, 0x62, 0x23, 0xf8, 0xeb, 0xf0, + 0x98, 0x63, 0xe7, 0x45, 0x17, 0x7b, 0x1f, 0xe9, 0xe2, 0x99, 0x22, 0x19, + 0xb8, 0x0c, 0xb8, 0x94, 0x6b, 0x9a, 0x12, 0xf9, 0xb8, 0x6e, 0x10, 0xfa, + 0x8e, 0x06, 0x74, 0xca, 0x10, 0xb1, 0x78, 0x86, 0xfa, 0x4e, 0xf2, 0x98, + 0xdf, 0x05, 0x35, 0x85, 0x6b, 0xba, 0xe9, 0x97, 0x58, 0x25, 0x4e, 0xae, + 0x28, 0xcd, 0x1a, 0xc2, 0x12, 0x2f, 0x45, 0x5e, 0xce, 0xbb, 0xa8, 0x79, + 0x01, 0x43, 0x1e, 0xcb, 0xc4, 0x89, 0x3e, 0xf3, 0xda, 0x71, 0x08, 0x63, + 0x09, 0xac, 0x6e, 0x84, 0xde, 0xa0, 0xa6, 0x84, 0x99, 0x1a, 0x11, 0x41, + 0x36, 0x11, 0x79, 0x37, 0xc8, 0xa1, 0x87, 0x9a, 0x1b, 0x1d, 0x51, 0x59, + 0xec, 0xbc, 0x58, 0x69, 0xdf, 0x1a, 0x13, 0x33, 0x70, 0xec, 0x42, 0x6b, + 0x11, 0x57, 0xc9, 0x08, 0xff, 0xbe, 0x7c, 0xb9, 0x5f, 0xcb, 0x57, 0xa1, + 0x08, 0xf9, 0x44, 0x6e, 0x6a, 0x0f, 0x10, 0x34, 0x42, 0x69, 0x75, 0x48, + 0x8a, 0x58, 0x10, 0x71, 0xec, 0xe1, 0x1a, 0xa9, 0x55, 0x00, 0x5f, 0x61, + 0x9b, 0x6d, 0x00, 0x24, 0x92, 0xe5, 0xec, 0x3b, 0x25, 0x89, 0x25, 0xa9, + 0x91, 0x40, 0x92, 0x45, 0x48, 0x97, 0x92, 0x57, 0xb0, 0xd1, 0xbb, 0x71, + 0xaa, 0x12, 0xc5, 0x66, 0x60, 0x54, 0xa8, 0xca, 0xdf, 0xa7, 0x1f, 0xec, + 0x99, 0xb7, 0x6d, 0xd1, 0x2e, 0x8f, 0xc0, 0x2c, 0x27, 0xf0, 0x90, 0x56, + 0xb7, 0xce, 0x63, 0x4d, 0x78, 0x6f, 0xe4, 0x3d, 0xb7, 0xba, 0xae, 0x85, + 0x5e, 0xa9, 0x4a, 0x24, 0xb6, 0x30, 0xd5, 0xb7, 0xea, 0xf9, 0x42, 0x20, + 0x8a, 0x0b, 0xc7, 0xb3, 0x9d, 0x76, 0x67, 0xcf, 0xc8, 0xae, 0x33, 0xc8, + 0x9f, 0x61, 0x3a, 0xfe, 0x4f, 0x3c, 0x3f, 0xd5, 0x8d, 0x71, 0x18, 0x57, + 0x0a, 0xc0, 0xa9, 0xca, 0xcb, 0x91, 0xd7, 0x5c, 0xda, 0x9e, 0x7e, 0x5a, + 0xdb, 0xca, 0x72, 0x4e, 0xaf, 0x9a, 0xa3, 0x94, 0x19, 0x57, 0x12, 0xff, + 0x47, 0xa8, 0xfd, 0xf8, 0xbc, 0x47, 0x9f, 0xf7, 0xe8, 0x63, 0xd9, 0xa3, + 0x13, 0xfd, 0xc2, 0x2d, 0x28, 0x16, 0xae, 0x99, 0x63, 0xe1, 0x0c, 0xa2, + 0xad, 0xa9, 0x5f, 0xb4, 0xf4, 0x00, 0xdc, 0x38, 0xe2, 0xfd, 0xa8, 0xa9, + 0x59, 0x9c, 0x59, 0xb7, 0xdd, 0x68, 0xd1, 0x86, 0xae, 0xb9, 0x6e, 0x9b, + 0x1e, 0x32, 0x67, 0xed, 0xbd, 0xf0, 0xc9, 0xbd, 0xfe, 0xbb, 0xec, 0xfd, + 0xd5, 0xce, 0x0f, 0xca, 0xe3, 0x1a, 0xf0, 0x9b, 0xe0, 0x57, 0x8d, 0xe8, + 0xf9, 0x63, 0x88, 0x2f, 0xdf, 0x0c, 0x30, 0xfb, 0x83, 0xda, 0x17, 0xde, + 0xd2, 0x3c, 0x28, 0xcc, 0xe0, 0x4c, 0x04, 0x99, 0x07, 0xcc, 0x83, 0xfd, + 0x81, 0xd3, 0x1c, 0x99, 0x9a, 0xd2, 0x64, 0xe1, 0xee, 0x20, 0xa7, 0xf2, + 0xe0, 0xd9, 0x00, 0x96, 0xe3, 0x62, 0x92, 0x1f, 0x32, 0xe1, 0x15, 0x34, + 0x8b, 0x76, 0x08, 0xd0, 0x24, 0xc8, 0x4c, 0x21, 0x51, 0xee, 0x8c, 0x2d, + 0xa8, 0x37, 0x8d, 0x4f, 0x91, 0x15, 0xec, 0x03, 0xbb, 0xa4, 0xd1, 0x03, + 0xcb, 0xd6, 0x7e, 0x22, 0x89, 0x1b, 0xc3, 0x5d, 0x0e, 0x1d, 0x67, 0x69, + 0x32, 0xb9, 0x9e, 0x54, 0x72, 0xa5, 0x77, 0xe0, 0xfd, 0xa4, 0x0a, 0x3f, + 0x10, 0x98, 0x4e, 0x59, 0x6e, 0xc2, 0x91, 0xaf, 0x9b, 0xd0, 0xef, 0x1f, + 0x0a, 0x57, 0xbb, 0xae, 0xca, 0xfb, 0x16, 0xf9, 0x97, 0x8b, 0xcf, 0x38, + 0xf1, 0x5e, 0x6b, 0x8e, 0x86, 0x5b, 0x41, 0x89, 0x79, 0x89, 0xfe, 0xfa, + 0x97, 0x28, 0x03, 0x8b, 0x7d, 0x97, 0xbc, 0xbb, 0xcc, 0x16, 0x6d, 0x67, + 0xc7, 0x64, 0x4d, 0x5c, 0x07, 0xfe, 0x38, 0x06, 0x4c, 0x16, 0xa8, 0x3f, + 0xfd, 0x95, 0xd7, 0xb6, 0x46, 0x2c, 0x7e, 0x42, 0x4c, 0x7b, 0x3b, 0xdb, + 0xc2, 0x04, 0xda, 0xa2, 0xc1, 0x68, 0x49, 0x58, 0x00, 0x57, 0x62, 0x5a, + 0x9e, 0x9c, 0xe3, 0xf6, 0x0f, 0xd9, 0xcb, 0x73, 0xad, 0xbd, 0x3b, 0xef, + 0x8e, 0x62, 0xef, 0xd6, 0x28, 0x7e, 0x2c, 0x08, 0x66, 0xf8, 0x68, 0x7a, + 0x13, 0x7b, 0xcb, 0x0e, 0x58, 0x8b, 0x58, 0x37, 0xd4, 0x52, 0x50, 0x59, + 0x09, 0xa1, 0x4a, 0x6c, 0x85, 0x74, 0xc2, 0xda, 0x61, 0x06, 0xa6, 0xc8, + 0xe1, 0x28, 0x16, 0x73, 0xd0, 0xb9, 0x45, 0x3b, 0x47, 0x6e, 0x5a, 0xeb, + 0x99, 0xa5, 0x83, 0x45, 0xa8, 0xd8, 0x4d, 0xa3, 0xd9, 0x93, 0x8c, 0x58, + 0x27, 0x8f, 0x54, 0xc4, 0x8e, 0x33, 0xde, 0x79, 0x76, 0x31, 0x07, 0x0f, + 0x98, 0xfa, 0xc4, 0x91, 0xb8, 0xf4, 0x0c, 0x2a, 0x09, 0x14, 0xfd, 0xb2, + 0xd8, 0x1d, 0xa3, 0xcd, 0x7d, 0x53, 0x9a, 0x8b, 0xe2, 0xf9, 0xd4, 0x9e, + 0xde, 0xe7, 0x67, 0x52, 0xf0, 0xad, 0x7e, 0xa6, 0x6b, 0x2d, 0xdb, 0x8f, + 0xc2, 0xb8, 0xfe, 0xc7, 0xb5, 0xc6, 0x75, 0x98, 0xaf, 0x48, 0xf9, 0xed, + 0x1a, 0xb3, 0x99, 0x7f, 0x65, 0x97, 0x60, 0xfd, 0xea, 0x33, 0xb2, 0xaf, + 0xff, 0x29, 0xed, 0x77, 0xd8, 0x03, 0x48, 0x06, 0x5e, 0xf0, 0x10, 0x31, + 0x1f, 0xa6, 0x91, 0xb1, 0x44, 0x2b, 0x34, 0x93, 0x99, 0x19, 0xc5, 0x18, + 0x8f, 0xa7, 0x30, 0xa0, 0xca, 0x02, 0xa3, 0xbf, 0xba, 0x41, 0x47, 0x29, + 0xa4, 0xe3, 0x00, 0x7d, 0x35, 0xdb, 0x5e, 0x4d, 0x7e, 0xc1, 0x54, 0x8e, + 0x69, 0x3b, 0xd6, 0x6a, 0xf0, 0x33, 0xa8, 0x98, 0x9a, 0xcf, 0xfd, 0x92, + 0x90, 0x92, 0x0f, 0x03, 0xf8, 0xd9, 0x9e, 0x60, 0x43, 0x58, 0x71, 0x70, + 0xcc, 0x7c, 0xeb, 0x86, 0xb2, 0xaa, 0x9c, 0x1e, 0x81, 0xca, 0x51, 0x9c, + 0x15, 0xf9, 0x99, 0xe1, 0x79, 0x10, 0x47, 0x60, 0xb1, 0xc1, 0xc7, 0x11, + 0x2c, 0xa6, 0x43, 0x05, 0x9c, 0x58, 0x5f, 0x4a, 0x3b, 0x50, 0x3c, 0x74, + 0x85, 0x04, 0x97, 0xee, 0x17, 0x00, 0xbf, 0xb1, 0x18, 0xb0, 0xa5, 0x47, + 0x7d, 0xc6, 0xd8, 0x3b, 0xeb, 0xa1, 0x0d, 0xe4, 0xbc, 0xe5, 0xb8, 0xb1, + 0x51, 0xd3, 0x26, 0x15, 0xc8, 0x30, 0xb7, 0xa7, 0x87, 0xd7, 0x73, 0xa7, + 0xa3, 0xa4, 0x34, 0x5d, 0xeb, 0x60, 0x0c, 0x15, 0x83, 0x87, 0x27, 0xef, + 0x67, 0xa9, 0x60, 0x60, 0xe8, 0x5f, 0x1a, 0xb2, 0x54, 0xe8, 0x50, 0xf3, + 0xc2, 0x4d, 0x67, 0x84, 0x11, 0xc5, 0xa5, 0x7d, 0x0e, 0xce, 0x4b, 0x0b, + 0x19, 0x82, 0xc3, 0x90, 0x96, 0x6d, 0x1e, 0xdf, 0x40, 0x1c, 0xef, 0x18, + 0x3b, 0x17, 0x30, 0xdd, 0x3a, 0xf4, 0x2a, 0xeb, 0x9b, 0x8e, 0x0c, 0x5c, + 0xcd, 0xac, 0xba, 0x21, 0x80, 0x89, 0x33, 0xa5, 0x34, 0xcb, 0x38, 0xd3, + 0x35, 0xf9, 0x67, 0x2b, 0x64, 0x6e, 0x9a, 0x41, 0x86, 0x13, 0x2a, 0xca, + 0x65, 0x92, 0x58, 0xe6, 0x22, 0xb1, 0x17, 0xbb, 0xd8, 0x6e, 0x27, 0xca, + 0x7d, 0x0b, 0x4e, 0x35, 0xc7, 0xc0, 0xa9, 0xa1, 0x0c, 0x6c, 0xdd, 0x5d, + 0xc8, 0x15, 0x21, 0xf5, 0xed, 0x89, 0x11, 0xb2, 0x7e, 0xda, 0xc4, 0xff, + 0xad, 0x04, 0x9f, 0xc9, 0x5d, 0xc9, 0x99, 0xd5, 0x7d, 0xfd, 0x14, 0x92, + 0xed, 0xcd, 0x57, 0x32, 0x04, 0x8d, 0xc1, 0xff, 0xb7, 0x44, 0xd8, 0x4a, + 0xf8, 0x5a, 0x48, 0x0c, 0x66, 0x38, 0xbc, 0x28, 0x5f, 0x1d, 0x20, 0xd0, + 0x96, 0xf0, 0xb5, 0x0a, 0x42, 0xe3, 0x15, 0x86, 0xaa, 0xfa, 0xd8, 0x8e, + 0xd5, 0xd1, 0x80, 0xb3, 0x8f, 0x5e, 0x4b, 0x90, 0xd9, 0x59, 0x40, 0x13, + 0xb6, 0xa8, 0x4d, 0x44, 0x59, 0xa2, 0x39, 0x1a, 0x38, 0x1c, 0x38, 0xe2, + 0x53, 0x2d, 0x47, 0x05, 0xe9, 0x4e, 0x9b, 0xcf, 0x11, 0xea, 0xf9, 0x60, + 0x77, 0x94, 0xbc, 0x58, 0x76, 0xd1, 0xdd, 0x1a, 0x6c, 0xaf, 0x3b, 0xd9, + 0x48, 0x28, 0x22, 0xdd, 0xb5, 0x40, 0xf9, 0x53, 0x96, 0xe3, 0x39, 0x23, + 0x29, 0x2f, 0x36, 0x5c, 0x59, 0x18, 0x87, 0x3c, 0xaf, 0xca, 0x4c, 0xfa, + 0xa2, 0x97, 0xfa, 0x62, 0x86, 0xbe, 0x3c, 0xa9, 0xeb, 0xcd, 0x9b, 0xaf, + 0x1b, 0xa9, 0xe4, 0xf6, 0xd7, 0xda, 0x5d, 0x00, 0x89, 0x5c, 0xa1, 0xe5, + 0x25, 0xde, 0x9b, 0xd4, 0x04, 0xaf, 0x11, 0x90, 0x8a, 0x84, 0x2e, 0x1d, + 0x33, 0xca, 0xd4, 0x90, 0xb9, 0x6a, 0x5d, 0x68, 0x1a, 0xa1, 0x84, 0x8d, + 0x2b, 0xe0, 0xe9, 0x4d, 0x31, 0x63, 0x30, 0x1e, 0x92, 0x89, 0x77, 0x30, + 0x7c, 0xbb, 0x70, 0x0a, 0x00, 0x73, 0x40, 0x04, 0x89, 0xbd, 0x70, 0x74, + 0xdf, 0x19, 0x9e, 0x26, 0x15, 0x60, 0xa6, 0x8c, 0xdc, 0x11, 0xde, 0x6a, + 0x96, 0x44, 0x64, 0x21, 0x87, 0xc9, 0xf9, 0xe2, 0xf7, 0x2c, 0x30, 0xbe, + 0x06, 0xa3, 0x86, 0xba, 0x3a, 0x71, 0x88, 0x10, 0x9a, 0x03, 0xc9, 0x7a, + 0x47, 0x9c, 0x01, 0x10, 0xf9, 0xd5, 0x5c, 0x40, 0x82, 0x44, 0x61, 0xab, + 0xd5, 0xb9, 0x66, 0xca, 0x52, 0x69, 0xad, 0x13, 0x64, 0x55, 0xc8, 0xbf, + 0x3f, 0x35, 0x03, 0xc8, 0x9b, 0x97, 0x32, 0xde, 0x2f, 0x5c, 0x69, 0x00, + 0x09, 0xae, 0xa4, 0x46, 0x34, 0x98, 0x16, 0x8e, 0x5c, 0x31, 0xcc, 0x9c, + 0xc1, 0xc9, 0x8b, 0x02, 0xfe, 0x91, 0xaf, 0x40, 0xb1, 0x29, 0x0d, 0x72, + 0x35, 0xd6, 0x74, 0x53, 0xaf, 0xb3, 0x2c, 0x15, 0xa8, 0x49, 0x1d, 0x29, + 0xac, 0xd0, 0x44, 0x5b, 0x01, 0x86, 0xd0, 0xa6, 0xad, 0xd7, 0x20, 0x0c, + 0x51, 0xe8, 0x75, 0xd7, 0x47, 0x4b, 0x97, 0x03, 0x45, 0xfd, 0x2a, 0xd7, + 0x14, 0xb5, 0x60, 0xcd, 0xc8, 0x6d, 0xe8, 0x38, 0xf3, 0x82, 0xcb, 0xfd, + 0x79, 0x46, 0x07, 0x5e, 0x20, 0x67, 0x5e, 0x3e, 0x30, 0x3a, 0x30, 0x4f, + 0xe8, 0xe7, 0x63, 0xbd, 0x78, 0x23, 0x86, 0x99, 0x70, 0x9e, 0x4f, 0xc8, + 0xc3, 0x58, 0x13, 0xc4, 0xae, 0x39, 0xd5, 0x1b, 0x69, 0xda, 0x3a, 0x05, + 0x09, 0xc9, 0x4a, 0x7a, 0x34, 0x4f, 0xf4, 0x75, 0xcc, 0x34, 0x48, 0xa4, + 0x81, 0xc8, 0xac, 0x13, 0x28, 0xb1, 0x23, 0xb3, 0xb3, 0xf8, 0x65, 0xe4, + 0xd5, 0x1c, 0x37, 0x32, 0xdd, 0x2c, 0x35, 0xf9, 0x64, 0xea, 0x29, 0x96, + 0xab, 0xab, 0xae, 0x12, 0x88, 0xe7, 0xa3, 0x94, 0x6f, 0x68, 0x5a, 0x30, + 0xa9, 0x5c, 0xc5, 0xe9, 0xcc, 0x30, 0xc5, 0x6f, 0x61, 0x75, 0xef, 0x7c, + 0x3b, 0x51, 0x59, 0x81, 0xdd, 0xcc, 0xee, 0xc6, 0x14, 0xf6, 0x02, 0x7c, + 0x7c, 0x63, 0xdd, 0x44, 0x0a, 0xa6, 0x40, 0x92, 0x00, 0xad, 0x17, 0x5f, + 0x24, 0x95, 0xfa, 0x80, 0xaf, 0x48, 0xb1, 0xc5, 0x97, 0x6e, 0x4b, 0xde, + 0x23, 0x1f, 0x43, 0xb3, 0xfa, 0x74, 0xbe, 0xfa, 0x7b, 0x5d, 0x9e, 0x97, + 0xed, 0xd8, 0x1f, 0x36, 0x3b, 0xab, 0x8d, 0xac, 0x19, 0xe4, 0x79, 0xa3, + 0x15, 0x95, 0xa5, 0x2d, 0xa4, 0x0a, 0x99, 0xd5, 0x21, 0xb9, 0x29, 0x1a, + 0x38, 0x7c, 0x4a, 0x32, 0x16, 0x16, 0xfc, 0x1b, 0xed, 0xd3, 0x1f, 0x9d, + 0x1b, 0xe3, 0x62, 0x3e, 0x6d, 0x6f, 0xc2, 0xc4, 0xa7, 0x3c, 0x2d, 0x93, + 0xc2, 0x23, 0x51, 0x06, 0x36, 0x31, 0xe0, 0x7d, 0x38, 0xf6, 0x31, 0xb4, + 0xd7, 0x66, 0xe8, 0x74, 0x54, 0xf3, 0xc5, 0x23, 0xf6, 0x02, 0x5e, 0x0e, + 0x8e, 0x67, 0xd8, 0x31, 0xfd, 0x81, 0x22, 0x5a, 0xda, 0x3b, 0x27, 0x85, + 0x38, 0x03, 0xdf, 0x03, 0x5e, 0x0d, 0x66, 0xff, 0xf5, 0x72, 0xa6, 0xb0, + 0x15, 0x84, 0x03, 0x82, 0xf2, 0xc0, 0x89, 0xbe, 0xf8, 0x42, 0x01, 0xb6, + 0xfb, 0x14, 0x0c, 0x7b, 0xb0, 0x7a, 0xb6, 0x45, 0x50, 0xf2, 0x47, 0x45, + 0x0c, 0x5f, 0xca, 0x21, 0x81, 0x12, 0x9a, 0xeb, 0x98, 0xa0, 0x92, 0x99, + 0xb2, 0xd4, 0x76, 0x5c, 0x4f, 0xf3, 0xba, 0xb1, 0x4a, 0xbf, 0x40, 0x53, + 0xde, 0xbe, 0x09, 0xc1, 0x1e, 0x0c, 0x81, 0x8f, 0x3c, 0x5c, 0xe6, 0xe1, + 0x64, 0xc3, 0xeb, 0x7c, 0x6b, 0x58, 0x9b, 0x5a, 0x5a, 0x84, 0x0b, 0xa9, + 0x39, 0x41, 0x48, 0xbd, 0x37, 0xa0, 0x4d, 0xe8, 0x76, 0x9c, 0x47, 0xa3, + 0xfb, 0xc0, 0x13, 0x35, 0x08, 0x88, 0xb8, 0x63, 0x8a, 0x09, 0xd8, 0x81, + 0x0e, 0x61, 0x38, 0xbc, 0x2d, 0xff, 0x6d, 0x79, 0xef, 0x51, 0xa0, 0xc0, + 0x9a, 0xd4, 0xaf, 0x12, 0xc9, 0x0f, 0x1b, 0xd3, 0x21, 0x30, 0xd5, 0xc0, + 0xff, 0xb5, 0xb5, 0x84, 0x75, 0x31, 0xe4, 0x18, 0x31, 0xca, 0x76, 0x07, + 0x63, 0x3a, 0xb2, 0xdd, 0x7b, 0x66, 0x0d, 0x73, 0x6e, 0xfb, 0x02, 0x0d, + 0x03, 0xd5, 0x91, 0x33, 0x8e, 0xe3, 0x97, 0xa3, 0xee, 0xa4, 0xbb, 0xf5, + 0x4c, 0x39, 0xba, 0x64, 0x52, 0x37, 0x86, 0x12, 0xd0, 0x6a, 0x0a, 0xbd, + 0x5f, 0x12, 0xb1, 0xf9, 0xc9, 0x6e, 0x0e, 0x4e, 0x7f, 0xf4, 0x9c, 0x41, + 0x79, 0x35, 0xed, 0xb4, 0xb9, 0xb5, 0x55, 0x40, 0xaf, 0xb1, 0x00, 0x0a, + 0x57, 0x7d, 0x8b, 0xe8, 0xf3, 0x33, 0xe6, 0x04, 0xdb, 0x22, 0xf8, 0x38, + 0x2f, 0x13, 0x80, 0x2b, 0x27, 0xc4, 0x27, 0x4a, 0x1f, 0xf4, 0xe6, 0x9d, + 0xec, 0x3f, 0x70, 0x7e, 0x7d, 0xcc, 0x91, 0x1c, 0x6a, 0xb4, 0x10, 0x14, + 0x70, 0xfa, 0x3c, 0x63, 0xa4, 0x16, 0xd3, 0x22, 0xce, 0xbd, 0x61, 0x85, + 0x8d, 0x48, 0x8e, 0xe6, 0xe3, 0x4b, 0xf1, 0x5f, 0xf0, 0x44, 0x86, 0x19, + 0xdb, 0x69, 0x2f, 0x07, 0x70, 0x8b, 0xc5, 0xc6, 0xbb, 0x41, 0xc0, 0x12, + 0x3f, 0xb5, 0x05, 0xff, 0x5e, 0x86, 0xfe, 0x94, 0xb8, 0x93, 0xdb, 0xaf, + 0x77, 0xc2, 0xb7, 0x5a, 0x22, 0x4a, 0x55, 0x48, 0x7b, 0xd6, 0x3b, 0x7d, + 0x36, 0x77, 0xeb, 0x64, 0x49, 0xfb, 0xd6, 0x16, 0xf0, 0x2d, 0xe7, 0x6e, + 0x33, 0x77, 0x75, 0xcd, 0x7d, 0x3d, 0xb9, 0xa2, 0xd2, 0xbd, 0x5a, 0x03, + 0x89, 0xa6, 0xea, 0xda, 0xa4, 0x2e, 0x72, 0x69, 0x76, 0xf2, 0xca, 0xed, + 0x45, 0xa9, 0x44, 0x68, 0xf7, 0x30, 0x88, 0x6d, 0xdc, 0x62, 0x0f, 0xbc, + 0xdf, 0xec, 0x4c, 0xe8, 0xf8, 0x04, 0x3a, 0xf5, 0x0a, 0x03, 0xbb, 0x61, + 0xfb, 0x10, 0xe2, 0xc0, 0x7a, 0x91, 0x7f, 0xce, 0x04, 0x34, 0x1d, 0x2a, + 0xa0, 0x1a, 0x77, 0x64, 0xb7, 0xb4, 0x44, 0xfd, 0x74, 0x13, 0xf7, 0x90, + 0xda, 0x9a, 0xea, 0x52, 0xa3, 0xb3, 0xc9, 0x54, 0x6f, 0x88, 0x4c, 0x23, + 0x95, 0xd7, 0x05, 0x2c, 0x0b, 0x86, 0x68, 0x80, 0x59, 0x85, 0x80, 0x7b, + 0xb1, 0xf7, 0x8b, 0xf5, 0x16, 0xfa, 0xc5, 0x65, 0x37, 0x17, 0x9e, 0x5e, + 0x25, 0x81, 0x76, 0xfc, 0xe2, 0x4b, 0x35, 0xaf, 0xc9, 0x6d, 0xf1, 0xdc, + 0x5d, 0xb8, 0xf0, 0x3a, 0x4d, 0xb0, 0x12, 0xa1, 0x3f, 0x8f, 0x41, 0x30, + 0xe4, 0xb5, 0x52, 0x98, 0x53, 0xe4, 0x95, 0x54, 0xf9, 0x13, 0xae, 0x96, + 0x0c, 0xbf, 0x35, 0xd8, 0x5c, 0x78, 0x2e, 0xcc, 0x4e, 0x75, 0x35, 0xfc, + 0xd0, 0x96, 0x40, 0x35, 0x0d, 0x81, 0x79, 0x8e, 0xbd, 0x0b, 0x78, 0x77, + 0xc9, 0x2a, 0xf3, 0xf9, 0x0c, 0xd8, 0x76, 0x07, 0xd1, 0x70, 0x61, 0x08, + 0xd3, 0x93, 0x5c, 0xef, 0x7a, 0xdc, 0x06, 0x1a, 0xbd, 0x2c, 0xdf, 0x69, + 0x41, 0xc7, 0xc5, 0xed, 0x4c, 0x79, 0xa7, 0x4b, 0xe3, 0x05, 0x12, 0x1c, + 0x13, 0x67, 0xb4, 0x1e, 0x11, 0x38, 0xc9, 0xfd, 0xda, 0xe8, 0x20, 0x9e, + 0xb0, 0x1e, 0xb9, 0xd3, 0x80, 0x1e, 0xb6, 0xc9, 0x7b, 0xb1, 0xf1, 0x3a, + 0xae, 0xe7, 0xb6, 0x5b, 0x14, 0x54, 0x4b, 0xe2, 0x35, 0x75, 0x88, 0x54, + 0x3d, 0x2b, 0xae, 0x96, 0xea, 0x88, 0x9d, 0x6a, 0xf7, 0x41, 0xdd, 0x0b, + 0xaa, 0x99, 0xc0, 0x0c, 0xdc, 0x6c, 0xcf, 0x9c, 0xe7, 0x34, 0x0f, 0x8b, + 0xfc, 0xa9, 0x27, 0xfd, 0x38, 0x5d, 0x25, 0xbc, 0x48, 0x77, 0xc6, 0x69, + 0x99, 0xbe, 0xe5, 0x46, 0x31, 0xdc, 0x1d, 0x4c, 0xa7, 0xc8, 0xe8, 0x63, + 0x1c, 0x92, 0x77, 0x1f, 0x29, 0xf8, 0x4e, 0x43, 0x80, 0x40, 0x09, 0x1d, + 0x80, 0x85, 0xb1, 0x32, 0xc0, 0x6e, 0xca, 0xec, 0x09, 0x14, 0xdf, 0x81, + 0x69, 0xa3, 0xf2, 0x5b, 0x8d, 0x17, 0x22, 0x93, 0xe5, 0x51, 0x2d, 0x5f, + 0xbe, 0x7c, 0xf9, 0x45, 0x53, 0x21, 0x5f, 0xb2, 0xf7, 0xdd, 0x69, 0x03, + 0xc2, 0x2d, 0xa3, 0xbb, 0x75, 0x17, 0xc9, 0x2c, 0xb1, 0xd3, 0x22, 0xe4, + 0x01, 0x45, 0x82, 0x81, 0xdb, 0xa8, 0xc5, 0xcc, 0x29, 0xb7, 0x1f, 0x81, + 0x33, 0x78, 0x8a, 0x0b, 0x2a, 0x5b, 0xe8, 0xf3, 0x17, 0x5f, 0xba, 0xbb, + 0xec, 0xb6, 0xda, 0x89, 0xd1, 0x62, 0x9a, 0x63, 0x42, 0x31, 0x93, 0x12, + 0x2c, 0xc6, 0x2d, 0xb1, 0x50, 0x95, 0x89, 0x8d, 0xd3, 0x59, 0x65, 0xd9, + 0x55, 0xa8, 0xda, 0xd7, 0x4c, 0xf5, 0xd4, 0x76, 0x2c, 0x38, 0x80, 0x31, + 0x85, 0x14, 0xf8, 0x02, 0x59, 0x8e, 0xac, 0xab, 0x70, 0xc1, 0xa6, 0x3c, + 0xab, 0xe0, 0x31, 0x9c, 0x92, 0x0f, 0xd3, 0x22, 0xc8, 0x9f, 0xdf, 0xe5, + 0x43, 0xb2, 0x48, 0xb7, 0x0b, 0xf4, 0xe7, 0xb6, 0xe6, 0x6b, 0xc4, 0xa3, + 0xa9, 0x7d, 0xbf, 0x6c, 0x69, 0xca, 0xad, 0x03, 0x2c, 0xca, 0xb7, 0xcb, + 0xd4, 0x2c, 0x90, 0x1a, 0xd7, 0x51, 0xd5, 0x6c, 0xe1, 0xce, 0x90, 0x26, + 0xab, 0xcb, 0xc0, 0x14, 0x65, 0xe5, 0x58, 0xdd, 0xfe, 0x82, 0x58, 0x67, + 0x71, 0x71, 0x0f, 0x3c, 0xb1, 0xf5, 0x2e, 0x47, 0x8a, 0x68, 0xc7, 0x31, + 0x55, 0x97, 0xfa, 0x3a, 0xd8, 0x9d, 0x61, 0x91, 0x50, 0x58, 0x41, 0xc6, + 0x02, 0x0c, 0x8e, 0x37, 0xc8, 0xa2, 0x1c, 0x54, 0x13, 0x20, 0xac, 0xd7, + 0x3b, 0x2e, 0x00, 0xe3, 0xd2, 0xb6, 0xac, 0xa4, 0x67, 0xaf, 0xc5, 0x64, + 0xdb, 0xfc, 0xb1, 0xd9, 0x69, 0x15, 0x6f, 0x6b, 0xd5, 0x1c, 0x96, 0x02, + 0xed, 0x96, 0x42, 0x83, 0x8e, 0x41, 0xc9, 0x5c, 0xfa, 0xc9, 0x9d, 0x12, + 0x6f, 0x65, 0x54, 0xb2, 0xbb, 0x8d, 0x7f, 0x70, 0x8e, 0x4c, 0xd1, 0x1c, + 0xb5, 0x56, 0xb8, 0x5f, 0x34, 0x67, 0x68, 0x31, 0x0c, 0x20, 0xb3, 0x25, + 0x77, 0x8e, 0x46, 0x47, 0x20, 0xec, 0xa1, 0x7a, 0x5d, 0x8b, 0xc4, 0x8b, + 0xeb, 0xc2, 0xb1, 0x64, 0xb3, 0xe3, 0x14, 0x33, 0x86, 0x11, 0xc5, 0xa0, + 0x27, 0xfb, 0x7a, 0xb9, 0xca, 0x17, 0xba, 0x12, 0x56, 0xda, 0x8e, 0x87, + 0xd4, 0xf2, 0x69, 0x70, 0x43, 0xbc, 0x97, 0x27, 0x1c, 0x35, 0x7b, 0x6d, + 0x29, 0x6b, 0x10, 0xf3, 0xf4, 0x1e, 0xe1, 0x7f, 0xb8, 0xe3, 0x19, 0x40, + 0x21, 0xde, 0xaf, 0x9a, 0xd6, 0xcf, 0xd6, 0xa6, 0x8e, 0xad, 0x48, 0x80, + 0x76, 0x20, 0xc0, 0xdd, 0xc5, 0x01, 0x5c, 0x52, 0x66, 0xe3, 0x92, 0xb6, + 0x05, 0x42, 0x29, 0x0e, 0x72, 0xfe, 0xbd, 0x70, 0x11, 0xc2, 0xb2, 0xca, + 0x5b, 0x54, 0xdf, 0x7a, 0x8b, 0xba, 0x7d, 0x38, 0xb1, 0xa6, 0xf8, 0xf1, + 0x1e, 0x3d, 0xd0, 0xda, 0xa2, 0x85, 0x75, 0x24, 0x2a, 0x7b, 0x4c, 0x58, + 0x15, 0x24, 0xdc, 0x21, 0x33, 0xbb, 0x4e, 0x63, 0x2b, 0x4f, 0x6a, 0xca, + 0x1a, 0x2c, 0xa5, 0x99, 0xa1, 0xc4, 0x52, 0x7a, 0xdb, 0xc7, 0x94, 0x7f, + 0x1e, 0xd6, 0x30, 0x3c, 0x80, 0x00, 0x1a, 0x64, 0xa8, 0xc3, 0x25, 0x4a, + 0x81, 0x77, 0x91, 0xbf, 0xca, 0x2f, 0x4d, 0x85, 0x66, 0x1d, 0x70, 0x92, + 0x15, 0x77, 0xdc, 0x7a, 0xea, 0x4d, 0xdc, 0x96, 0xc6, 0xf0, 0xc3, 0x41, + 0xf4, 0x97, 0x1e, 0x9c, 0x68, 0x60, 0x92, 0x6f, 0x65, 0xac, 0xd2, 0x63, + 0x6e, 0x50, 0xdc, 0x26, 0xb4, 0x41, 0x04, 0x5a, 0xf4, 0x88, 0x16, 0xae, + 0xb9, 0x24, 0x3c, 0x10, 0x2e, 0x0e, 0xd3, 0x4d, 0x9a, 0x13, 0x46, 0xf5, + 0x2b, 0x04, 0xa3, 0xfa, 0xcc, 0xa4, 0xa2, 0x0c, 0xba, 0x34, 0xb6, 0x2a, + 0xcf, 0x6b, 0xbc, 0xad, 0x73, 0xdf, 0x68, 0x0c, 0x6c, 0x61, 0xc1, 0xdc, + 0x57, 0x36, 0x2c, 0x40, 0xf5, 0x52, 0x5a, 0x81, 0x48, 0x36, 0x34, 0x7b, + 0x68, 0xb6, 0x04, 0x6f, 0x70, 0x89, 0x26, 0xe3, 0x46, 0x7c, 0x43, 0x84, + 0x57, 0x4b, 0xf5, 0x3c, 0x20, 0xf3, 0xac, 0x3e, 0xbd, 0xd0, 0x9d, 0x87, + 0x12, 0x45, 0xf7, 0x5a, 0x06, 0xe6, 0x3e, 0x2b, 0xe5, 0xe1, 0x1a, 0x50, + 0xc4, 0xaa, 0x2d, 0x0a, 0x29, 0xb2, 0x98, 0xa0, 0x64, 0xd9, 0x0f, 0x3a, + 0xbf, 0xd9, 0xda, 0xf9, 0x6e, 0xf6, 0xcb, 0xb6, 0x85, 0x96, 0x65, 0xc1, + 0xcb, 0xae, 0xd8, 0xe9, 0xe5, 0x7a, 0x6e, 0xf9, 0x29, 0x84, 0x32, 0x77, + 0xae, 0x2d, 0x0d, 0x7b, 0x44, 0x84, 0x50, 0xdd, 0x9d, 0x05, 0xf0, 0x6a, + 0x19, 0xf1, 0x4d, 0x33, 0x9d, 0xcb, 0x35, 0x0e, 0xaa, 0x4a, 0xf3, 0x86, + 0xe0, 0xa9, 0xc2, 0x0f, 0x81, 0x01, 0xb0, 0xc8, 0x55, 0x11, 0x8e, 0xed, + 0x40, 0x47, 0x0e, 0x2b, 0x9f, 0xba, 0x77, 0x00, 0x77, 0xe1, 0xf5, 0x09, + 0x6f, 0xc5, 0x41, 0xc5, 0x54, 0xa2, 0x32, 0x30, 0xd3, 0x23, 0x27, 0x7b, + 0x6e, 0x56, 0xed, 0xb5, 0x92, 0x7d, 0x4d, 0xb7, 0xf6, 0x6d, 0x75, 0x90, + 0x43, 0xf9, 0xbc, 0x91, 0xf8, 0x4a, 0x9f, 0xd6, 0x25, 0x32, 0x62, 0x63, + 0x4a, 0xbe, 0x2d, 0xd1, 0x1b, 0x38, 0xa8, 0x78, 0x30, 0xf7, 0x59, 0x46, + 0x34, 0x30, 0x95, 0xab, 0x4d, 0xb5, 0x2d, 0x9b, 0xa7, 0xee, 0x85, 0xbc, + 0x73, 0x94, 0x21, 0x65, 0xa5, 0xd5, 0xf4, 0xc0, 0xa4, 0x24, 0x50, 0x44, + 0xa8, 0x2a, 0x9e, 0xba, 0xac, 0x26, 0xae, 0xb0, 0x47, 0x97, 0xa1, 0x29, + 0x4f, 0xb1, 0x69, 0xcf, 0xbe, 0xb9, 0x2b, 0xaf, 0xd2, 0x5b, 0x31, 0x15, + 0x5c, 0x75, 0xed, 0xac, 0x3b, 0xf2, 0x8f, 0x72, 0x6c, 0x66, 0x47, 0x97, + 0x18, 0xc3, 0x76, 0x53, 0xc0, 0x3e, 0xe6, 0x0b, 0x05, 0x5f, 0x7f, 0xe0, + 0x5a, 0x64, 0x6b, 0x32, 0x26, 0xb2, 0xab, 0x06, 0xf0, 0x0b, 0x68, 0xcc, + 0xe9, 0x4e, 0x9e, 0x02, 0x3d, 0xfa, 0x0e, 0xa8, 0x1d, 0xc0, 0x1a, 0xdc, + 0xde, 0xae, 0xa6, 0x60, 0xa9, 0x67, 0x3d, 0x9c, 0xf6, 0x8e, 0x68, 0x89, + 0x48, 0xde, 0x74, 0x1c, 0x9c, 0xee, 0x91, 0x11, 0x8a, 0xee, 0x61, 0x23, + 0xff, 0x66, 0x4b, 0xf3, 0xf7, 0xc1, 0x6b, 0x9d, 0x15, 0x84, 0xd9, 0x9e, + 0xc5, 0x6a, 0x62, 0x73, 0xaf, 0x67, 0x09, 0x91, 0xff, 0x7f, 0x37, 0xcd, + 0x03, 0x98, 0x3b, 0x84, 0xa9, 0xe5, 0x0f, 0xca, 0x51, 0xe2, 0x76, 0x4c, + 0x18, 0xd9, 0xf6, 0x82, 0x5b, 0xa7, 0xe0, 0xff, 0x7d, 0xa2, 0x6b, 0x51, + 0x40, 0x3a, 0xc4, 0x76, 0xb6, 0xb9, 0x10, 0x55, 0x17, 0x03, 0x31, 0x75, + 0xe5, 0x15, 0xb6, 0x33, 0xf1, 0xd6, 0xb7, 0xa2, 0x75, 0x62, 0xe3, 0x50, + 0xb2, 0xd8, 0x43, 0x9e, 0x5b, 0xbf, 0x7f, 0x6c, 0x7b, 0x38, 0x84, 0x0a, + 0x3a, 0x96, 0x61, 0x7e, 0x3a, 0x18, 0xca, 0x09, 0x79, 0xf5, 0x3e, 0xfe, + 0x4e, 0x36, 0x69, 0xf8, 0x8b, 0x2d, 0x1a, 0x18, 0x32, 0x90, 0x77, 0xc7, + 0xf1, 0x00, 0x57, 0x3f, 0x65, 0x28, 0xb3, 0x18, 0x2c, 0x4e, 0x80, 0x66, + 0x87, 0xb6, 0xdd, 0x21, 0x75, 0xe4, 0xb4, 0x9d, 0xba, 0x6c, 0x13, 0x67, + 0x8a, 0x70, 0xd5, 0x7d, 0xf2, 0x61, 0x11, 0xdf, 0xdd, 0x7d, 0x16, 0x2c, + 0xff, 0x0f, 0xa7, 0xa2, 0x7f, 0xb7, 0xd9, 0xe5, 0xb1, 0x5d, 0xb9, 0x8f, + 0xae, 0x5b, 0xc3, 0x77, 0xb6, 0x03, 0x1e, 0xa6, 0x45, 0x18, 0x9d, 0x56, + 0x9e, 0xc1, 0x6b, 0xac, 0xe0, 0x14, 0xf0, 0xcf, 0x1a, 0xa4, 0x3d, 0xd8, + 0xc0, 0x8c, 0x20, 0x40, 0x93, 0xc6, 0x67, 0x86, 0x1e, 0x71, 0x97, 0xe5, + 0x03, 0x0a, 0xf3, 0xd2, 0xb8, 0xc2, 0x5e, 0xa6, 0x09, 0xa5, 0x08, 0xf7, + 0x5e, 0xbb, 0x0c, 0xb5, 0xd5, 0x9d, 0xc0, 0x48, 0x4c, 0x1d, 0x9b, 0xb1, + 0x23, 0xc1, 0x51, 0xd9, 0x54, 0xb6, 0x4b, 0xfa, 0x8d, 0x4f, 0x65, 0x31, + 0x7b, 0xa8, 0x32, 0x1b, 0x7d, 0x16, 0xc7, 0x89, 0x60, 0xfa, 0xbc, 0x2e, + 0x76, 0xfa, 0xf6, 0x21, 0xc2, 0xbc, 0x70, 0x64, 0x62, 0x01, 0xe1, 0x66, + 0xcb, 0x15, 0x3e, 0x96, 0x83, 0xe7, 0xe1, 0xb6, 0x9d, 0x9c, 0x41, 0x4f, + 0xb3, 0x67, 0xe7, 0x82, 0x74, 0x34, 0xb0, 0x8f, 0x6c, 0x20, 0x0c, 0x9a, + 0x76, 0xed, 0x0d, 0x63, 0xa5, 0x33, 0x06, 0x03, 0xdb, 0x5c, 0x6f, 0x74, + 0xea, 0xad, 0xa3, 0x7c, 0x7a, 0x76, 0xa1, 0x0e, 0xe3, 0xfe, 0xfa, 0x07, + 0xcc, 0xc6, 0x1b, 0xd7, 0x3c, 0x63, 0xeb, 0x00, 0xc0, 0x44, 0xee, 0x7c, + 0xd2, 0x6b, 0x83, 0x5c, 0xc5, 0x10, 0xb9, 0xb1, 0xbd, 0xf7, 0x89, 0x6d, + 0x03, 0x39, 0xe0, 0x8c, 0x62, 0x54, 0x57, 0x9b, 0x45, 0x5a, 0x39, 0x24, + 0xc7, 0x84, 0x5b, 0x95, 0xfc, 0xc9, 0x53, 0x8e, 0x75, 0xce, 0x04, 0xba, + 0xc7, 0x54, 0xa0, 0xe6, 0x58, 0xf3, 0x4c, 0x1a, 0xe0, 0x4d, 0x64, 0x64, + 0xe7, 0xf0, 0x35, 0x3e, 0xe7, 0x10, 0x9b, 0xde, 0x23, 0x84, 0x2e, 0x82, + 0x19, 0x84, 0x30, 0xc1, 0x10, 0x8c, 0xee, 0xd7, 0xd8, 0x59, 0x66, 0x3d, + 0x9f, 0xf7, 0x9a, 0x73, 0x68, 0xd7, 0xb8, 0x34, 0x88, 0x8a, 0x21, 0xfe, + 0x4f, 0xad, 0xe0, 0x34, 0x34, 0x8b, 0x87, 0x61, 0x90, 0xed, 0xb4, 0xb7, + 0x37, 0xbb, 0xb8, 0x21, 0x27, 0x76, 0x23, 0x30, 0x5c, 0x34, 0xbb, 0xa0, + 0x9a, 0xaa, 0x66, 0x5a, 0x6a, 0x03, 0x9e, 0xf7, 0xe0, 0x00, 0x8a, 0xbc, + 0xd8, 0xf2, 0x85, 0x2a, 0xdd, 0x3a, 0xbe, 0xe5, 0x82, 0x04, 0x1b, 0x90, + 0x58, 0x6c, 0x0d, 0x8f, 0x05, 0x3e, 0xd7, 0x76, 0x47, 0xe9, 0x71, 0x02, + 0xda, 0x65, 0xfb, 0xb0, 0x7b, 0xaa, 0x91, 0x2e, 0x6f, 0xdf, 0x34, 0xe0, + 0xbd, 0xfe, 0x3a, 0xcb, 0x2a, 0x73, 0xfc, 0xe1, 0xee, 0x03, 0x6a, 0x8b, + 0x78, 0x24, 0x6a, 0x3f, 0x24, 0xd3, 0xc4, 0xcc, 0x8b, 0x05, 0x55, 0x03, + 0x74, 0xa0, 0x80, 0xf1, 0x58, 0xbe, 0x97, 0x15, 0x4d, 0x55, 0x38, 0x79, + 0xa1, 0xa9, 0x90, 0x7a, 0x15, 0x50, 0xfd, 0x3d, 0x14, 0x08, 0x8a, 0xf9, + 0x88, 0x3e, 0xef, 0xf3, 0x16, 0x15, 0xd7, 0xb0, 0x82, 0xb6, 0xf6, 0xaf, + 0xbc, 0xeb, 0xef, 0x75, 0x96, 0x1f, 0x6e, 0x93, 0xbf, 0xc9, 0x7a, 0x6b, + 0x09, 0x60, 0x5f, 0x53, 0xec, 0x72, 0x97, 0x0c, 0x2d, 0xb1, 0x69, 0xf8, + 0x7a, 0x91, 0x0f, 0xe8, 0x30, 0x09, 0x7d, 0xb0, 0x18, 0x76, 0x7e, 0x17, + 0xcd, 0xdc, 0xe1, 0xfe, 0xba, 0xbf, 0xc5, 0x71, 0xf5, 0x76, 0x96, 0x13, + 0x35, 0x2a, 0xd6, 0x07, 0x1c, 0xa6, 0x5c, 0xd5, 0x85, 0xad, 0xca, 0x41, + 0x94, 0x6b, 0x22, 0x52, 0x4b, 0xda, 0x27, 0x1d, 0x24, 0x39, 0x76, 0x7d, + 0x49, 0xb4, 0x88, 0x39, 0x8f, 0xc1, 0x6a, 0x59, 0x3e, 0x6c, 0x5f, 0x20, + 0x42, 0x95, 0x87, 0xfb, 0x45, 0x0b, 0xa4, 0x31, 0xed, 0xdd, 0x08, 0xad, + 0xbd, 0x3b, 0xb8, 0x89, 0xb8, 0x50, 0xe5, 0xb6, 0x4b, 0x19, 0x96, 0xe9, + 0x1e, 0x8b, 0x3a, 0xc4, 0x07, 0x84, 0xb3, 0x68, 0x48, 0x38, 0x6e, 0x80, + 0x9b, 0x33, 0x7f, 0x7e, 0xc1, 0xe4, 0x44, 0xf4, 0x06, 0xbc, 0xa9, 0x89, + 0x58, 0x13, 0x8d, 0xab, 0x1d, 0x6f, 0x7d, 0x5e, 0x4b, 0x9c, 0x69, 0x96, + 0xbc, 0xb6, 0xc5, 0x1f, 0xac, 0x99, 0xf7, 0x36, 0x57, 0xca, 0x7f, 0x94, + 0xa7, 0x5d, 0x01, 0xa7, 0x9b, 0x9d, 0x87, 0x64, 0xcf, 0xe5, 0x18, 0x37, + 0x3b, 0x08, 0xb6, 0x3f, 0x14, 0x99, 0x08, 0x8f, 0x5a, 0xba, 0x79, 0x5b, + 0x57, 0x6c, 0xcd, 0x14, 0xde, 0x9a, 0x07, 0x08, 0xee, 0xe9, 0x59, 0xdd, + 0xf1, 0x2f, 0xb6, 0x44, 0xed, 0xaf, 0x49, 0xfb, 0x31, 0x25, 0x2b, 0x6d, + 0x6e, 0xaf, 0xf2, 0x21, 0x9f, 0x0e, 0x2d, 0xe1, 0x8d, 0x29, 0x6d, 0x37, + 0x07, 0xc8, 0x68, 0xf5, 0x82, 0x48, 0xdf, 0xb6, 0xa0, 0x40, 0x99, 0x12, + 0x7f, 0x03, 0xea, 0x13, 0xa3, 0x7a, 0x2c, 0x71, 0x43, 0x8d, 0xf2, 0xf8, + 0x31, 0x57, 0x08, 0x3c, 0xad, 0x4a, 0xc7, 0x30, 0x80, 0x19, 0x9b, 0x40, + 0x0d, 0x4d, 0x53, 0xaf, 0x0c, 0x2b, 0x61, 0x96, 0x1f, 0xab, 0x0f, 0x81, + 0x4a, 0x86, 0xe9, 0xb5, 0x6d, 0x05, 0x05, 0x31, 0x73, 0x28, 0x02, 0xa3, + 0x79, 0x6e, 0x60, 0x52, 0x1c, 0x4e, 0x0a, 0xd0, 0x1d, 0x0e, 0xf6, 0x07, + 0xc0, 0xef, 0x21, 0x71, 0x68, 0xf7, 0xa2, 0xb7, 0x85, 0x0a, 0x85, 0x41, + 0x3e, 0xf6, 0x08, 0x6d, 0x16, 0x3a, 0x90, 0x0e, 0x1b, 0x03, 0xcb, 0x3b, + 0x78, 0x62, 0xa8, 0x3d, 0x77, 0xf2, 0x2e, 0xb0, 0xdc, 0xa6, 0x2b, 0xa4, + 0x9e, 0x1d, 0x23, 0x46, 0xd5, 0xb2, 0x5c, 0xba, 0x2d, 0x8d, 0x17, 0xfe, + 0x6c, 0x0a, 0x05, 0xac, 0xa5, 0x71, 0x22, 0x5d, 0x96, 0xad, 0x22, 0xf0, + 0x62, 0x83, 0x46, 0x28, 0x65, 0xd6, 0x95, 0x82, 0xb0, 0x79, 0x29, 0x4b, + 0xeb, 0x38, 0x0c, 0x90, 0x9d, 0xbe, 0x64, 0x78, 0x64, 0xe6, 0x55, 0xd6, + 0x46, 0x7d, 0x49, 0xe9, 0xbb, 0x2d, 0x10, 0x2c, 0x83, 0x0a, 0x32, 0x70, + 0xd8, 0x6f, 0xcb, 0xaa, 0xef, 0xb0, 0x0c, 0x3a, 0x04, 0x54, 0x21, 0x6a, + 0x1d, 0xac, 0x41, 0x35, 0x01, 0x79, 0xad, 0x14, 0x32, 0x1b, 0x38, 0x62, + 0x86, 0xf1, 0xbc, 0x7e, 0x0b, 0x79, 0x4b, 0xff, 0xa1, 0x24, 0x16, 0x46, + 0xfe, 0x9a, 0xba, 0x80, 0x21, 0xc1, 0x39, 0xef, 0xe3, 0xca, 0xf3, 0x42, + 0x6c, 0xd6, 0xf8, 0xd8, 0xe0, 0xfd, 0xea, 0x89, 0xfa, 0xb7, 0xed, 0x10, + 0x90, 0x32, 0x5a, 0x8d, 0x22, 0x33, 0x1e, 0xf3, 0x61, 0x77, 0xed, 0x0d, + 0x57, 0x19, 0x63, 0x5a, 0x4a, 0x05, 0xfc, 0x26, 0x66, 0x8f, 0x00, 0x09, + 0xbd, 0x4b, 0xee, 0x7a, 0xee, 0x38, 0x29, 0x6d, 0x79, 0x8f, 0x02, 0x49, + 0xd0, 0x88, 0xb5, 0x9c, 0x2b, 0x64, 0xa4, 0x84, 0xbb, 0xa5, 0xec, 0x78, + 0x6d, 0xef, 0xa7, 0xf2, 0xfd, 0xda, 0x04, 0x79, 0x42, 0x87, 0xad, 0xd1, + 0x7d, 0x3e, 0xe4, 0xa3, 0xdc, 0xf6, 0xdc, 0xf9, 0x2a, 0x54, 0xd1, 0x20, + 0xc4, 0x4c, 0x93, 0x5b, 0xc7, 0x6e, 0xce, 0x99, 0x91, 0x08, 0xdf, 0x06, + 0xdb, 0xf3, 0x50, 0x92, 0x08, 0x28, 0xa4, 0xd4, 0x11, 0x00, 0x5c, 0xb9, + 0xbe, 0x72, 0x26, 0xb6, 0x07, 0x31, 0x61, 0xcc, 0x6b, 0xdd, 0xd3, 0xe4, + 0x22, 0x92, 0x2b, 0x9b, 0xdc, 0x6b, 0xda, 0x81, 0x2e, 0x49, 0x13, 0x5b, + 0xcf, 0xca, 0x3a, 0x44, 0x1d, 0x28, 0x99, 0x27, 0x7a, 0xb7, 0x91, 0xd3, + 0xf7, 0x2a, 0x5d, 0x49, 0x80, 0x01, 0xfa, 0x7a, 0x8b, 0x7b, 0x4e, 0x65, + 0x04, 0x9e, 0x59, 0x1e, 0xa0, 0xd2, 0x22, 0x3e, 0x29, 0xc4, 0x67, 0x8f, + 0x47, 0xcb, 0x8b, 0x3e, 0x94, 0x83, 0x88, 0x6d, 0x12, 0x78, 0x84, 0x59, + 0x3a, 0xe1, 0xeb, 0x67, 0x87, 0x64, 0xe2, 0x35, 0x14, 0xae, 0x52, 0x74, + 0x80, 0x5c, 0x2f, 0x9c, 0x03, 0xb2, 0x29, 0xa1, 0x65, 0xbe, 0x17, 0x4d, + 0x3a, 0xc8, 0xf1, 0x0d, 0x15, 0xd6, 0x8c, 0x29, 0x60, 0xcb, 0x49, 0x43, + 0x98, 0x66, 0xdb, 0xe0, 0x20, 0xc5, 0x34, 0xfe, 0x15, 0x21, 0x69, 0x27, + 0xe6, 0x24, 0x70, 0x1a, 0xb6, 0x07, 0x3f, 0xb8, 0xc6, 0x98, 0xc0, 0xc2, + 0xdb, 0xa5, 0x80, 0x64, 0x04, 0xea, 0x56, 0xe6, 0x7f, 0x5a, 0x9a, 0xa7, + 0x52, 0x4f, 0x90, 0x79, 0xf9, 0x31, 0x41, 0x64, 0xc2, 0xd7, 0x03, 0x9b, + 0x88, 0xdb, 0x4d, 0xe2, 0xb8, 0xf1, 0x67, 0x5c, 0x97, 0x72, 0xd1, 0xb1, + 0x18, 0x99, 0xa2, 0x54, 0x68, 0x75, 0xeb, 0x40, 0xb1, 0x6a, 0xf0, 0xdb, + 0xe4, 0x2b, 0x68, 0xb6, 0x71, 0x10, 0x48, 0xe4, 0x0a, 0x94, 0x9d, 0x6a, + 0x2f, 0x80, 0xf2, 0x4a, 0x4f, 0x6a, 0xa9, 0xdd, 0x45, 0x7d, 0x39, 0xd8, + 0xc7, 0xe6, 0x94, 0x7f, 0x38, 0xa9, 0xf7, 0x73, 0x2b, 0x16, 0xed, 0x1a, + 0x7b, 0x4e, 0xac, 0x90, 0x87, 0xfa, 0xd7, 0x92, 0xbc, 0xf8, 0xff, 0xdb, + 0xfb, 0x9a, 0x26, 0xc9, 0x71, 0xe4, 0xca, 0xbf, 0x52, 0x16, 0x5b, 0x87, + 0x0e, 0xb3, 0xc8, 0x59, 0xe2, 0x1b, 0x3c, 0x95, 0xed, 0xce, 0x8e, 0xa4, + 0x91, 0x4c, 0xad, 0x9e, 0xee, 0x9e, 0x6e, 0x4d, 0x47, 0xc5, 0x71, 0x0f, + 0xba, 0xcc, 0x5e, 0x74, 0x58, 0xb3, 0x65, 0xe9, 0xb7, 0x2f, 0xfc, 0x03, + 0x20, 0x83, 0x74, 0x67, 0x30, 0x22, 0x32, 0xb3, 0x22, 0x3b, 0x4b, 0x66, + 0xa3, 0xae, 0xaa, 0x20, 0x41, 0x90, 0x80, 0x03, 0x0e, 0xf7, 0xe7, 0xef, + 0xd9, 0x2c, 0x86, 0x6b, 0x58, 0x5d, 0x81, 0xe0, 0x01, 0x70, 0x68, 0x08, + 0xf9, 0xa4, 0xc3, 0xe0, 0xe2, 0xab, 0x07, 0x39, 0x1f, 0xf9, 0x1e, 0x18, + 0xd8, 0x43, 0x0e, 0x37, 0xc4, 0x66, 0xda, 0xd8, 0x0b, 0x41, 0xd8, 0xf7, + 0x66, 0x1c, 0xa2, 0xa4, 0xf8, 0xb1, 0x6e, 0x89, 0x37, 0x33, 0xfc, 0x46, + 0x22, 0x25, 0x44, 0x07, 0x10, 0xd9, 0xf8, 0x42, 0x2c, 0xd3, 0x3b, 0xd0, + 0x71, 0xde, 0x42, 0x78, 0x93, 0xcf, 0xf3, 0xce, 0x95, 0x7f, 0x77, 0x3e, + 0x33, 0xd6, 0xac, 0x38, 0xc0, 0x21, 0xe0, 0x09, 0x0e, 0x4c, 0x23, 0x7a, + 0x54, 0xaa, 0xb3, 0xe5, 0xc8, 0x96, 0x49, 0x76, 0x09, 0x2e, 0x2e, 0xa6, + 0x96, 0x87, 0x3e, 0xf7, 0x2b, 0x98, 0x30, 0x49, 0x44, 0x97, 0x7a, 0xfb, + 0x66, 0x3b, 0xfa, 0x8d, 0x30, 0xf8, 0x86, 0x15, 0xe2, 0x87, 0x6d, 0x84, + 0xc1, 0xe6, 0x4e, 0xcb, 0x6d, 0xa3, 0xf9, 0x76, 0xd8, 0x82, 0xff, 0xf5, + 0x2f, 0xcf, 0x0e, 0x54, 0xe3, 0x28, 0x1b, 0x14, 0xef, 0x83, 0x07, 0xd2, + 0x81, 0x3f, 0x5d, 0xc5, 0xe8, 0x28, 0xc4, 0x55, 0x03, 0x29, 0x43, 0xee, + 0x8b, 0x97, 0x8d, 0x51, 0x3c, 0xcd, 0x34, 0x4a, 0x73, 0x4e, 0xc0, 0x9d, + 0xed, 0x62, 0xcf, 0x55, 0x73, 0xb5, 0x80, 0xa5, 0x85, 0x7a, 0xa8, 0x22, + 0x4b, 0x35, 0xb5, 0x3e, 0xda, 0x6f, 0x38, 0xb6, 0xa9, 0x6d, 0xfc, 0x05, + 0x70, 0x6c, 0x57, 0xab, 0x7c, 0xcc, 0x0e, 0xd7, 0x97, 0x12, 0x0e, 0xdc, + 0xde, 0xfb, 0x73, 0x3a, 0x45, 0x2a, 0x4d, 0x2a, 0xe9, 0xbb, 0xd1, 0xeb, + 0xb4, 0xa1, 0x56, 0x08, 0x94, 0x73, 0x30, 0x81, 0x49, 0xe2, 0x17, 0xc0, + 0xd7, 0x98, 0x27, 0x9d, 0xf8, 0xc8, 0x05, 0x71, 0xf5, 0x47, 0x59, 0xad, + 0x29, 0x3f, 0x91, 0x28, 0x94, 0x23, 0xef, 0x1c, 0x57, 0xe7, 0xff, 0x1f, + 0x6e, 0xee, 0xdf, 0x66, 0x2f, 0x40, 0x67, 0x69, 0x65, 0x4a, 0x1d, 0xf1, + 0xb6, 0xd1, 0xdb, 0xe4, 0x41, 0xdf, 0x6a, 0x34, 0xef, 0xcc, 0x52, 0x64, + 0x6a, 0xc9, 0xfb, 0x3d, 0xd0, 0xe8, 0x7d, 0x6f, 0xd4, 0xed, 0x00, 0x7f, + 0x95, 0x71, 0x34, 0x62, 0x4b, 0x0d, 0x4b, 0xa7, 0xb6, 0xb6, 0x11, 0x37, + 0xfa, 0xcd, 0x8f, 0xbb, 0xc1, 0xf6, 0x7e, 0x7a, 0x65, 0xe1, 0x87, 0x32, + 0xa0, 0x6f, 0xc8, 0x95, 0x93, 0xb9, 0x2a, 0x81, 0xaf, 0xf6, 0x76, 0xcc, + 0x4a, 0x05, 0xac, 0x1c, 0x4d, 0x93, 0x93, 0x36, 0x54, 0xf1, 0x0e, 0xd2, + 0xd9, 0xad, 0x18, 0x4c, 0xb3, 0x08, 0x6b, 0xa4, 0xaa, 0x01, 0x88, 0x9c, + 0x20, 0x42, 0xdb, 0x74, 0xc3, 0x31, 0x8d, 0xa9, 0xb7, 0x9a, 0x1c, 0x34, + 0x48, 0xc1, 0xe4, 0x40, 0xb1, 0xb1, 0x47, 0xda, 0x66, 0x4c, 0x76, 0x92, + 0x0c, 0x37, 0xb8, 0x8c, 0x69, 0x7f, 0x59, 0x7f, 0xba, 0x2f, 0x9e, 0x9e, + 0xf0, 0x64, 0xe0, 0x82, 0xad, 0x78, 0x71, 0x8d, 0x0c, 0x56, 0x82, 0xb2, + 0x06, 0xfe, 0x0e, 0xa8, 0xe2, 0x9e, 0x06, 0xef, 0xf6, 0x63, 0x2d, 0x23, + 0x56, 0x2e, 0x41, 0xb4, 0x38, 0x72, 0x7a, 0x95, 0x83, 0x75, 0x1d, 0xc9, + 0xd6, 0x6b, 0x59, 0xd4, 0x62, 0x0f, 0x0e, 0x1e, 0xf5, 0x95, 0x8a, 0x86, + 0x5c, 0x08, 0x9d, 0xf6, 0x11, 0xe0, 0xb7, 0x06, 0x45, 0x05, 0xf6, 0xcc, + 0xf0, 0xb2, 0x0c, 0xb2, 0xa0, 0xb1, 0x95, 0xb4, 0xce, 0xc0, 0x6f, 0x53, + 0x31, 0xd9, 0x9b, 0x6d, 0xfa, 0x6c, 0x3c, 0x75, 0x8e, 0xbf, 0xd0, 0xb5, + 0x32, 0xd3, 0xbb, 0x4d, 0x52, 0x21, 0x89, 0xbc, 0x5b, 0x59, 0x8d, 0xd9, + 0xd8, 0x3c, 0xe1, 0x57, 0x58, 0x51, 0x1e, 0x18, 0x42, 0x9e, 0x62, 0x55, + 0x47, 0x45, 0x05, 0x16, 0xae, 0x78, 0xb0, 0x47, 0xaa, 0xed, 0x43, 0x4a, + 0x06, 0x2c, 0xd2, 0xf7, 0xc9, 0x8c, 0x33, 0x18, 0xcd, 0xcb, 0xa3, 0x94, + 0xe9, 0xaa, 0x44, 0x8b, 0x8c, 0xea, 0x24, 0xf4, 0x5a, 0xdf, 0xd0, 0x29, + 0x18, 0x4c, 0x47, 0x1e, 0xb7, 0xcf, 0x08, 0x72, 0x43, 0xe8, 0x66, 0x4f, + 0x19, 0xf7, 0xc9, 0x03, 0x11, 0x90, 0x5a, 0x53, 0x2e, 0xfe, 0xc8, 0x5c, + 0x46, 0x24, 0x7a, 0x8a, 0xc9, 0x97, 0xa7, 0x75, 0xc5, 0x89, 0x60, 0xc3, + 0x16, 0x2a, 0x47, 0xd0, 0x63, 0x58, 0x33, 0xf6, 0x45, 0x36, 0x7a, 0x51, + 0xe0, 0xa1, 0xba, 0xb9, 0x4e, 0xa8, 0x04, 0xff, 0x4a, 0x52, 0x2c, 0x3b, + 0x44, 0xda, 0x74, 0xf4, 0x99, 0x55, 0xab, 0x16, 0x38, 0x23, 0x13, 0x4f, + 0xd3, 0x83, 0x75, 0x50, 0xcb, 0x84, 0x90, 0x18, 0xc4, 0x99, 0x80, 0x6b, + 0xb2, 0x46, 0x4c, 0xba, 0xeb, 0x6c, 0x5d, 0x0f, 0xce, 0x5c, 0xdc, 0x09, + 0x94, 0x42, 0x4c, 0x6f, 0xf0, 0x25, 0x53, 0x7c, 0x5b, 0xd0, 0x62, 0xb0, + 0x40, 0x22, 0xf2, 0x20, 0xf2, 0x2a, 0xaf, 0xf3, 0x44, 0x18, 0x0b, 0x99, + 0x32, 0xcf, 0xa1, 0x90, 0x31, 0x2d, 0x1a, 0x3d, 0xc1, 0x68, 0xaa, 0xc6, + 0xef, 0x40, 0x0e, 0xd7, 0x65, 0x16, 0xd9, 0xb4, 0xc0, 0x9e, 0x20, 0x1b, + 0x35, 0x43, 0x6b, 0x1c, 0xb1, 0xd9, 0x04, 0x58, 0x3f, 0x30, 0xb6, 0x02, + 0xec, 0x47, 0x9d, 0x05, 0xb5, 0x56, 0x14, 0x78, 0xf2, 0x58, 0x09, 0x9b, + 0xe9, 0x9f, 0xc0, 0xa2, 0x3b, 0x7d, 0xa5, 0x88, 0xe9, 0xb2, 0x5d, 0xc1, + 0x52, 0x14, 0x01, 0x08, 0x56, 0x8c, 0xde, 0x55, 0xdd, 0x47, 0x30, 0xff, + 0x75, 0xc0, 0x6b, 0x4a, 0x17, 0x8d, 0x6e, 0xa3, 0xfc, 0xf1, 0xb4, 0x85, + 0xc5, 0x87, 0xe9, 0xf5, 0x26, 0xfa, 0x6d, 0x4d, 0xbc, 0x96, 0xe9, 0x6f, + 0xbe, 0x07, 0xa6, 0xd6, 0xa1, 0x8f, 0xcd, 0xcc, 0x4d, 0xbf, 0x6e, 0xdf, + 0x0b, 0xf3, 0x96, 0xcc, 0x94, 0xe9, 0x7a, 0xc8, 0xa7, 0x62, 0x4e, 0xce, + 0x11, 0xab, 0xbf, 0xbf, 0xa4, 0xc2, 0x24, 0x24, 0x71, 0xcb, 0xdc, 0x2a, + 0x8f, 0x7e, 0x0c, 0xab, 0xdf, 0xf9, 0x63, 0x17, 0x4e, 0xaa, 0x9b, 0xe4, + 0x95, 0xed, 0xe3, 0xee, 0x35, 0xe0, 0x57, 0x45, 0x80, 0xde, 0x4c, 0x30, + 0xa6, 0x65, 0x99, 0x4e, 0xf9, 0x0c, 0xc5, 0x7d, 0xab, 0xa0, 0x5b, 0x95, + 0x36, 0x34, 0x93, 0xb6, 0xa4, 0xfd, 0x4e, 0x66, 0x0b, 0x83, 0x06, 0x8c, + 0x21, 0x35, 0x15, 0x92, 0x52, 0x19, 0xfa, 0xb6, 0x0d, 0xad, 0xb1, 0x0a, + 0x9d, 0x9b, 0xcf, 0xa3, 0xeb, 0x98, 0xbc, 0x9e, 0x95, 0xfe, 0x0a, 0x25, + 0x92, 0xcf, 0x80, 0x84, 0x5b, 0x82, 0xd2, 0x04, 0x00, 0xdc, 0x74, 0xab, + 0xbe, 0x4a, 0x68, 0xe5, 0xca, 0x00, 0x30, 0x00, 0x14, 0xd2, 0xfb, 0xc5, + 0x1e, 0xfc, 0xfb, 0xaa, 0x02, 0x1a, 0xc0, 0xa7, 0xb6, 0x84, 0xb7, 0x80, + 0xf8, 0x5d, 0x39, 0x10, 0x00, 0x33, 0x4f, 0x18, 0x32, 0x51, 0x81, 0x66, + 0xe4, 0x7f, 0xb7, 0xb4, 0xb1, 0x1b, 0xa0, 0xea, 0x30, 0xc4, 0x7c, 0x08, + 0x67, 0x76, 0x16, 0x43, 0x43, 0x72, 0x96, 0xc4, 0x02, 0x59, 0x00, 0x39, + 0x60, 0x01, 0xc7, 0xa3, 0x8f, 0xa9, 0x15, 0xb2, 0x21, 0xf9, 0x0f, 0x00, + 0xe3, 0x43, 0x3e, 0x51, 0x1b, 0x89, 0xd4, 0xd4, 0x7a, 0x3a, 0xda, 0x92, + 0x02, 0x02, 0xde, 0xfb, 0x44, 0x17, 0x3e, 0x45, 0xbe, 0xf0, 0xe8, 0x40, + 0xf4, 0x9d, 0xb0, 0xd8, 0xf8, 0xd8, 0x9e, 0xd0, 0xd8, 0xf0, 0x38, 0x3a, + 0x88, 0x00, 0xb1, 0x38, 0x3d, 0x81, 0x1c, 0x0e, 0xc3, 0xf0, 0x6e, 0x0a, + 0x4a, 0x63, 0x23, 0x10, 0xd4, 0x76, 0xd8, 0xc1, 0x48, 0x95, 0x76, 0xb5, + 0x0b, 0x28, 0x2c, 0x89, 0x3b, 0x0e, 0x83, 0xc0, 0x89, 0x50, 0x08, 0x77, + 0x21, 0xba, 0xd5, 0xd2, 0xc3, 0xc3, 0xb1, 0x0a, 0xf9, 0xe2, 0xd1, 0x08, + 0x9e, 0x08, 0xaf, 0x97, 0xbf, 0x63, 0x81, 0xb8, 0x98, 0xf9, 0xc3, 0xc4, + 0x89, 0x1e, 0x07, 0x3e, 0x2c, 0xd6, 0x67, 0xb9, 0xc4, 0x72, 0xf2, 0x3e, + 0x55, 0xde, 0x69, 0x83, 0xfe, 0x18, 0x3f, 0xc5, 0x13, 0xa7, 0x24, 0x3a, + 0x68, 0x44, 0xcf, 0x0a, 0x2f, 0x11, 0xfb, 0xf1, 0x8b, 0x59, 0x7a, 0x7e, + 0x65, 0x10, 0x91, 0xab, 0xa4, 0x45, 0x69, 0x2b, 0x0a, 0x69, 0x2e, 0x06, + 0x1c, 0xf6, 0x01, 0x7d, 0xd0, 0xdf, 0xda, 0x70, 0x3f, 0xfd, 0xde, 0x87, + 0x5b, 0x20, 0xf0, 0x37, 0xda, 0x80, 0x2f, 0x78, 0x87, 0x28, 0xd6, 0x9a, + 0xb3, 0x3a, 0x75, 0x5e, 0xcf, 0xa5, 0x2d, 0x27, 0x5e, 0xb5, 0x09, 0xb7, + 0xb1, 0x89, 0xa0, 0x37, 0x11, 0x9e, 0xd9, 0xb1, 0x86, 0x65, 0xf7, 0x80, + 0xea, 0x07, 0x40, 0x33, 0x09, 0x9b, 0xe9, 0x79, 0xcc, 0xb8, 0xc3, 0xa1, + 0xea, 0x3c, 0xe8, 0xb7, 0x10, 0x37, 0x7d, 0x87, 0x1b, 0x97, 0xf9, 0x78, + 0x76, 0xdd, 0x44, 0x0d, 0x26, 0x4c, 0x12, 0x38, 0x3a, 0xde, 0xb9, 0x9a, + 0x25, 0xee, 0x75, 0x46, 0x14, 0x5a, 0xd9, 0xe8, 0x0b, 0x13, 0xe1, 0x92, + 0x43, 0x46, 0x58, 0xb2, 0x86, 0x80, 0x85, 0x07, 0x55, 0xea, 0x1c, 0xc3, + 0x24, 0x68, 0x6c, 0x2b, 0xcf, 0x32, 0xfb, 0xd5, 0x9e, 0x77, 0xde, 0x9f, + 0xed, 0xd3, 0x66, 0xba, 0xb0, 0x30, 0x0e, 0x51, 0x6a, 0x53, 0x7f, 0x05, + 0xa9, 0xc5, 0xb5, 0x57, 0xe1, 0x37, 0xe1, 0x65, 0x63, 0xfe, 0xcc, 0xd3, + 0xef, 0x7d, 0x00, 0x66, 0x7e, 0xd2, 0xec, 0xfb, 0x6f, 0xfc, 0xe6, 0x42, + 0x23, 0x57, 0x7d, 0xf2, 0xaf, 0xe1, 0x18, 0x7d, 0x1d, 0x57, 0x4c, 0xa6, + 0x68, 0x6f, 0x82, 0x3c, 0x00, 0x7f, 0xbf, 0x07, 0xf1, 0x8e, 0x08, 0x32, + 0x0e, 0xf0, 0x0e, 0x08, 0xb7, 0xc5, 0xbf, 0xe9, 0x02, 0x5f, 0x9c, 0x13, + 0xeb, 0x77, 0xb3, 0x07, 0x88, 0xad, 0x1b, 0xde, 0x80, 0xab, 0x8e, 0x14, + 0xd6, 0xe2, 0x79, 0x28, 0xed, 0x6d, 0xcf, 0x0c, 0xb5, 0xc6, 0x89, 0x92, + 0x26, 0x50, 0xed, 0x56, 0x7f, 0xd3, 0xeb, 0x95, 0x8c, 0xd8, 0x8b, 0x65, + 0xb1, 0xd2, 0xce, 0xa0, 0xf8, 0x67, 0xa7, 0xd6, 0x79, 0x9a, 0xb6, 0x0f, + 0xac, 0x6f, 0x03, 0x26, 0xae, 0xb4, 0x11, 0x37, 0xb5, 0xf1, 0xa2, 0xd3, + 0xec, 0xac, 0xaf, 0xc1, 0x6b, 0x5b, 0x56, 0xf9, 0x49, 0xdd, 0xb2, 0x60, + 0xaa, 0x1d, 0xe2, 0x56, 0x86, 0xa8, 0x71, 0x91, 0xf3, 0xe8, 0x23, 0x69, + 0xd1, 0x96, 0xb1, 0xbe, 0x27, 0x49, 0x44, 0xcd, 0x4e, 0x5e, 0x61, 0xc6, + 0x1b, 0x25, 0x5a, 0x47, 0x33, 0x59, 0x9b, 0x96, 0x75, 0x49, 0xe3, 0xbd, + 0x86, 0x66, 0xdb, 0x53, 0xf5, 0x75, 0xf2, 0xb2, 0x2d, 0x5c, 0xeb, 0xc0, + 0x35, 0xea, 0x3a, 0x19, 0xae, 0x5f, 0x5a, 0x7b, 0xfa, 0xe8, 0x9e, 0x78, + 0x99, 0xe2, 0x6b, 0xcf, 0x96, 0x39, 0x73, 0xe9, 0x15, 0x8c, 0x70, 0x90, + 0x35, 0xe1, 0xe8, 0x2f, 0x7f, 0x35, 0x13, 0xde, 0xe9, 0xf9, 0xf3, 0x37, + 0x39, 0x0f, 0x95, 0xaf, 0x60, 0x95, 0x5c, 0x44, 0x8e, 0x6c, 0xf5, 0xc1, + 0x1b, 0xfc, 0xce, 0x12, 0x19, 0x1d, 0xba, 0x55, 0xbd, 0xd3, 0x41, 0xf0, + 0x46, 0xb0, 0xee, 0x45, 0xe6, 0x06, 0xb3, 0x10, 0xaa, 0xcf, 0x2b, 0x3a, + 0xcf, 0x8a, 0x98, 0xd8, 0x5a, 0x3d, 0xfa, 0xaa, 0x1a, 0xd9, 0x6b, 0xad, + 0x30, 0x2f, 0x7a, 0x0f, 0x0c, 0xfe, 0xc1, 0x86, 0x7c, 0x0b, 0x62, 0x69, + 0x75, 0x5d, 0x98, 0x84, 0x87, 0x06, 0x1a, 0xad, 0xa9, 0x19, 0x23, 0x15, + 0xc0, 0xa5, 0xb8, 0x52, 0x7e, 0x94, 0x40, 0xef, 0xab, 0x59, 0xe2, 0xf7, + 0xb2, 0xd6, 0x45, 0xbc, 0xcb, 0x12, 0x23, 0x87, 0x86, 0x4d, 0x1a, 0x58, + 0xf5, 0x82, 0xd3, 0xaa, 0x54, 0xcd, 0x0e, 0x91, 0xd9, 0x4f, 0xb5, 0xb2, + 0xda, 0xe0, 0xf9, 0x16, 0xeb, 0xa1, 0x38, 0x4d, 0x0c, 0x52, 0x93, 0xa6, + 0xfb, 0x04, 0xc7, 0xe2, 0x70, 0xfa, 0x04, 0x98, 0x0b, 0x60, 0x26, 0x31, + 0x00, 0xf2, 0xb0, 0xd4, 0x68, 0xa8, 0x35, 0xd9, 0x18, 0x4c, 0xa0, 0xd6, + 0xe0, 0xaa, 0x8e, 0x03, 0x07, 0xf5, 0xb1, 0xd6, 0x25, 0x2a, 0xee, 0x3b, + 0x1a, 0xcf, 0x27, 0x7f, 0xe7, 0xa1, 0x9c, 0x3c, 0xe3, 0xc1, 0x18, 0x42, + 0x51, 0xc5, 0xa7, 0xa5, 0x28, 0x42, 0xeb, 0xaa, 0x6d, 0x1d, 0xa4, 0xee, + 0x80, 0x1a, 0x1d, 0xfd, 0x3d, 0xd4, 0x2c, 0x36, 0x10, 0xa3, 0x10, 0x17, + 0xec, 0xd8, 0x3d, 0x8e, 0x2a, 0xb4, 0x76, 0x7c, 0xc0, 0x88, 0x84, 0x8b, + 0x94, 0x12, 0x3f, 0xbb, 0x30, 0x8e, 0x17, 0x06, 0x62, 0x4b, 0x28, 0x1d, + 0xcb, 0x83, 0xb7, 0x93, 0x6b, 0xd2, 0xa4, 0xb1, 0x10, 0x7b, 0x0e, 0x43, + 0x8d, 0x5f, 0xae, 0xe3, 0x17, 0x73, 0xd0, 0xde, 0xb1, 0xbd, 0xd0, 0x4a, + 0x0e, 0xcc, 0x58, 0x41, 0x55, 0x18, 0xf5, 0x3e, 0x3a, 0x88, 0x0f, 0x58, + 0x86, 0x86, 0x88, 0xcb, 0x9b, 0x79, 0xa1, 0x10, 0x39, 0xd2, 0x97, 0x6b, + 0xeb, 0x72, 0x16, 0x65, 0xce, 0xbf, 0xd2, 0x9a, 0x88, 0x81, 0x0f, 0x57, + 0x5d, 0xd9, 0xb8, 0x52, 0x81, 0x19, 0x2b, 0x2a, 0x01, 0x8c, 0xeb, 0x60, + 0xa3, 0xbf, 0xd6, 0xe3, 0xca, 0x8b, 0x95, 0x6a, 0xb9, 0xc4, 0x51, 0x54, + 0x4b, 0x70, 0xb8, 0xe2, 0xa6, 0x15, 0x52, 0xe0, 0xb8, 0xcf, 0xf9, 0xe2, + 0xea, 0x28, 0xf8, 0x57, 0x65, 0x8c, 0x2e, 0xde, 0x96, 0xba, 0xf7, 0xe9, + 0xe5, 0x7c, 0x2f, 0x2b, 0x66, 0x8c, 0x65, 0x79, 0xd2, 0x04, 0x9a, 0xb7, + 0x25, 0x31, 0x67, 0x1f, 0x3b, 0x47, 0x01, 0x55, 0x60, 0xa9, 0x80, 0xb8, + 0x21, 0x06, 0x24, 0xf3, 0x05, 0xa0, 0x8c, 0xc0, 0x80, 0xcf, 0x65, 0xf5, + 0x13, 0xa5, 0x9f, 0xd4, 0xeb, 0xb5, 0x0a, 0xe9, 0x99, 0xf8, 0x10, 0x77, + 0x2e, 0x6a, 0x8f, 0x70, 0x31, 0x26, 0xf3, 0x95, 0x68, 0xab, 0x37, 0xdf, + 0x03, 0x03, 0x7b, 0x88, 0x39, 0x3d, 0x1b, 0xfb, 0x12, 0x1a, 0xcc, 0x1f, + 0x3e, 0xda, 0x3f, 0x34, 0xd6, 0x6a, 0x0a, 0xef, 0xd2, 0xf8, 0xbc, 0x3b, + 0x97, 0x44, 0xe6, 0x9c, 0xef, 0xec, 0xed, 0x22, 0x8d, 0x8d, 0xe6, 0xac, + 0x23, 0x05, 0x09, 0x4a, 0x41, 0x20, 0x87, 0x8d, 0x41, 0xe6, 0x1c, 0x43, + 0xac, 0x89, 0x89, 0xf3, 0x10, 0xc4, 0x81, 0xe6, 0x91, 0x2c, 0x67, 0x72, + 0x0d, 0xe6, 0x07, 0x12, 0x42, 0x4f, 0xc1, 0xdc, 0xd6, 0x48, 0xd0, 0x14, + 0x8b, 0xcb, 0x14, 0xf0, 0x5a, 0xcf, 0x47, 0xcb, 0xc2, 0x91, 0xa4, 0xf6, + 0x20, 0xdd, 0xd0, 0x65, 0xf9, 0x86, 0x5e, 0xbd, 0xa1, 0x97, 0x6e, 0x78, + 0x40, 0x3b, 0xfb, 0x13, 0xd4, 0x36, 0x3c, 0x9f, 0x9d, 0xe9, 0xc9, 0xe0, + 0xae, 0x1f, 0xd0, 0x2b, 0x9c, 0x9e, 0x18, 0xba, 0x8b, 0x1b, 0x62, 0x97, + 0xdf, 0x9d, 0x6d, 0xca, 0x3c, 0xf2, 0xc6, 0x6d, 0xdf, 0xce, 0x96, 0x84, + 0x4c, 0x7c, 0x5a, 0xe8, 0xe2, 0x00, 0x0e, 0x6f, 0x46, 0xba, 0x2a, 0x57, + 0x71, 0x92, 0x3a, 0xe9, 0x53, 0x17, 0x63, 0xd7, 0x2f, 0xbd, 0xa8, 0x79, + 0xeb, 0xae, 0xd2, 0x4c, 0x8a, 0xfb, 0x4d, 0x9e, 0x03, 0x66, 0xc4, 0x46, + 0x1e, 0xce, 0x34, 0x5e, 0xcf, 0x04, 0xff, 0xa1, 0x6c, 0x75, 0xe9, 0x86, + 0xf2, 0x22, 0x29, 0xd6, 0xc6, 0x18, 0x4a, 0x33, 0x43, 0x61, 0x89, 0x5c, + 0x16, 0xee, 0xdd, 0x99, 0x96, 0x4c, 0x51, 0x6f, 0xce, 0x38, 0x00, 0xe9, + 0x4f, 0x40, 0x88, 0xd3, 0x98, 0x02, 0x8d, 0x60, 0x1c, 0xf3, 0x47, 0x00, + 0xd3, 0x17, 0xc2, 0x35, 0x0e, 0xc6, 0x96, 0x1b, 0x0e, 0x65, 0x43, 0x2b, + 0x73, 0xfc, 0x30, 0xf7, 0x2d, 0x2b, 0xa9, 0x07, 0xe0, 0xc0, 0x19, 0x3b, + 0xe7, 0x04, 0x9e, 0xdb, 0xa1, 0xf2, 0x94, 0x41, 0x01, 0xad, 0x63, 0x41, + 0x92, 0xf2, 0xa7, 0x8a, 0xcc, 0x2c, 0xde, 0x0b, 0x1e, 0x47, 0x3d, 0xa6, + 0xbc, 0xf3, 0x34, 0xdf, 0x30, 0xe0, 0xb6, 0xea, 0x13, 0xed, 0xaa, 0x21, + 0x51, 0x6a, 0x9d, 0xf7, 0xde, 0x0e, 0x2b, 0x38, 0xe8, 0x21, 0x07, 0xba, + 0x36, 0x95, 0x53, 0xb1, 0xb9, 0x98, 0x25, 0xd8, 0xcd, 0xde, 0x55, 0x7c, + 0x39, 0x5e, 0x65, 0x12, 0xf3, 0x43, 0x91, 0x82, 0xb7, 0x1f, 0x28, 0xb1, + 0x3f, 0x3a, 0xc0, 0x70, 0x9e, 0xee, 0x03, 0x86, 0x23, 0x6c, 0x4e, 0x84, + 0x63, 0xc7, 0xa0, 0x42, 0x66, 0x38, 0x01, 0xa9, 0x1c, 0xe2, 0xe7, 0xc9, + 0xa4, 0x91, 0x18, 0x09, 0x8d, 0xc0, 0x5c, 0x83, 0x99, 0x02, 0x8f, 0x11, + 0x9f, 0x45, 0x61, 0x69, 0xfc, 0x26, 0x98, 0xf7, 0xa7, 0x1f, 0xf7, 0x8d, + 0x58, 0x30, 0x1d, 0x89, 0xab, 0x03, 0x9f, 0xe7, 0x32, 0x23, 0x1e, 0x3c, + 0x3f, 0x23, 0x66, 0xc6, 0xc9, 0x47, 0xe9, 0x72, 0xac, 0xfe, 0xa7, 0x7f, + 0x80, 0x78, 0x0d, 0x82, 0xe5, 0xe1, 0x2b, 0xfa, 0x8a, 0x34, 0x20, 0x36, + 0x42, 0xee, 0x4f, 0x9f, 0x8f, 0xa3, 0x86, 0xa7, 0xab, 0x0f, 0xa0, 0xab, + 0x80, 0x1d, 0xc0, 0x62, 0x15, 0x4d, 0xa6, 0x37, 0xa0, 0xe3, 0x05, 0xdf, + 0xc9, 0x18, 0x7a, 0x8b, 0x40, 0x05, 0xcf, 0x79, 0x3b, 0x47, 0x40, 0x59, + 0xcf, 0xef, 0xc7, 0xf1, 0x15, 0x00, 0xe1, 0xc2, 0x13, 0xc7, 0x46, 0xd1, + 0x53, 0xc2, 0xfa, 0xea, 0x3d, 0x74, 0xa1, 0x4b, 0x53, 0x3a, 0x48, 0x78, + 0x23, 0x2a, 0xe6, 0xa9, 0x4c, 0x81, 0x34, 0x0b, 0xb8, 0x23, 0x5d, 0x2b, + 0xbd, 0x69, 0x09, 0x23, 0xf4, 0xcb, 0x2a, 0x14, 0x1f, 0x6b, 0x5c, 0xe0, + 0xbb, 0xf7, 0xdd, 0x28, 0x31, 0xa6, 0xba, 0x55, 0xb9, 0x13, 0x63, 0xb4, + 0x79, 0x99, 0x53, 0xaa, 0x70, 0xdd, 0x62, 0x2f, 0x4a, 0xa4, 0x36, 0x85, + 0x1e, 0xfe, 0x37, 0xcb, 0xb1, 0x9c, 0xd9, 0xd7, 0x63, 0xaf, 0xeb, 0xb7, + 0xed, 0x05, 0x20, 0x96, 0xe0, 0x30, 0x9c, 0xd1, 0x3f, 0x3b, 0x29, 0x1e, + 0x05, 0xe9, 0x67, 0x6b, 0x8e, 0x40, 0xca, 0x36, 0xdd, 0x57, 0x1a, 0xde, + 0xef, 0x20, 0x71, 0x4e, 0x63, 0xa8, 0xf1, 0x0c, 0x00, 0x8c, 0x00, 0x1a, + 0x9a, 0x95, 0xdb, 0x34, 0xfe, 0xa4, 0x8e, 0x02, 0xa1, 0x06, 0x4e, 0xca, + 0x36, 0xeb, 0x84, 0x0c, 0x56, 0x1a, 0x13, 0x4e, 0x22, 0x43, 0x52, 0xed, + 0x24, 0x5e, 0xb7, 0x7e, 0x7f, 0xa8, 0x5c, 0x4f, 0x02, 0x37, 0x9e, 0x76, + 0x7f, 0xca, 0x97, 0x08, 0x01, 0x53, 0x7e, 0xa8, 0x98, 0x4c, 0xf9, 0xaa, + 0x6b, 0x36, 0x97, 0x34, 0x24, 0xce, 0xcc, 0xe4, 0xee, 0xde, 0x83, 0xff, + 0xac, 0x30, 0xd1, 0x55, 0x7e, 0xb1, 0x5b, 0xce, 0x9e, 0x5a, 0x50, 0x55, + 0x56, 0x62, 0xc1, 0xb8, 0x0c, 0xc7, 0x66, 0xd2, 0xa9, 0xee, 0xf3, 0xbc, + 0x05, 0x20, 0x77, 0x85, 0xc3, 0x98, 0x4f, 0x47, 0x47, 0xd3, 0xae, 0xfc, + 0x7f, 0xa8, 0x75, 0xe5, 0xaa, 0xa6, 0xf2, 0x77, 0x5c, 0xe3, 0x8f, 0xdc, + 0x61, 0xdc, 0x2a, 0xd6, 0x30, 0xd4, 0x59, 0xee, 0x84, 0xe1, 0x35, 0x50, + 0xe4, 0xcc, 0xcc, 0xbf, 0x5b, 0xe5, 0x25, 0x98, 0x00, 0x87, 0xd0, 0x85, + 0x17, 0x2d, 0x2e, 0x7c, 0x7d, 0xeb, 0x7a, 0x9d, 0x27, 0xc2, 0xe7, 0x13, + 0x59, 0xea, 0xa9, 0xda, 0x1d, 0xfc, 0xd7, 0x96, 0x43, 0x85, 0x3f, 0xe7, + 0x5a, 0x74, 0xb8, 0x01, 0xe0, 0x52, 0x16, 0xbf, 0x83, 0x4c, 0x57, 0xbb, + 0x63, 0x27, 0x81, 0x90, 0xa5, 0x28, 0xaa, 0x1e, 0x39, 0x36, 0x8a, 0xdc, + 0xcc, 0xf4, 0x13, 0x0a, 0x3f, 0x32, 0xc7, 0xcb, 0x11, 0xaa, 0x14, 0xd5, + 0x54, 0x87, 0x11, 0x57, 0x9a, 0x45, 0x86, 0x0b, 0x5c, 0x3e, 0x75, 0x49, + 0x98, 0x68, 0x09, 0xaf, 0x35, 0x52, 0x6d, 0x4c, 0xaa, 0xba, 0x94, 0x4b, + 0x01, 0xe5, 0x2f, 0x00, 0xf2, 0xa1, 0x91, 0x19, 0xaf, 0xc5, 0xb6, 0xfa, + 0x2e, 0x6e, 0x6c, 0xeb, 0xb5, 0x2c, 0x12, 0xd3, 0x4e, 0x09, 0x12, 0x4f, + 0xe1, 0xd2, 0x02, 0x15, 0xb4, 0xf1, 0x80, 0xd9, 0x76, 0x70, 0xd7, 0x6b, + 0x37, 0x99, 0x2a, 0xbb, 0x72, 0x29, 0xc7, 0x62, 0x68, 0xad, 0x85, 0x70, + 0xbb, 0x47, 0x12, 0xee, 0x8e, 0x0e, 0x3b, 0x1e, 0xff, 0x40, 0x2a, 0xe2, + 0x01, 0x1c, 0x5d, 0x98, 0x53, 0xd0, 0xa6, 0x04, 0x65, 0x79, 0x3a, 0x57, + 0x2a, 0x5f, 0xa9, 0x86, 0x38, 0x9a, 0x48, 0x53, 0xd8, 0x06, 0x02, 0x05, + 0x43, 0x22, 0xd4, 0x53, 0x99, 0x02, 0x29, 0xbb, 0x44, 0x11, 0x62, 0xc3, + 0x32, 0xc7, 0xf9, 0xfc, 0xfc, 0x1c, 0x2b, 0xb1, 0xad, 0x70, 0x03, 0xdf, + 0x91, 0x66, 0x77, 0x08, 0x49, 0x21, 0xe3, 0x05, 0x47, 0x08, 0x7b, 0xeb, + 0x97, 0x94, 0x90, 0x50, 0x29, 0xd5, 0x3e, 0x2b, 0xcc, 0xc4, 0xb3, 0x3b, + 0x72, 0x37, 0xf4, 0x2b, 0x3e, 0x47, 0x79, 0xbc, 0x6a, 0x4d, 0x51, 0xb3, + 0x26, 0x71, 0xbd, 0x2a, 0x7d, 0xab, 0x5d, 0x16, 0xcc, 0x1b, 0xf0, 0x51, + 0x67, 0xed, 0x2c, 0x4f, 0x8a, 0xc6, 0x77, 0x7c, 0x58, 0xa4, 0x09, 0x40, + 0x03, 0xf3, 0xb9, 0xf2, 0x98, 0xf3, 0x74, 0xc0, 0x61, 0xfa, 0x3c, 0x52, + 0x84, 0xd3, 0xdc, 0xc0, 0x51, 0x9b, 0x24, 0xb3, 0x71, 0xa2, 0xd0, 0x18, + 0xe2, 0xbf, 0x06, 0xfe, 0x57, 0xbe, 0x94, 0x45, 0x30, 0xa8, 0x12, 0x19, + 0xa7, 0x51, 0x3e, 0x49, 0xe8, 0x6c, 0x3f, 0x56, 0xb7, 0x4e, 0x7b, 0x7d, + 0xf7, 0x7a, 0x2d, 0x72, 0x50, 0xf2, 0xce, 0xdf, 0x4e, 0x5d, 0x5b, 0xbc, + 0x9e, 0x20, 0x56, 0x85, 0x57, 0x78, 0x3a, 0x72, 0x33, 0x64, 0x06, 0xd4, + 0x87, 0x5a, 0x1a, 0x8e, 0x6f, 0x5f, 0x55, 0x47, 0xb4, 0x63, 0x9b, 0x7c, + 0x68, 0x5b, 0x3e, 0x0b, 0x16, 0xfa, 0x40, 0x10, 0x78, 0x84, 0x94, 0xa6, + 0xf5, 0x20, 0xbb, 0xef, 0xe2, 0xc6, 0x6a, 0x6d, 0x95, 0xc3, 0xa8, 0xb1, + 0x0a, 0xad, 0x36, 0x61, 0x01, 0xeb, 0xad, 0x36, 0x61, 0xb7, 0x34, 0x61, + 0x58, 0x19, 0x93, 0x54, 0x9c, 0x26, 0x65, 0xe8, 0x52, 0x58, 0xb4, 0x5c, + 0x6d, 0x45, 0x46, 0xf3, 0xb3, 0x26, 0xb3, 0xce, 0x95, 0x94, 0xb7, 0x74, + 0x29, 0x54, 0x82, 0x7c, 0x65, 0xcd, 0x56, 0xda, 0x80, 0x09, 0x77, 0xf0, + 0x37, 0x04, 0xf4, 0x8f, 0x7e, 0xa6, 0xcf, 0xac, 0x9f, 0x6c, 0xf0, 0xd2, + 0x69, 0x84, 0x91, 0x15, 0x85, 0xdb, 0xca, 0xb4, 0x51, 0x8f, 0xc4, 0x91, + 0x50, 0xf4, 0x3d, 0x0e, 0x9c, 0xb9, 0xfd, 0x56, 0xc9, 0x1e, 0xb3, 0xa9, + 0xa4, 0x1f, 0x14, 0xf5, 0x31, 0xb4, 0xa2, 0x4c, 0x36, 0x50, 0x69, 0x42, + 0x54, 0x5f, 0x5d, 0x5e, 0x2b, 0xb3, 0xa9, 0x22, 0x98, 0xca, 0xe9, 0x40, + 0x1c, 0x48, 0x18, 0x49, 0x99, 0xa1, 0xd3, 0xb4, 0x83, 0x12, 0x09, 0x96, + 0x60, 0xd9, 0x0b, 0xb9, 0x79, 0xc5, 0xe7, 0x4b, 0x8d, 0xae, 0x08, 0x15, + 0x4e, 0x72, 0xdb, 0xb7, 0x2e, 0x7c, 0x92, 0xbc, 0x82, 0x6e, 0x36, 0x55, + 0x64, 0x64, 0xc0, 0x8a, 0x1a, 0x82, 0x1e, 0xe3, 0x76, 0x4d, 0x3e, 0x61, + 0x15, 0x37, 0x33, 0x04, 0x14, 0x65, 0x95, 0x0f, 0x83, 0xc3, 0x4b, 0x7f, + 0x8b, 0x84, 0xb6, 0x66, 0x70, 0x12, 0x95, 0x7c, 0xd3, 0x5f, 0x50, 0xc7, + 0x78, 0xbc, 0x8d, 0xeb, 0x85, 0xf0, 0x2f, 0x7a, 0x50, 0x92, 0x80, 0xcb, + 0xdd, 0xec, 0x9b, 0x49, 0xbd, 0x87, 0x2f, 0x04, 0x42, 0x6d, 0x8e, 0x64, + 0xd6, 0x02, 0x86, 0xd2, 0x9e, 0xb0, 0x08, 0x48, 0xf5, 0x4f, 0xfb, 0xac, + 0x23, 0x7c, 0x1f, 0xf9, 0x68, 0xf5, 0x7a, 0x47, 0xb8, 0x1f, 0x80, 0xd4, + 0x3b, 0x5d, 0xeb, 0x16, 0x9a, 0x73, 0x9f, 0x88, 0xeb, 0xc8, 0xb1, 0x28, + 0x4c, 0x09, 0x16, 0xd5, 0xf5, 0x23, 0xce, 0x6f, 0xe1, 0x88, 0x65, 0x3e, + 0x4d, 0x4c, 0xa0, 0xce, 0x2b, 0x49, 0x66, 0x60, 0xda, 0xd8, 0xec, 0xf9, + 0xc2, 0x0c, 0xa9, 0xf5, 0x28, 0xef, 0xec, 0x64, 0x29, 0x13, 0x17, 0xfa, + 0xa0, 0xf2, 0xbe, 0xcf, 0x1b, 0x92, 0xf8, 0x1e, 0xbc, 0x1f, 0xf2, 0x0a, + 0x6e, 0xa6, 0xfc, 0x2e, 0x51, 0x2f, 0x85, 0x63, 0x68, 0x02, 0x43, 0x42, + 0xd5, 0x58, 0x78, 0x07, 0xb2, 0xa1, 0x57, 0x98, 0xe3, 0x8f, 0x90, 0x40, + 0xf4, 0xb7, 0x45, 0x54, 0xbe, 0x11, 0x61, 0x7f, 0x2f, 0x33, 0x36, 0xd5, + 0x63, 0xe5, 0x86, 0xdc, 0xdf, 0x2c, 0x15, 0xb1, 0xab, 0xfa, 0x28, 0x92, + 0xaf, 0xe0, 0xbb, 0xce, 0xce, 0x29, 0x39, 0x8d, 0x55, 0x1f, 0xb5, 0xfb, + 0x36, 0xd1, 0x27, 0x13, 0xfd, 0xaf, 0x00, 0x0a, 0xdb, 0x4e, 0xfb, 0x7e, + 0xdf, 0x5c, 0x7c, 0x83, 0x33, 0x59, 0xac, 0xf9, 0x88, 0x63, 0xe6, 0x0e, + 0xd2, 0xc3, 0x53, 0x70, 0xe4, 0x75, 0x95, 0x6f, 0x4a, 0xdd, 0x1b, 0x16, + 0x90, 0x7b, 0x2e, 0x47, 0x1b, 0xea, 0xd3, 0xd0, 0x11, 0x25, 0xd9, 0x1f, + 0x7e, 0xb0, 0xf5, 0x1d, 0xb2, 0x84, 0x88, 0xd3, 0xdc, 0x49, 0xf1, 0x87, + 0x2c, 0x3c, 0x94, 0x61, 0xe7, 0x23, 0x78, 0x9e, 0xf3, 0x95, 0x6e, 0xf4, + 0x79, 0x29, 0xdf, 0x7c, 0x6a, 0x49, 0xee, 0x63, 0x25, 0x14, 0x45, 0xe5, + 0xba, 0x54, 0x0f, 0xdc, 0x42, 0x10, 0xc0, 0x1a, 0x39, 0x56, 0x1f, 0x18, + 0x19, 0x86, 0x1e, 0x75, 0x57, 0x7d, 0xed, 0xb5, 0x12, 0x93, 0x79, 0xf8, + 0xb0, 0xde, 0x2e, 0x45, 0x0e, 0x25, 0x08, 0xf6, 0x02, 0xf1, 0x7f, 0xcb, + 0xc4, 0xdb, 0x25, 0xb5, 0xf0, 0x3a, 0x6d, 0x89, 0xc1, 0x5e, 0x61, 0x99, + 0xbf, 0x15, 0xcb, 0xf4, 0x8d, 0x66, 0x28, 0x9a, 0xbd, 0xea, 0x18, 0xca, + 0x2c, 0x43, 0x97, 0xca, 0xb8, 0xca, 0xe4, 0x19, 0x6a, 0x46, 0xbc, 0xca, + 0x6f, 0xf4, 0x98, 0x91, 0xd9, 0xa8, 0xb9, 0xb5, 0xac, 0x60, 0xb9, 0x20, + 0xb5, 0x35, 0x26, 0x28, 0x97, 0x49, 0x45, 0xcb, 0x35, 0x99, 0x3d, 0xd1, + 0x00, 0x30, 0xb0, 0x82, 0x72, 0xff, 0xdd, 0x90, 0x85, 0x28, 0xdf, 0xa8, + 0x46, 0x83, 0x71, 0x3e, 0x25, 0x1c, 0x6a, 0x71, 0x66, 0x6f, 0x63, 0x5e, + 0x59, 0xbe, 0x51, 0x2f, 0xa4, 0x29, 0xb7, 0xa6, 0x5c, 0xf1, 0x8d, 0xba, + 0x21, 0xf9, 0x3d, 0x68, 0x5e, 0x42, 0x98, 0x71, 0x2d, 0x90, 0x08, 0x65, + 0x42, 0x51, 0x9f, 0xd2, 0x36, 0xaa, 0x33, 0xfa, 0xed, 0x2d, 0xaa, 0xff, + 0x26, 0xea, 0x88, 0x62, 0x5d, 0x49, 0xd5, 0x0a, 0xad, 0x2b, 0x5c, 0xe5, + 0xc7, 0x3e, 0x6c, 0xa2, 0x65, 0x12, 0xca, 0xeb, 0xda, 0xd9, 0x5d, 0x0c, + 0xd3, 0x39, 0xe9, 0xab, 0xce, 0x2d, 0xfe, 0x68, 0xda, 0x4a, 0x3f, 0xa7, + 0xe6, 0xfa, 0xfc, 0x59, 0x57, 0xa9, 0x11, 0xd5, 0x0b, 0x97, 0xc1, 0xba, + 0x2e, 0xd5, 0x3c, 0xfb, 0x10, 0xf4, 0xf4, 0xa5, 0x42, 0xa8, 0xda, 0xeb, + 0xf4, 0xe1, 0xfd, 0x86, 0x40, 0xdf, 0x8b, 0xce, 0x92, 0x9b, 0x56, 0xbd, + 0x7f, 0x03, 0x01, 0xc3, 0x78, 0x43, 0x99, 0xdd, 0xb8, 0x1a, 0xcc, 0x94, + 0xa9, 0xec, 0x59, 0x54, 0xad, 0xc9, 0x37, 0xcb, 0xbc, 0x8a, 0x69, 0x16, + 0x84, 0x0b, 0x13, 0x44, 0xc4, 0x42, 0xf2, 0x0a, 0x65, 0xbd, 0xdf, 0x97, + 0x63, 0xff, 0x83, 0x5c, 0x78, 0x57, 0x29, 0x98, 0x6e, 0xa7, 0x62, 0x35, + 0x1c, 0x2c, 0x06, 0xe9, 0x56, 0xf0, 0x7c, 0x06, 0x0b, 0x5c, 0x38, 0x08, + 0xa8, 0x75, 0x04, 0x7c, 0x27, 0xf8, 0x1d, 0x20, 0x07, 0xe2, 0x31, 0x10, + 0xf2, 0xce, 0x20, 0xab, 0x31, 0xfe, 0xad, 0x6c, 0x5c, 0xae, 0x3f, 0xed, + 0x5b, 0x09, 0x5d, 0xe0, 0x1c, 0x45, 0x25, 0x75, 0x05, 0xe8, 0x41, 0x45, + 0xb5, 0xe5, 0x53, 0xcd, 0x7e, 0xb4, 0x4b, 0x0c, 0xea, 0xdc, 0xda, 0x46, + 0xe0, 0xe8, 0x28, 0x5f, 0xf6, 0x04, 0x45, 0x73, 0x40, 0x2b, 0x7e, 0xec, + 0x08, 0x44, 0xdf, 0x45, 0x22, 0xe7, 0xe9, 0xe2, 0x53, 0x65, 0x88, 0xc5, + 0x2e, 0x62, 0xb0, 0x84, 0x99, 0x5a, 0x49, 0x43, 0xb5, 0x15, 0xde, 0x71, + 0x90, 0x8f, 0x70, 0x11, 0x21, 0x9e, 0xca, 0x8e, 0xd0, 0xef, 0x19, 0xe2, + 0xd3, 0xf5, 0xf4, 0x50, 0xcb, 0x14, 0x13, 0x10, 0x2a, 0x07, 0x18, 0x62, + 0x07, 0x6f, 0xca, 0x5c, 0x3a, 0x18, 0x5a, 0x4b, 0xd8, 0x75, 0x82, 0xc2, + 0x21, 0xc8, 0xac, 0xaf, 0x2a, 0xca, 0x70, 0x25, 0x16, 0x05, 0xc0, 0x9b, + 0x31, 0xd3, 0x4e, 0x87, 0x52, 0xac, 0xf8, 0x5e, 0x9c, 0x9c, 0xeb, 0xa8, + 0xea, 0xd0, 0x1d, 0x1d, 0x66, 0x2f, 0x3c, 0x3e, 0xc0, 0x13, 0x47, 0x50, + 0x7b, 0x10, 0x95, 0x6f, 0x64, 0xaa, 0x26, 0x67, 0x57, 0x60, 0xad, 0x5c, + 0x60, 0x13, 0x3b, 0x25, 0x24, 0x08, 0x4f, 0x66, 0xb0, 0x86, 0x12, 0x1c, + 0x0d, 0x1c, 0x97, 0x20, 0x82, 0xdb, 0xd4, 0x7b, 0x23, 0xd7, 0x50, 0x3e, + 0x8d, 0x83, 0x16, 0x2a, 0xe9, 0x46, 0xf5, 0x77, 0x45, 0x15, 0x2f, 0xd9, + 0xb9, 0x5c, 0xc1, 0x81, 0x6c, 0x21, 0xab, 0xfd, 0x8e, 0xc4, 0x0c, 0x61, + 0xe0, 0xcb, 0x68, 0x1d, 0xb1, 0xb4, 0xa2, 0x67, 0x06, 0x21, 0xa3, 0x7f, + 0x91, 0x1c, 0x2f, 0x36, 0xfd, 0x78, 0x0b, 0x6e, 0xb1, 0xe8, 0x43, 0xe8, + 0x6e, 0xac, 0x56, 0xd0, 0x78, 0x2c, 0x4d, 0x4d, 0xe2, 0x9e, 0x7b, 0x4d, + 0x02, 0x19, 0x01, 0x97, 0xf5, 0xbd, 0xb3, 0x55, 0x54, 0xae, 0x15, 0x32, + 0xbe, 0x9d, 0x21, 0x37, 0x16, 0x30, 0x6b, 0xc9, 0x85, 0xcf, 0x08, 0x73, + 0x36, 0xa4, 0x77, 0x0d, 0xc9, 0x00, 0x4a, 0x5d, 0x26, 0x72, 0xf5, 0x7d, + 0x24, 0x7c, 0xb3, 0xd7, 0xf3, 0x97, 0x62, 0xe5, 0xac, 0x92, 0x0e, 0xa0, + 0x74, 0x88, 0xe0, 0x80, 0x5c, 0x03, 0x27, 0xb9, 0x3d, 0x55, 0xd9, 0x05, + 0xfd, 0xfe, 0x4d, 0xdc, 0xd6, 0x7a, 0x25, 0x6f, 0xa5, 0x30, 0x5f, 0xbf, + 0x9f, 0x55, 0xc0, 0x95, 0x26, 0xe4, 0x54, 0xd4, 0x8d, 0xb6, 0xfa, 0xa7, + 0x62, 0xab, 0xa6, 0x8c, 0x0e, 0xd1, 0xa9, 0x21, 0xd4, 0x22, 0x25, 0x80, + 0x2f, 0xd7, 0xac, 0xc1, 0xee, 0xc3, 0xff, 0xf8, 0xfb, 0xff, 0xfe, 0xbf, + 0xff, 0xe7, 0x43, 0x3b, 0x18, 0x6e, 0x4e, 0x1d, 0x8c, 0x55, 0x0e, 0x50, + 0x44, 0xf4, 0x11, 0x49, 0xab, 0xc6, 0x3c, 0xe6, 0xd3, 0x04, 0x7a, 0x32, + 0x77, 0x83, 0x3c, 0x11, 0xcb, 0x59, 0x2c, 0xfa, 0x5b, 0xde, 0x3c, 0x5d, + 0x27, 0xc2, 0x1c, 0x5c, 0x21, 0xdd, 0x70, 0x96, 0x59, 0xd0, 0x0f, 0x9b, + 0xfd, 0xbb, 0xcc, 0x28, 0xfc, 0x20, 0x96, 0x32, 0xf9, 0xf3, 0xe4, 0xe4, + 0x06, 0x27, 0x2c, 0x2e, 0x9c, 0x30, 0xcf, 0x1e, 0xd1, 0xd1, 0x8f, 0x7c, + 0xf2, 0x7a, 0x8e, 0xa1, 0xf3, 0x12, 0x8b, 0x7d, 0xae, 0xfe, 0xb5, 0x08, + 0x65, 0x4f, 0xef, 0x4f, 0xe5, 0xf7, 0x0a, 0xdb, 0x86, 0x92, 0xa5, 0xdc, + 0xbf, 0x42, 0xd5, 0xa0, 0x47, 0xb7, 0x33, 0xcf, 0xcf, 0x3a, 0x97, 0xef, + 0xc7, 0x9b, 0xfd, 0x0b, 0x6c, 0xd6, 0x3b, 0x54, 0x53, 0x50, 0x92, 0x59, + 0x0b, 0x97, 0x2a, 0x7e, 0x2d, 0xd3, 0xd3, 0x4a, 0x9d, 0xee, 0x3d, 0xfb, + 0xa0, 0x9b, 0xcb, 0x02, 0x0e, 0x96, 0xf1, 0x9e, 0xa1, 0xba, 0xf7, 0xd1, + 0x33, 0x23, 0x66, 0xa2, 0x1a, 0x12, 0xda, 0x6c, 0x06, 0xd7, 0x95, 0x83, + 0x40, 0x68, 0x4c, 0x52, 0xc5, 0x5b, 0x4f, 0xeb, 0x42, 0x0f, 0x52, 0xa4, + 0x63, 0xbe, 0x95, 0xf3, 0x23, 0x5a, 0x55, 0x4b, 0x50, 0xfd, 0x6e, 0x91, + 0xe3, 0x62, 0xc1, 0xaf, 0x9a, 0xd7, 0xd0, 0xd8, 0x6f, 0xce, 0x55, 0x9e, + 0x87, 0xcc, 0x3b, 0xd4, 0x4d, 0x04, 0x97, 0x0a, 0x30, 0x74, 0xfa, 0x39, + 0x89, 0x09, 0x08, 0xe6, 0xaf, 0x0a, 0xf3, 0xe9, 0x10, 0x53, 0x40, 0x9c, + 0x1c, 0xa9, 0xf2, 0xac, 0x9a, 0xfe, 0x46, 0x2a, 0xf9, 0x26, 0x64, 0xcd, + 0x34, 0xad, 0x36, 0x5d, 0xf2, 0xc2, 0x6b, 0x9c, 0xa4, 0x1c, 0x75, 0xde, + 0x9d, 0x23, 0xfe, 0x4f, 0x2a, 0xf2, 0x1b, 0xaa, 0x34, 0xec, 0x17, 0xa4, + 0xf8, 0xe1, 0x14, 0x88, 0x1b, 0x51, 0xe0, 0xb9, 0x66, 0x7a, 0xa8, 0xb6, + 0x71, 0x43, 0xc6, 0x27, 0x32, 0x70, 0xb9, 0x95, 0x7e, 0x9c, 0x00, 0x7d, + 0xb8, 0xc8, 0xc4, 0x90, 0xbd, 0x7d, 0x37, 0xe1, 0xa7, 0xe7, 0x8c, 0x10, + 0x21, 0x78, 0x2d, 0x81, 0x6a, 0x19, 0xff, 0x63, 0x9f, 0x28, 0x0e, 0x62, + 0x89, 0x06, 0x20, 0x23, 0x7a, 0x83, 0x21, 0x38, 0x43, 0xc6, 0xa2, 0x38, + 0xcb, 0x71, 0x4b, 0x6f, 0xdb, 0x88, 0x2f, 0xe6, 0xa7, 0xe4, 0xea, 0xd7, + 0xee, 0x8a, 0xbd, 0x84, 0xe3, 0xb1, 0xc1, 0xf0, 0x0c, 0x05, 0x1b, 0x02, + 0x07, 0x1b, 0xf0, 0xa8, 0x4e, 0x41, 0x94, 0xc0, 0x4c, 0x1f, 0xd8, 0x61, + 0x5f, 0xf3, 0x57, 0x10, 0xbe, 0xc1, 0x9e, 0x07, 0x3a, 0x8a, 0x38, 0x0e, + 0x6c, 0x90, 0x7e, 0x69, 0xbf, 0x42, 0xec, 0xdc, 0x77, 0x22, 0xa0, 0x7a, + 0x49, 0x88, 0xd8, 0xaa, 0xe0, 0x84, 0x31, 0x69, 0x35, 0x20, 0x8b, 0x43, + 0x49, 0x1b, 0x94, 0x37, 0xb3, 0x02, 0x6d, 0xbe, 0x07, 0xe6, 0xf8, 0x21, + 0xba, 0x6b, 0x81, 0x45, 0xf6, 0x12, 0xcc, 0xdc, 0x4a, 0xae, 0xbb, 0x15, + 0xdd, 0x7c, 0xf1, 0xd2, 0xb3, 0x95, 0x68, 0x1e, 0x5a, 0x45, 0x1d, 0x1e, + 0x37, 0xb8, 0x7e, 0xf0, 0x91, 0x0b, 0x54, 0xa9, 0x32, 0xee, 0xe8, 0xc2, + 0xa9, 0x87, 0x09, 0x05, 0x59, 0xab, 0xc8, 0x15, 0xa9, 0x76, 0xf0, 0x7e, + 0x5f, 0x36, 0x4a, 0x8b, 0xe1, 0xa5, 0x88, 0x3c, 0x6a, 0x3e, 0x00, 0x22, + 0x99, 0x1b, 0xea, 0x4a, 0x4b, 0xa9, 0x34, 0xc5, 0xac, 0x59, 0xa8, 0x4f, + 0x1d, 0x20, 0xd2, 0x76, 0xf2, 0x43, 0x28, 0xff, 0xe8, 0xfa, 0x48, 0x3f, + 0xd8, 0x21, 0xba, 0xd2, 0x68, 0x0f, 0x3a, 0x4a, 0xf0, 0x00, 0xe0, 0xf2, + 0xaa, 0x0f, 0x31, 0xe5, 0x29, 0x11, 0x1f, 0x83, 0x6c, 0xa0, 0xf4, 0x28, + 0x7a, 0x24, 0x9c, 0x00, 0x2d, 0xc2, 0xf3, 0xca, 0x14, 0xd6, 0x5e, 0x36, + 0xc8, 0xcb, 0xae, 0xf3, 0xfc, 0xec, 0x72, 0x8e, 0x83, 0xb7, 0x83, 0x72, + 0x5b, 0x07, 0x3d, 0xf7, 0xb1, 0xe7, 0x1f, 0x7a, 0xb4, 0xb3, 0xf2, 0x16, + 0x21, 0xee, 0xf1, 0x67, 0x2f, 0x1e, 0xd2, 0xdc, 0xd3, 0xa6, 0xfa, 0x00, + 0xbc, 0xee, 0xd2, 0x41, 0x6d, 0x85, 0xc2, 0xc9, 0x4c, 0x00, 0xf1, 0xed, + 0x5e, 0xb0, 0xac, 0x8b, 0x85, 0x09, 0x67, 0xfc, 0x94, 0xed, 0x06, 0x73, + 0x98, 0x9f, 0xf5, 0x64, 0x2e, 0xde, 0x77, 0xb7, 0x37, 0xfd, 0x8b, 0xba, + 0x37, 0x51, 0x4d, 0x52, 0x2b, 0xa5, 0x37, 0x8c, 0x5a, 0xed, 0x1a, 0xfd, + 0xae, 0x87, 0xad, 0x09, 0x96, 0xfc, 0xef, 0x50, 0x56, 0x84, 0x37, 0x01, + 0x4a, 0x54, 0x96, 0x03, 0xff, 0x16, 0xe8, 0xea, 0xb8, 0x59, 0x69, 0x51, + 0x26, 0xb0, 0x08, 0xbb, 0x9f, 0xc0, 0xed, 0x91, 0x39, 0x1f, 0x28, 0xe6, + 0xb0, 0x7e, 0xa9, 0x92, 0x01, 0x4d, 0xb1, 0xf3, 0x44, 0x44, 0x83, 0xc1, + 0x6a, 0x03, 0xc8, 0x54, 0x33, 0xd5, 0xba, 0xac, 0xc4, 0xfb, 0x0e, 0xb6, + 0x0b, 0xde, 0xee, 0x3c, 0xf1, 0xdf, 0x43, 0x00, 0xd6, 0x07, 0x56, 0x37, + 0x0b, 0xf8, 0x03, 0x44, 0xcc, 0x63, 0x77, 0x44, 0x61, 0xa5, 0x04, 0x26, + 0x19, 0x4f, 0x4c, 0x50, 0x6f, 0x2b, 0x3f, 0xbd, 0x25, 0xf8, 0x3e, 0xaa, + 0xa2, 0x21, 0xc4, 0x1e, 0xd2, 0x02, 0x1c, 0xca, 0xb5, 0x04, 0x75, 0x2c, + 0x17, 0x25, 0xde, 0xa2, 0x68, 0x4f, 0x75, 0x81, 0xca, 0xd0, 0xb1, 0x76, + 0x72, 0x3f, 0x76, 0x0f, 0x51, 0x0f, 0x50, 0x23, 0x6e, 0xa3, 0x5a, 0x3f, + 0x55, 0x77, 0x52, 0x89, 0xff, 0x17, 0xbf, 0xe1, 0xc2, 0xf9, 0x67, 0x32, + 0x41, 0xdf, 0x72, 0x04, 0x1c, 0xf4, 0xe6, 0xac, 0x83, 0x57, 0xf7, 0x43, + 0xa7, 0xec, 0x63, 0x4a, 0x51, 0xf8, 0xcd, 0xd1, 0xb5, 0xaf, 0x90, 0x5f, + 0x04, 0x52, 0x7f, 0x35, 0x2c, 0x69, 0x6d, 0xe7, 0xe1, 0xff, 0x9e, 0x07, + 0x62, 0x51, 0x4c, 0xec, 0xd0, 0xdb, 0xab, 0x4b, 0xb1, 0x50, 0x5b, 0x69, + 0x56, 0xcb, 0xad, 0x2a, 0x30, 0x2d, 0x56, 0xca, 0x95, 0x78, 0x98, 0x59, + 0x54, 0x27, 0x4d, 0x0f, 0xe3, 0x10, 0x15, 0x3e, 0xbb, 0x9c, 0x19, 0x0e, + 0xc8, 0xde, 0x9e, 0xec, 0x15, 0x06, 0x77, 0x69, 0xf9, 0x8f, 0xf3, 0x32, + 0xa8, 0xb2, 0xfd, 0x42, 0x52, 0xce, 0x87, 0x62, 0x7d, 0x98, 0x14, 0x21, + 0xb2, 0xd2, 0x40, 0xe6, 0x09, 0x29, 0xab, 0x1d, 0xd7, 0xce, 0x5c, 0xba, + 0x0e, 0xa6, 0xb4, 0xda, 0x87, 0x90, 0x57, 0xbe, 0x0e, 0x5b, 0x9f, 0x74, + 0x9f, 0x3b, 0xfb, 0x4e, 0x0b, 0x4a, 0x16, 0x0d, 0x93, 0x62, 0xcc, 0x92, + 0x0d, 0x7e, 0xb9, 0xf3, 0xdc, 0xf4, 0x99, 0x4d, 0xfd, 0x1e, 0x57, 0xdf, + 0x78, 0xc7, 0x9d, 0x62, 0xf0, 0xb6, 0xbe, 0xdf, 0xb6, 0x97, 0x5d, 0x1f, + 0xc0, 0x6d, 0xc3, 0x4c, 0x83, 0x6c, 0xae, 0xb8, 0xf4, 0xaa, 0x6b, 0xa7, + 0x6f, 0xf9, 0x08, 0x1e, 0x41, 0x53, 0x12, 0xc5, 0x01, 0xd3, 0x76, 0xaf, + 0x1a, 0xbd, 0x89, 0x95, 0x89, 0x24, 0xb5, 0x1c, 0x71, 0x1d, 0xd6, 0xba, + 0xaf, 0xb1, 0x72, 0x20, 0x8e, 0x31, 0xed, 0x70, 0x55, 0xaa, 0xc5, 0x63, + 0xa1, 0xa5, 0x8b, 0x9c, 0x05, 0xc6, 0x91, 0xdf, 0xb8, 0xe1, 0x19, 0x14, + 0x9a, 0x56, 0xb7, 0x3b, 0xa0, 0x3a, 0xd9, 0x37, 0x57, 0x41, 0x84, 0xf1, + 0x19, 0x93, 0x6d, 0xc8, 0x59, 0x38, 0x39, 0x3d, 0x87, 0xb7, 0x23, 0xd6, + 0x60, 0xd7, 0x44, 0x22, 0xad, 0x49, 0xc5, 0xed, 0x89, 0xb4, 0x17, 0x6f, + 0x48, 0x8f, 0x71, 0xe5, 0xb5, 0x94, 0x90, 0xb6, 0x5c, 0xb0, 0xca, 0x25, + 0xd7, 0x38, 0x4e, 0x98, 0x2d, 0x23, 0x4e, 0x20, 0xcb, 0xac, 0x30, 0xb1, + 0x15, 0x00, 0x82, 0xa1, 0x51, 0x92, 0x83, 0x98, 0x6e, 0x7a, 0xa4, 0xd8, + 0xdb, 0xf3, 0x31, 0xbd, 0x38, 0x3e, 0xa6, 0x6f, 0x06, 0xb5, 0xdc, 0xb2, + 0x24, 0x9f, 0x40, 0x54, 0x90, 0x83, 0x79, 0xcf, 0x78, 0x87, 0x88, 0xb5, + 0xd1, 0x98, 0x24, 0xcf, 0xfd, 0x69, 0x4d, 0xb7, 0x26, 0x5c, 0x93, 0x65, + 0xbb, 0x99, 0xc3, 0x7b, 0x97, 0x3a, 0x84, 0x19, 0x34, 0xf9, 0xcc, 0x5b, + 0xf1, 0x8f, 0x35, 0xdf, 0x26, 0xf7, 0xe4, 0xa5, 0xf8, 0x7a, 0x5d, 0xaf, + 0x3a, 0x52, 0xaa, 0x8c, 0x1e, 0x4c, 0xc9, 0x83, 0xbf, 0x01, 0x89, 0xa4, + 0xac, 0xb1, 0xc4, 0xb9, 0x7f, 0x44, 0xba, 0x29, 0x3f, 0x8f, 0xc9, 0xd5, + 0xad, 0x0e, 0x2f, 0xea, 0x2f, 0x85, 0xe5, 0xa5, 0x32, 0xec, 0x67, 0x9a, + 0xd4, 0x9a, 0xd4, 0x64, 0xeb, 0x82, 0x40, 0x5a, 0xb3, 0x7c, 0x9d, 0x05, + 0x3c, 0x72, 0x19, 0x3e, 0x88, 0x78, 0xba, 0x3f, 0x9b, 0xf1, 0x4c, 0xc0, + 0xd5, 0xf1, 0x9c, 0x3f, 0x76, 0x59, 0x4d, 0x50, 0x08, 0x9a, 0x79, 0x92, + 0x56, 0x9e, 0xa7, 0x70, 0x14, 0x61, 0x5b, 0xf9, 0xa3, 0x5c, 0xf5, 0x2d, + 0xa4, 0x8a, 0x6f, 0xca, 0x55, 0x88, 0x28, 0xcd, 0xe8, 0x47, 0x3c, 0xca, + 0xf3, 0xed, 0x2f, 0xb9, 0xf3, 0xba, 0xc9, 0x78, 0xc5, 0x78, 0xef, 0x5e, + 0x90, 0x45, 0x8c, 0x26, 0x88, 0x3c, 0x29, 0x07, 0x82, 0xc5, 0x02, 0x3c, + 0xcf, 0x2f, 0x1a, 0x35, 0xc7, 0x63, 0x64, 0xda, 0x51, 0x40, 0x29, 0x05, + 0x5d, 0xb9, 0xfa, 0x5b, 0xc1, 0xd2, 0x78, 0x0f, 0x0c, 0xd7, 0x21, 0x74, + 0xf9, 0x7a, 0x99, 0x94, 0x20, 0x96, 0x18, 0x9f, 0x59, 0x2b, 0xb7, 0xf2, + 0xfe, 0x72, 0xed, 0x72, 0xf5, 0x5e, 0xa8, 0x82, 0xb1, 0x1b, 0xc2, 0xfe, + 0x5a, 0x91, 0x47, 0x82, 0x4a, 0x7f, 0xd7, 0x4f, 0xc3, 0x1f, 0xc2, 0x86, + 0x9a, 0x93, 0xb0, 0xb7, 0x53, 0xc3, 0xaf, 0xd1, 0x26, 0x8b, 0xe6, 0x39, + 0x37, 0x78, 0x8f, 0xf1, 0x88, 0x88, 0xa4, 0x4d, 0x79, 0xfd, 0x09, 0xc5, + 0x9f, 0xa8, 0x4f, 0x58, 0xc4, 0x12, 0x56, 0x6f, 0xec, 0x95, 0x1b, 0x6f, + 0x99, 0x23, 0xbb, 0x40, 0x7d, 0x07, 0x9f, 0x17, 0xbb, 0xbf, 0xad, 0xef, + 0xe1, 0xde, 0x2e, 0xc0, 0x9c, 0x39, 0x00, 0xb9, 0x0b, 0x1e, 0x69, 0xce, + 0x85, 0xf2, 0xce, 0xfe, 0x66, 0xee, 0xb4, 0x87, 0x36, 0x9a, 0x30, 0xe4, + 0xbb, 0xb7, 0x63, 0x52, 0x3f, 0xa9, 0x41, 0x4d, 0xa0, 0x07, 0x05, 0xcd, + 0xcc, 0xeb, 0x20, 0x70, 0x6a, 0x19, 0x95, 0x85, 0x83, 0x92, 0x07, 0x53, + 0x1d, 0xbc, 0x3d, 0x62, 0x0d, 0xb2, 0x85, 0x50, 0x1b, 0x82, 0x85, 0xcb, + 0x41, 0x33, 0xae, 0xa0, 0x4a, 0xad, 0x55, 0xd0, 0x6f, 0xf3, 0xe7, 0x84, + 0x63, 0x54, 0xb9, 0x46, 0x76, 0xa1, 0x4a, 0x34, 0xaf, 0xfa, 0xc3, 0x66, + 0xc5, 0x35, 0x37, 0xb2, 0x6f, 0xfe, 0x1c, 0x55, 0xf3, 0x3b, 0x93, 0x56, + 0x9e, 0x9b, 0xbe, 0xbe, 0x74, 0x18, 0x4c, 0x95, 0x43, 0x9f, 0xae, 0x17, + 0xfe, 0xb2, 0x00, 0x6b, 0xde, 0x9f, 0x6b, 0x32, 0x8b, 0x9a, 0x84, 0x59, + 0x2a, 0x74, 0xaa, 0x23, 0x7a, 0xc9, 0x7f, 0x0d, 0x42, 0x64, 0x6f, 0xca, + 0x7f, 0x78, 0x41, 0x3f, 0xfa, 0xfd, 0xed, 0xa5, 0x3f, 0x2b, 0xaa, 0x12, + 0x18, 0x10, 0xa1, 0xa4, 0xc6, 0x45, 0x7b, 0x97, 0xb5, 0xb3, 0x08, 0x3a, + 0x03, 0xb9, 0xb3, 0x2a, 0xcc, 0x0b, 0xe7, 0x9e, 0xd0, 0x1c, 0xfc, 0x48, + 0x32, 0x33, 0x66, 0xa6, 0x68, 0x6b, 0x43, 0xbc, 0xcc, 0xdf, 0xb3, 0xd8, + 0xc3, 0xe8, 0x89, 0xae, 0x29, 0x07, 0xfa, 0xdc, 0xe9, 0x05, 0x40, 0x4a, + 0x23, 0x40, 0xd0, 0x63, 0xd7, 0xf6, 0x4f, 0xb1, 0xe0, 0x31, 0x52, 0xe9, + 0x11, 0x05, 0x78, 0x62, 0xe3, 0x1e, 0x1a, 0x12, 0xff, 0x80, 0xb5, 0x0a, + 0x70, 0x0e, 0xf4, 0x89, 0xa2, 0x44, 0x49, 0x5f, 0xe0, 0x52, 0x94, 0x9f, + 0x91, 0xa1, 0xd8, 0x90, 0xc4, 0xe7, 0x81, 0xdf, 0x78, 0x65, 0x89, 0xcc, + 0x0a, 0x7d, 0x7f, 0xce, 0x10, 0xb1, 0xf4, 0x63, 0x79, 0xa8, 0x70, 0x6b, + 0xe5, 0x02, 0x99, 0xdd, 0xea, 0x56, 0x54, 0x71, 0xc7, 0x63, 0x15, 0xcc, + 0xa4, 0x83, 0x0b, 0xe6, 0x9e, 0x0a, 0xa1, 0x95, 0xac, 0x36, 0x4c, 0xa7, + 0x73, 0x1a, 0x9e, 0x71, 0x86, 0x6e, 0x28, 0x80, 0x64, 0x16, 0x58, 0x12, + 0x3a, 0x7e, 0x90, 0x8c, 0x25, 0xc2, 0xba, 0x60, 0x60, 0x99, 0xad, 0x0b, + 0xb4, 0x9c, 0x57, 0x80, 0x5d, 0xa9, 0x0d, 0x8e, 0xd8, 0x83, 0xdd, 0x8a, + 0xe4, 0x24, 0x28, 0x4e, 0x9a, 0xae, 0xeb, 0x50, 0x89, 0x70, 0xf7, 0xc3, + 0xaf, 0x8a, 0xc9, 0xdf, 0x4c, 0x7e, 0x61, 0x43, 0xb0, 0xe5, 0x7f, 0x98, + 0x28, 0x2c, 0xde, 0x5c, 0xe9, 0x66, 0xb1, 0xbf, 0x8c, 0x41, 0x54, 0x17, + 0xc0, 0xcb, 0xcb, 0x89, 0x29, 0x47, 0x2d, 0x44, 0x90, 0x6b, 0x9d, 0x0d, + 0x78, 0x80, 0x89, 0x59, 0xa2, 0xd1, 0x91, 0x4d, 0x71, 0xa5, 0xac, 0x25, + 0x49, 0x75, 0x76, 0x48, 0x68, 0x52, 0xfe, 0x19, 0xe6, 0x75, 0x57, 0x3c, + 0x49, 0x64, 0xce, 0x5b, 0x11, 0x9d, 0x89, 0x92, 0x94, 0xc6, 0x2d, 0x83, + 0xf7, 0xbb, 0xb8, 0x07, 0xa6, 0xc2, 0x21, 0x66, 0xd8, 0xcb, 0x0d, 0x1a, + 0xd8, 0x55, 0x76, 0xab, 0x58, 0xec, 0x7b, 0xdb, 0x40, 0x45, 0xc5, 0xdd, + 0x91, 0xd1, 0xcc, 0x23, 0x46, 0x6d, 0xb2, 0x5a, 0x5d, 0x15, 0x25, 0x17, + 0xe5, 0x2d, 0x00, 0x65, 0x63, 0x20, 0x6c, 0xc6, 0x7b, 0x2a, 0x10, 0xff, + 0x51, 0xb0, 0x0c, 0x01, 0x30, 0xb4, 0x0f, 0x32, 0xf1, 0x7d, 0x6a, 0xe9, + 0x7b, 0x8b, 0x00, 0x72, 0xa2, 0x0e, 0x1a, 0x35, 0xef, 0x89, 0x8c, 0x1e, + 0xe8, 0xad, 0x62, 0x62, 0x44, 0x18, 0x24, 0xb9, 0xab, 0x8e, 0x5d, 0x1e, + 0xc8, 0x47, 0x77, 0x48, 0xa8, 0x8d, 0x48, 0x9a, 0x21, 0x16, 0x0b, 0x36, + 0xd8, 0x00, 0xb2, 0xd0, 0x73, 0xaa, 0xa4, 0x15, 0xbd, 0x81, 0xb0, 0x1c, + 0x59, 0xbb, 0x23, 0xf4, 0x64, 0xb1, 0xff, 0x44, 0xfc, 0x7c, 0x35, 0x61, + 0x62, 0x12, 0xe6, 0xcf, 0x3c, 0x93, 0xdd, 0x63, 0xe7, 0x03, 0xb2, 0x55, + 0xc1, 0x15, 0x39, 0xe4, 0xc6, 0xda, 0xbf, 0xe6, 0x01, 0x9c, 0xad, 0x48, + 0xf5, 0x6b, 0x2d, 0xe8, 0x17, 0x89, 0xf3, 0xc8, 0x34, 0xf1, 0xce, 0xca, + 0xbc, 0x15, 0x74, 0x27, 0xa3, 0x8f, 0x46, 0x82, 0x0b, 0x3c, 0xb8, 0x31, + 0xdf, 0x1d, 0xcd, 0x2c, 0x87, 0x0b, 0x1c, 0x14, 0x6d, 0xed, 0xcc, 0x49, + 0x42, 0x16, 0xf4, 0x6c, 0x04, 0x87, 0xd0, 0x87, 0x6b, 0xcf, 0x04, 0xd3, + 0xcd, 0x7b, 0x96, 0x54, 0x16, 0xe6, 0x38, 0xa7, 0x56, 0x9f, 0x68, 0x8e, + 0x3f, 0x39, 0x39, 0xe5, 0x2c, 0x3a, 0x04, 0x12, 0x43, 0xfc, 0x3d, 0x0f, + 0x18, 0x1b, 0x9e, 0x17, 0xdd, 0x40, 0x14, 0xe3, 0x02, 0x37, 0xc1, 0xec, + 0x96, 0x6b, 0xa8, 0x1d, 0x04, 0xd8, 0x57, 0x82, 0x2f, 0x0e, 0x43, 0xa3, + 0xc5, 0xfa, 0xcf, 0x98, 0xe2, 0xb9, 0x8f, 0xf9, 0xd4, 0x1e, 0xba, 0x05, + 0x6d, 0x26, 0xd0, 0x22, 0x9e, 0xb5, 0xf1, 0x30, 0x21, 0x48, 0xfe, 0xfe, + 0x7a, 0x22, 0xc0, 0x76, 0xcf, 0x94, 0x08, 0x28, 0x6f, 0xfd, 0x17, 0xb9, + 0xe6, 0xba, 0xf9, 0x51, 0xb7, 0xd5, 0x1d, 0x40, 0x41, 0xb4, 0x7a, 0x06, + 0xf1, 0x52, 0x56, 0x61, 0xde, 0x02, 0x24, 0x8f, 0x75, 0x6d, 0x61, 0xb7, + 0x85, 0x5a, 0xe1, 0xbe, 0x3a, 0xdd, 0x47, 0x5e, 0xe6, 0x36, 0xdf, 0x03, + 0xc3, 0x7b, 0xe8, 0x6f, 0xa1, 0x1a, 0xab, 0xc2, 0xd3, 0x8a, 0x5e, 0xd1, + 0xd1, 0x9e, 0xa7, 0xcf, 0x1a, 0x7e, 0x5d, 0xab, 0x18, 0x70, 0x1a, 0x73, + 0xe8, 0xd9, 0x39, 0x3b, 0x1a, 0xdd, 0x75, 0x56, 0x4a, 0x4c, 0x9e, 0xcd, + 0xec, 0x36, 0xdf, 0x73, 0xaf, 0xc9, 0xfd, 0x28, 0x17, 0xe8, 0x5a, 0x16, + 0x18, 0xbe, 0x25, 0x54, 0x11, 0x55, 0x50, 0x5b, 0xf9, 0xc9, 0x44, 0xe1, + 0xcc, 0x11, 0x11, 0xa7, 0xc8, 0x71, 0x06, 0x57, 0x0b, 0x4e, 0x22, 0xd5, + 0xf5, 0x3b, 0x26, 0x0e, 0x20, 0xb6, 0x82, 0x9e, 0x80, 0x42, 0x13, 0x86, + 0x84, 0x0e, 0x69, 0x7d, 0xba, 0x44, 0xe4, 0x9c, 0x0e, 0xeb, 0xf9, 0xa1, + 0x5c, 0x65, 0xad, 0xa2, 0x3f, 0x36, 0xc6, 0x92, 0xb9, 0x95, 0x6a, 0x46, + 0x9e, 0x27, 0xcb, 0xdc, 0xd9, 0x1d, 0xb0, 0xd9, 0xb8, 0xb4, 0x96, 0x25, + 0xe8, 0x8d, 0xfc, 0x2c, 0x26, 0x08, 0xa0, 0x42, 0x02, 0x03, 0xe5, 0x02, + 0xd9, 0x43, 0x85, 0xab, 0xda, 0x90, 0x11, 0x43, 0x19, 0x2f, 0x6b, 0xb3, + 0x3f, 0x82, 0xc4, 0x5f, 0xbc, 0x1e, 0x39, 0x58, 0x27, 0xd0, 0x15, 0xf5, + 0x7a, 0xdc, 0xe8, 0x9d, 0x3b, 0x9f, 0xc1, 0x69, 0x06, 0x42, 0xcd, 0xf9, + 0xed, 0x24, 0x0b, 0x7e, 0x14, 0x79, 0xbe, 0x1b, 0xf3, 0x2f, 0x4a, 0x33, + 0xa4, 0xed, 0xd1, 0xc3, 0xb8, 0x24, 0x07, 0x62, 0xe2, 0x11, 0x46, 0xf1, + 0x54, 0x10, 0xcf, 0x80, 0xb5, 0x06, 0xe3, 0xbf, 0x97, 0xff, 0xd4, 0x9a, + 0x64, 0x3e, 0xc8, 0x90, 0x05, 0xf1, 0x15, 0x0e, 0xca, 0x74, 0xf0, 0x16, + 0xba, 0xfe, 0x0a, 0x12, 0x34, 0x2e, 0xb8, 0xab, 0x93, 0x62, 0xe8, 0x1b, + 0xfb, 0xb7, 0x18, 0x9b, 0x79, 0x1d, 0xa8, 0x0f, 0x08, 0x33, 0x38, 0x9d, + 0x33, 0x49, 0x26, 0x57, 0xbb, 0x0e, 0xe6, 0xf3, 0x95, 0x05, 0xb2, 0x61, + 0x66, 0x1d, 0xfc, 0x24, 0xb5, 0xb0, 0xfb, 0xf0, 0x1f, 0x7f, 0xff, 0xcf, + 0x2d, 0x45, 0xf3, 0xdb, 0x9c, 0x65, 0x98, 0xa2, 0x17, 0xa8, 0xd0, 0x16, + 0x9b, 0xb5, 0x7a, 0xc7, 0x16, 0x27, 0xd9, 0x9d, 0x70, 0xf7, 0x26, 0x73, + 0x90, 0x99, 0xd2, 0x24, 0xf0, 0x50, 0x0d, 0x59, 0xc6, 0x07, 0xf3, 0xae, + 0x5d, 0x52, 0xbd, 0xca, 0x24, 0x39, 0x19, 0xcf, 0x81, 0x77, 0xf9, 0x51, + 0xcc, 0x4c, 0x02, 0xe2, 0xb8, 0xd5, 0x54, 0x40, 0xa1, 0x05, 0x21, 0xf6, + 0x9f, 0x2a, 0x8d, 0xd4, 0xc1, 0x74, 0x5f, 0x58, 0x9b, 0x0b, 0xbf, 0xf1, + 0xa1, 0xdf, 0xc0, 0x0b, 0x3e, 0x8a, 0xc2, 0xb4, 0x02, 0x0b, 0x45, 0x5c, + 0x94, 0x0a, 0xe8, 0xa8, 0xec, 0x8f, 0xc8, 0xf1, 0x60, 0x71, 0x60, 0x92, + 0x23, 0xe4, 0x05, 0x3a, 0xd5, 0x67, 0x97, 0x15, 0xa8, 0x9c, 0x30, 0xd1, + 0x4b, 0xc0, 0xcb, 0x9b, 0xf8, 0x5c, 0xe5, 0x3a, 0x22, 0x52, 0x71, 0xba, + 0x16, 0xd3, 0x18, 0xf5, 0x2f, 0x74, 0xc3, 0x9e, 0xfc, 0x02, 0x27, 0x92, + 0x30, 0x9a, 0x4e, 0x48, 0x88, 0x2e, 0x5f, 0x62, 0x11, 0x14, 0x89, 0x63, + 0x41, 0x31, 0x6a, 0x45, 0xec, 0xd5, 0x03, 0xcb, 0x2e, 0x8a, 0xe0, 0x3f, + 0x51, 0x39, 0x86, 0x57, 0x38, 0x27, 0xd6, 0xf8, 0xb5, 0xb2, 0x86, 0xc5, + 0x07, 0x85, 0x75, 0x0d, 0x45, 0x90, 0x53, 0xae, 0x5d, 0x71, 0xab, 0xf4, + 0x91, 0x0f, 0x1e, 0xbd, 0x85, 0x29, 0x7b, 0x70, 0xf9, 0x7a, 0x29, 0x19, + 0xde, 0x40, 0xdb, 0x52, 0x44, 0x93, 0x76, 0x56, 0x57, 0x80, 0x18, 0x3c, + 0xd7, 0xef, 0x25, 0x9d, 0x37, 0x08, 0x5d, 0xb4, 0x64, 0x4a, 0x00, 0x1b, + 0x38, 0x47, 0x39, 0x9e, 0x4d, 0x50, 0x9a, 0x98, 0x34, 0x79, 0xc7, 0xa9, + 0x58, 0xe9, 0xa5, 0x04, 0x9d, 0x97, 0xd6, 0x72, 0x9c, 0x17, 0x3c, 0x08, + 0x24, 0x90, 0x55, 0x8f, 0xa9, 0xad, 0x6e, 0xf3, 0x97, 0x39, 0x8a, 0x69, + 0xde, 0x04, 0x61, 0x19, 0xe5, 0xf5, 0xf1, 0x37, 0xe9, 0x96, 0x6e, 0x52, + 0x5f, 0x27, 0xdc, 0xd5, 0xe5, 0x07, 0x5b, 0x46, 0x81, 0xae, 0xac, 0x2e, + 0x5d, 0x9d, 0x98, 0xeb, 0xe9, 0xd6, 0x73, 0x3d, 0xd7, 0x2c, 0x9f, 0x32, + 0xe3, 0xb3, 0xf3, 0x57, 0x61, 0xa5, 0x16, 0x36, 0x4b, 0xc7, 0x1e, 0x88, + 0xaa, 0x7a, 0x86, 0xc9, 0xd7, 0x42, 0x88, 0x72, 0xc8, 0x09, 0x18, 0x3e, + 0x23, 0xf6, 0xb7, 0x0e, 0x11, 0xd9, 0x18, 0x4c, 0xee, 0x0c, 0xac, 0x95, + 0x28, 0x61, 0x03, 0xda, 0x0a, 0x58, 0x29, 0x86, 0x12, 0xe9, 0x8c, 0xef, + 0xa4, 0xb9, 0x17, 0x73, 0xe5, 0x52, 0x33, 0x84, 0xb4, 0xb7, 0x48, 0x4b, + 0xe6, 0xb0, 0x70, 0x9e, 0x8e, 0x53, 0x24, 0xfd, 0x12, 0x6a, 0x1e, 0xf9, + 0x29, 0x71, 0x1e, 0x19, 0x0f, 0x36, 0x7a, 0xad, 0xb2, 0xeb, 0x14, 0x6f, + 0x4f, 0xab, 0x15, 0x1f, 0x13, 0xc5, 0xbd, 0x90, 0x29, 0xf6, 0x6a, 0x88, + 0x65, 0xac, 0x66, 0x5e, 0xde, 0xe6, 0x74, 0x5c, 0x4a, 0xee, 0x7a, 0xf1, + 0xb6, 0x9b, 0xe6, 0x58, 0xee, 0x34, 0xc6, 0x99, 0x31, 0x45, 0x7c, 0xeb, + 0x73, 0x60, 0x52, 0x1d, 0x12, 0x1e, 0xf1, 0x20, 0xf6, 0x78, 0xb6, 0xbe, + 0xd5, 0xbf, 0xed, 0xf2, 0x7f, 0x99, 0x55, 0x5e, 0x84, 0xf9, 0xd1, 0xea, + 0xe9, 0xa3, 0x7d, 0xaa, 0xda, 0x9d, 0x4f, 0xac, 0x4c, 0xf5, 0xb1, 0x42, + 0xb3, 0xcc, 0x34, 0x5c, 0x32, 0x17, 0x6f, 0x59, 0xc1, 0x1c, 0x97, 0x16, + 0x9f, 0x18, 0x73, 0x4c, 0x39, 0x42, 0x68, 0x35, 0x7f, 0xf8, 0x0e, 0x42, + 0x9e, 0x8b, 0x96, 0xd3, 0x36, 0x27, 0x32, 0x09, 0x6d, 0x9c, 0x26, 0xab, + 0xf8, 0x83, 0xf6, 0xef, 0x86, 0x71, 0x7e, 0x1e, 0xc1, 0x99, 0xd7, 0x59, + 0x60, 0x61, 0x56, 0xca, 0x79, 0xed, 0xce, 0x8e, 0x14, 0xe0, 0x1b, 0xe9, + 0xdb, 0x66, 0xa7, 0xd1, 0xa3, 0x6d, 0xe2, 0x7c, 0x43, 0x17, 0xd5, 0x70, + 0x51, 0x90, 0xb1, 0x1b, 0x58, 0x2b, 0xa2, 0x1a, 0x7d, 0xb2, 0xdb, 0x4e, + 0x6d, 0x77, 0x9f, 0x1d, 0xd5, 0x06, 0x36, 0x9d, 0x1b, 0x5f, 0x74, 0xe0, + 0x6f, 0x5b, 0x83, 0x7e, 0xdd, 0x1d, 0xca, 0x27, 0xbf, 0x9a, 0x3f, 0x41, + 0xcc, 0x0f, 0xc9, 0x2c, 0x0a, 0x33, 0x11, 0xdd, 0xcd, 0x68, 0x13, 0xe5, + 0xb4, 0x37, 0xaa, 0xd9, 0x6d, 0xa2, 0x83, 0xea, 0x1e, 0x04, 0xa6, 0xf2, + 0x6a, 0xf6, 0xfb, 0x93, 0x98, 0x4f, 0x31, 0xd5, 0x72, 0x07, 0x3a, 0x1b, + 0xa1, 0xdb, 0xd0, 0xdb, 0x4a, 0xa7, 0x12, 0x28, 0xc8, 0x44, 0xcc, 0x2f, + 0xf7, 0x30, 0xfc, 0x53, 0x89, 0x1d, 0xd4, 0x8c, 0x7d, 0xa2, 0x32, 0x74, + 0xcf, 0xc4, 0xac, 0x28, 0x03, 0xe7, 0xe1, 0x34, 0x9e, 0x99, 0xdc, 0x85, + 0xea, 0xbf, 0x50, 0x85, 0x5c, 0x33, 0x2a, 0x23, 0x86, 0x84, 0x28, 0x47, + 0x2d, 0x80, 0x62, 0x43, 0xa5, 0x09, 0x38, 0x13, 0x2e, 0x8f, 0x94, 0x0e, + 0xc7, 0x9e, 0xa9, 0x4f, 0x52, 0xea, 0xcc, 0x74, 0x1d, 0xf2, 0x75, 0x87, + 0x65, 0xda, 0xc8, 0xb3, 0xe0, 0x59, 0x7b, 0x0b, 0x91, 0x6f, 0x75, 0xf1, + 0xb1, 0x5a, 0x4e, 0xf9, 0xd5, 0x16, 0x92, 0x9f, 0x20, 0xcf, 0x13, 0xe3, + 0x0d, 0xc2, 0x9f, 0x58, 0x13, 0x7a, 0x29, 0xe4, 0x44, 0x97, 0xc9, 0xf5, + 0xe6, 0x17, 0x99, 0x39, 0xd4, 0xbb, 0xc3, 0x86, 0xbb, 0x05, 0x28, 0x6c, + 0x7f, 0xb6, 0xfc, 0xcd, 0xf2, 0xc2, 0xfd, 0x72, 0xd1, 0xdb, 0xc0, 0x1e, + 0x42, 0x5c, 0x91, 0xe7, 0x77, 0x2d, 0x2a, 0x9a, 0x85, 0xfc, 0x7b, 0x36, + 0x0f, 0x75, 0x28, 0x7b, 0xbd, 0x55, 0xee, 0x7f, 0xae, 0xb2, 0xd5, 0xf9, + 0x2d, 0x84, 0xfa, 0x22, 0xf5, 0x93, 0x39, 0x12, 0x6b, 0x13, 0x87, 0x11, + 0xa8, 0x42, 0x9d, 0x64, 0x65, 0x31, 0xf1, 0xf4, 0x54, 0x81, 0xa7, 0xb2, + 0x54, 0xcf, 0x42, 0xc8, 0x74, 0x9e, 0x97, 0x66, 0x0a, 0x00, 0x42, 0xee, + 0x75, 0xc0, 0xd2, 0xc3, 0xa2, 0xe0, 0x80, 0xf9, 0x09, 0xac, 0x17, 0x5e, + 0x61, 0x35, 0xa0, 0x2f, 0x78, 0xac, 0xb4, 0xb9, 0x81, 0x78, 0x50, 0x0c, + 0x05, 0xc0, 0x2c, 0xf3, 0xa1, 0x10, 0x8b, 0x34, 0x12, 0x6b, 0xd7, 0x66, + 0x98, 0x33, 0x2f, 0xd5, 0xd0, 0x54, 0xa6, 0x88, 0x1e, 0x36, 0xbc, 0xc2, + 0xe4, 0x96, 0xbc, 0x15, 0xd2, 0x74, 0xe6, 0xc8, 0x6e, 0x97, 0x28, 0x35, + 0x94, 0x2f, 0xbc, 0xef, 0x8b, 0xce, 0xa1, 0x7b, 0xd7, 0xd4, 0xc0, 0x49, + 0x5f, 0xf1, 0xd5, 0x82, 0x91, 0x5e, 0x0d, 0xe6, 0xdd, 0x21, 0xa2, 0x90, + 0x1d, 0x9c, 0xa7, 0xaf, 0x47, 0xfa, 0x69, 0x38, 0x9d, 0xf4, 0x38, 0x80, + 0xda, 0xd7, 0xb3, 0xe1, 0x3f, 0xca, 0x09, 0xb0, 0x11, 0x5e, 0xbd, 0x49, + 0x16, 0x63, 0x81, 0xfc, 0x40, 0x0a, 0x68, 0x2d, 0xcb, 0x54, 0x26, 0x39, + 0x24, 0x9a, 0x66, 0xb3, 0xdc, 0x1e, 0x43, 0x25, 0x1c, 0x12, 0xcf, 0x24, + 0x98, 0x85, 0x5d, 0xb2, 0xb0, 0x77, 0xda, 0xec, 0x81, 0xdf, 0x10, 0x28, + 0xfc, 0x66, 0x8c, 0x01, 0xf0, 0x7d, 0xc8, 0xf0, 0xdf, 0x27, 0x1d, 0x02, + 0x11, 0x1b, 0x2d, 0x2e, 0x0c, 0xde, 0xc1, 0x62, 0xfd, 0x38, 0x05, 0xf2, + 0x4f, 0x83, 0xe9, 0x3e, 0xad, 0x25, 0x07, 0xb6, 0xa8, 0xf8, 0x48, 0xc9, + 0x1f, 0x1f, 0xdf, 0x9f, 0x61, 0xfc, 0x2f, 0x79, 0x73, 0xbb, 0xb9, 0x92, + 0xc4, 0x54, 0xfe, 0x8e, 0xcf, 0x08, 0x91, 0x47, 0x64, 0x93, 0xee, 0x74, + 0xc3, 0x36, 0x20, 0x89, 0xb1, 0x20, 0xf3, 0xe1, 0x4a, 0x45, 0x18, 0x62, + 0x1e, 0xbe, 0xe1, 0xc2, 0xdb, 0x3d, 0x30, 0x8e, 0xc5, 0x46, 0xfa, 0x7b, + 0xf0, 0x9c, 0x9a, 0xc7, 0xc8, 0x8d, 0xbc, 0x3f, 0xbf, 0x4f, 0xd1, 0x16, + 0x78, 0x6a, 0x82, 0x75, 0xc4, 0x18, 0xe7, 0x6b, 0x86, 0xe5, 0xaa, 0x74, + 0xa5, 0x15, 0xec, 0xa6, 0x6b, 0xf2, 0xc9, 0x20, 0x0c, 0x67, 0xdc, 0x44, + 0x2a, 0x19, 0x4f, 0xb8, 0x60, 0x14, 0xa7, 0x0a, 0xc4, 0x06, 0xef, 0xcb, + 0xb2, 0x98, 0x1d, 0x45, 0xda, 0x39, 0x83, 0xd3, 0xa0, 0xd8, 0xac, 0xe1, + 0x22, 0xb5, 0x43, 0x3a, 0x2e, 0x86, 0xf4, 0x49, 0x90, 0x38, 0x82, 0x75, + 0x60, 0x48, 0x93, 0xc5, 0xb0, 0x6b, 0x58, 0x0b, 0x9f, 0xb0, 0x31, 0xcc, + 0x38, 0x41, 0x32, 0x60, 0xda, 0x18, 0x01, 0x90, 0x51, 0x8a, 0x9a, 0x60, + 0x54, 0xd4, 0xc1, 0x10, 0x59, 0x70, 0x85, 0x51, 0x53, 0xd8, 0x1e, 0xc8, + 0x94, 0x8c, 0xcd, 0x79, 0x16, 0x2a, 0x39, 0x6f, 0x0f, 0x11, 0x59, 0x74, + 0x8e, 0x2f, 0x7f, 0x08, 0x98, 0x37, 0xf0, 0x4f, 0x55, 0x27, 0xde, 0x56, + 0x61, 0x15, 0xc2, 0x33, 0xf5, 0xec, 0x76, 0x4e, 0x5a, 0x0d, 0xdf, 0x8d, + 0x52, 0xe9, 0x26, 0x9c, 0x88, 0x08, 0xce, 0xe2, 0x75, 0xe4, 0xbf, 0x7a, + 0x56, 0x97, 0x89, 0x28, 0x4a, 0x43, 0x2f, 0xed, 0xce, 0x1c, 0x57, 0x33, + 0xb6, 0xc7, 0x6a, 0x2a, 0x6e, 0xd6, 0x45, 0x4c, 0x9a, 0x58, 0x6e, 0x0c, + 0x32, 0xcb, 0x81, 0xf0, 0x62, 0x4f, 0x4c, 0xbf, 0xf1, 0xe4, 0xa6, 0x6f, + 0x6f, 0x7d, 0xa2, 0xae, 0xba, 0x10, 0xa7, 0x5d, 0xcd, 0x75, 0xde, 0x4c, + 0xb4, 0xb0, 0xea, 0x81, 0x82, 0x3f, 0x05, 0xf6, 0x1a, 0x4e, 0x80, 0xc4, + 0x00, 0xcb, 0x83, 0xef, 0xe8, 0x61, 0x1e, 0xf4, 0xdd, 0xf2, 0x89, 0x35, + 0x60, 0x3a, 0x52, 0xbb, 0x1e, 0xdb, 0x97, 0x00, 0x5e, 0x02, 0xaa, 0x50, + 0xa0, 0xf6, 0x41, 0xe2, 0x90, 0x95, 0xc5, 0x77, 0x1b, 0x3d, 0x8d, 0xdd, + 0x00, 0xea, 0xdd, 0x09, 0xd6, 0x31, 0x4f, 0x7c, 0xfb, 0x9e, 0x0d, 0x82, + 0x75, 0x63, 0x80, 0xec, 0xc4, 0xef, 0x9b, 0xa5, 0x38, 0xb1, 0xe6, 0xa0, + 0x97, 0xe3, 0x23, 0xd5, 0xfc, 0xe6, 0x2f, 0x8c, 0x75, 0x5d, 0xb4, 0x06, + 0x9e, 0x41, 0x91, 0x0c, 0x03, 0x3d, 0xc5, 0xcf, 0x99, 0x92, 0xf4, 0x88, + 0x25, 0x36, 0x2a, 0x85, 0x89, 0x59, 0x0b, 0xcd, 0x88, 0x7c, 0xbc, 0x37, + 0x33, 0xf1, 0x95, 0x55, 0xeb, 0xe0, 0xaf, 0x8e, 0x8d, 0xe4, 0x09, 0x27, + 0xcd, 0xfc, 0x4f, 0x67, 0x72, 0x87, 0x1c, 0xea, 0xcc, 0x62, 0x2e, 0x7b, + 0x5a, 0xf0, 0x7b, 0xd6, 0x80, 0xde, 0x10, 0xda, 0x3b, 0xd1, 0x6b, 0xe3, + 0x9f, 0x58, 0xb7, 0x9d, 0xf2, 0x86, 0xb0, 0x38, 0x20, 0x81, 0x19, 0x9e, + 0x88, 0x25, 0x05, 0x41, 0x0c, 0xb7, 0x08, 0x65, 0xc6, 0xe7, 0xcf, 0xa2, + 0xb0, 0x8e, 0x3d, 0x1d, 0xf9, 0x01, 0x67, 0xed, 0xeb, 0x8d, 0x2b, 0xa9, + 0xa0, 0xb5, 0x97, 0x41, 0x6d, 0x4f, 0x5a, 0x76, 0x8b, 0xd9, 0x33, 0x53, + 0x33, 0x2c, 0xae, 0x7b, 0xb4, 0x60, 0xcf, 0x9c, 0x61, 0xe5, 0x0d, 0xeb, + 0x8f, 0xcc, 0xf0, 0x4c, 0x3c, 0x65, 0x95, 0x4f, 0x87, 0x16, 0x8f, 0x3d, + 0xeb, 0x87, 0x23, 0x83, 0x26, 0x2e, 0x5e, 0x6d, 0x01, 0x10, 0xb2, 0xfd, + 0x67, 0xbd, 0x55, 0x46, 0xef, 0xab, 0x77, 0x32, 0x49, 0x23, 0xa5, 0x7f, + 0xd0, 0x24, 0xb4, 0x90, 0xd4, 0xfb, 0x26, 0xd9, 0xb4, 0x19, 0x6a, 0xab, + 0xbb, 0xfc, 0x59, 0xac, 0x30, 0x01, 0xca, 0xa2, 0x4d, 0xda, 0x01, 0xf2, + 0x1c, 0x70, 0x52, 0x97, 0xe9, 0x9e, 0x8b, 0x6d, 0xcd, 0x84, 0x9b, 0xb4, + 0xbb, 0xa4, 0x2f, 0x75, 0xf1, 0xcb, 0x7d, 0xf8, 0x18, 0xf0, 0x8d, 0x02, + 0x29, 0xc6, 0xc7, 0x34, 0x07, 0xa6, 0x5d, 0x63, 0xf6, 0x1f, 0x66, 0x66, + 0x7f, 0x83, 0xc1, 0x7f, 0xb8, 0xc3, 0xe0, 0xb7, 0x9b, 0xfa, 0x87, 0x6b, + 0x4c, 0xfd, 0x3a, 0x23, 0xff, 0xf0, 0xd5, 0x8c, 0x7c, 0xab, 0x79, 0x7f, + 0xf8, 0x3a, 0xe6, 0x7d, 0x8d, 0x61, 0x7f, 0x98, 0x19, 0xf6, 0x65, 0x93, + 0x3e, 0xcb, 0x90, 0x6f, 0xb1, 0xe6, 0x0f, 0x67, 0xd6, 0x7c, 0xb5, 0x1d, + 0x7f, 0x90, 0xec, 0xf8, 0xa2, 0x05, 0x7f, 0x38, 0xb7, 0xe0, 0xdb, 0x6c, + 0xf7, 0xc3, 0x25, 0xdb, 0x9d, 0xfb, 0x14, 0x9e, 0x00, 0x8d, 0xaa, 0x53, + 0xe1, 0xb5, 0x14, 0xf1, 0x83, 0x9c, 0xc3, 0x10, 0x1a, 0x77, 0xfe, 0x92, + 0xe8, 0xba, 0x4a, 0xa0, 0x1e, 0x1b, 0xfc, 0x08, 0xeb, 0x99, 0x36, 0x07, + 0x87, 0x28, 0x70, 0x79, 0x64, 0x39, 0x19, 0x57, 0x61, 0xe4, 0xc5, 0x8f, + 0x1b, 0x01, 0x05, 0x12, 0x7e, 0x6b, 0xde, 0xed, 0x4c, 0x58, 0xcc, 0xb9, + 0x27, 0x3a, 0x0a, 0xd4, 0x48, 0xf1, 0x2a, 0x59, 0xe7, 0x6d, 0x11, 0xf9, + 0xca, 0x84, 0x91, 0x9a, 0x04, 0xc8, 0xe5, 0x5a, 0x8c, 0x0d, 0xad, 0x99, + 0x4f, 0x2b, 0x19, 0x42, 0xa3, 0xa6, 0x08, 0x97, 0x6f, 0x66, 0xfa, 0x95, + 0x76, 0x14, 0x57, 0x7a, 0xde, 0xc8, 0x8b, 0x4e, 0xa1, 0x69, 0x67, 0x5d, + 0x0d, 0xa5, 0x4b, 0xdf, 0xcd, 0x69, 0xdf, 0x0d, 0x26, 0xc9, 0x21, 0x06, + 0x0c, 0xa6, 0x13, 0xe6, 0xf2, 0xca, 0x12, 0x31, 0x57, 0x23, 0xc5, 0x6a, + 0xd1, 0x57, 0x64, 0x56, 0x94, 0x73, 0x31, 0x28, 0x23, 0x91, 0x5c, 0x4b, + 0x89, 0xc3, 0x7c, 0x7e, 0x5f, 0xea, 0x9a, 0x5c, 0xae, 0x1a, 0xb1, 0x4c, + 0x67, 0xab, 0xdc, 0xc6, 0xd4, 0xdf, 0x43, 0x04, 0x71, 0x00, 0x31, 0xb9, + 0x22, 0xff, 0xbe, 0x32, 0xe5, 0xee, 0xea, 0x02, 0xcc, 0x03, 0x51, 0xa8, + 0xe6, 0x68, 0x39, 0xae, 0x21, 0x84, 0xa2, 0xe7, 0x0d, 0xf9, 0xc3, 0x3c, + 0xd3, 0xc6, 0x20, 0xdd, 0x4a, 0xb0, 0x5b, 0xfc, 0x8c, 0x26, 0xb5, 0x6a, + 0x45, 0x52, 0x2c, 0x13, 0xe6, 0x4c, 0x36, 0x47, 0xfd, 0xf9, 0xbb, 0xa5, + 0xea, 0xd1, 0x1b, 0x4a, 0x7d, 0xdd, 0x34, 0x3b, 0xb8, 0xc6, 0x4f, 0xfc, + 0x78, 0xd1, 0x1a, 0x2b, 0x24, 0xcb, 0xfe, 0x69, 0x77, 0xb0, 0x7d, 0xb7, + 0xb9, 0xf6, 0xf3, 0xbe, 0x99, 0xfc, 0xc6, 0x70, 0x76, 0x3f, 0xfd, 0x59, + 0x89, 0x64, 0xa6, 0x56, 0xf7, 0x5c, 0x83, 0x87, 0x72, 0xc0, 0x66, 0xde, + 0x6e, 0x38, 0x48, 0x1a, 0x0c, 0x5c, 0xcf, 0x35, 0x80, 0x70, 0x45, 0x13, + 0x85, 0xf0, 0x04, 0xc6, 0xa1, 0xff, 0x26, 0x94, 0x4c, 0xb9, 0x5e, 0x2b, + 0x55, 0x48, 0x9e, 0x83, 0x6a, 0x52, 0xd5, 0x84, 0xc6, 0x50, 0x26, 0x99, + 0x5e, 0xc0, 0x1e, 0xa0, 0x27, 0xeb, 0x29, 0xd9, 0xdd, 0x03, 0x0f, 0x99, + 0x4e, 0xd3, 0xa3, 0xee, 0x18, 0xe7, 0xf9, 0xb7, 0x1a, 0x98, 0x13, 0x8b, + 0xb0, 0x94, 0x58, 0xd6, 0x02, 0xd1, 0xd7, 0xa2, 0x7b, 0x54, 0xd5, 0xc9, + 0x85, 0x2e, 0xb2, 0x24, 0xc4, 0xab, 0x97, 0x62, 0xce, 0xbe, 0x6f, 0xe8, + 0x89, 0x52, 0x41, 0x1f, 0xad, 0xd0, 0x2b, 0xb2, 0x15, 0x30, 0xdf, 0x0e, + 0x2e, 0x5f, 0x1d, 0x84, 0xba, 0xee, 0x08, 0x41, 0x0c, 0x21, 0xc5, 0xe7, + 0xe6, 0xb9, 0x15, 0x68, 0xca, 0x25, 0x55, 0x95, 0xa7, 0x96, 0x6d, 0x5f, + 0xcc, 0x03, 0xf2, 0xcc, 0xaa, 0xd3, 0xaa, 0xcc, 0xa9, 0x41, 0xa9, 0x97, + 0x00, 0xfd, 0xc7, 0x0a, 0x98, 0x99, 0xf3, 0x4a, 0xf0, 0xcf, 0xc2, 0x8d, + 0xe1, 0xbc, 0x74, 0x75, 0x2e, 0xce, 0x50, 0x3f, 0xfc, 0x3b, 0x45, 0xdb, + 0xfc, 0xb3, 0xb4, 0x56, 0x31, 0xb9, 0xc1, 0xc0, 0x6c, 0x51, 0x8a, 0xe7, + 0xb0, 0x5c, 0xa6, 0xe6, 0x36, 0x98, 0x7a, 0xf5, 0xc4, 0x24, 0x51, 0x4c, + 0x0a, 0x2b, 0x1c, 0x4c, 0x8a, 0x40, 0xf3, 0x0d, 0x4e, 0xc9, 0xad, 0xcc, + 0x54, 0x24, 0x7f, 0xd8, 0xb6, 0xb6, 0xf0, 0x32, 0x76, 0x87, 0x72, 0xb3, + 0x85, 0x99, 0xa6, 0x36, 0x61, 0xb7, 0x34, 0x61, 0xba, 0x49, 0xe6, 0x84, + 0x19, 0x31, 0x54, 0xf0, 0x51, 0xb9, 0xda, 0x2e, 0x9c, 0x92, 0x45, 0x93, + 0x59, 0x57, 0xcc, 0xc9, 0x5b, 0xba, 0x34, 0x52, 0x32, 0x89, 0x6d, 0x04, + 0x75, 0xf9, 0xf9, 0xe7, 0xdd, 0xc1, 0x6f, 0xd7, 0x61, 0xbf, 0xcf, 0x46, + 0x9e, 0xcd, 0xc2, 0xda, 0x1c, 0xcf, 0x86, 0x59, 0xe6, 0x3a, 0x84, 0xea, + 0x60, 0x6e, 0x6d, 0x4f, 0xb0, 0xd9, 0xb2, 0x64, 0x68, 0x43, 0x52, 0x59, + 0xd2, 0xc4, 0xfe, 0x94, 0x01, 0x6b, 0xc5, 0xde, 0xf2, 0x69, 0x53, 0xfc, + 0x94, 0xf0, 0x2d, 0x45, 0xed, 0x2c, 0x02, 0xf6, 0xc6, 0xaa, 0x9b, 0x95, + 0xb9, 0xe2, 0x9b, 0xcb, 0xcc, 0x2e, 0xbc, 0x38, 0xec, 0x8d, 0x5a, 0xfd, + 0x78, 0xa4, 0xb5, 0xb4, 0x7c, 0x85, 0xc4, 0x8b, 0x73, 0x2b, 0xbf, 0x84, + 0x7a, 0x70, 0x28, 0x0e, 0x47, 0x72, 0xca, 0x7c, 0x9a, 0xde, 0x00, 0x91, + 0xa0, 0xf1, 0x06, 0xbe, 0x56, 0xf4, 0xbb, 0xe5, 0x6a, 0x22, 0xfe, 0xde, + 0x35, 0x4d, 0x53, 0x2b, 0xea, 0x6a, 0x12, 0x8e, 0xd4, 0x18, 0x2b, 0xc1, + 0xf7, 0xe7, 0x95, 0xba, 0xf2, 0xde, 0x68, 0x45, 0xb5, 0x33, 0x34, 0x8f, + 0x7a, 0xee, 0xdf, 0x56, 0x1b, 0x00, 0x9d, 0x4d, 0x63, 0x85, 0x03, 0x37, + 0x27, 0xbc, 0xf2, 0xc6, 0x12, 0xf3, 0x63, 0x78, 0x5a, 0xa9, 0x72, 0x0a, + 0x2f, 0x54, 0x6e, 0x40, 0x44, 0x9c, 0xb6, 0x26, 0x33, 0x31, 0x9b, 0xab, + 0xbb, 0x1b, 0xb1, 0xd7, 0xba, 0x01, 0x93, 0xf4, 0xe0, 0xed, 0xd5, 0xe5, + 0x9b, 0x76, 0x5f, 0x4e, 0xe7, 0x23, 0x22, 0x58, 0x80, 0xbc, 0x5a, 0xfc, + 0x5d, 0xd8, 0xc2, 0xdd, 0x13, 0xb3, 0xbd, 0x4f, 0x1a, 0x90, 0x04, 0x1d, + 0xf0, 0x42, 0x21, 0x21, 0xb1, 0xf0, 0x41, 0xce, 0xfc, 0x9c, 0xff, 0x7e, + 0xa6, 0x23, 0xb4, 0xf6, 0xf8, 0x35, 0x6f, 0xe9, 0xac, 0x15, 0xa5, 0x23, + 0xc7, 0xa8, 0x94, 0x3e, 0x09, 0xaf, 0x12, 0xc5, 0xfa, 0xcf, 0xbe, 0xeb, + 0xbb, 0xc5, 0x2d, 0x18, 0x10, 0xed, 0xfa, 0x1d, 0x4c, 0xc0, 0x49, 0x66, + 0x4d, 0x20, 0xc4, 0x81, 0xdf, 0xb5, 0x25, 0x0d, 0x7e, 0x9b, 0x23, 0x23, + 0x55, 0x16, 0x1c, 0x44, 0x95, 0x75, 0xa4, 0x22, 0xd9, 0x75, 0x43, 0x9d, + 0xd1, 0xfb, 0x9a, 0x36, 0xae, 0xaa, 0xce, 0x95, 0xec, 0x75, 0xed, 0xc1, + 0xb2, 0x15, 0x2e, 0x57, 0xad, 0x3e, 0x6a, 0x36, 0xd3, 0x8b, 0xe1, 0xc0, + 0xe7, 0xa8, 0xae, 0xff, 0x49, 0x96, 0xf7, 0xb1, 0xba, 0x01, 0xcf, 0x1b, + 0x82, 0x03, 0xd5, 0xbc, 0xbc, 0x1c, 0xaa, 0x23, 0x4e, 0x16, 0x65, 0x3d, + 0x5a, 0x53, 0x22, 0x31, 0x91, 0xb5, 0x8b, 0x8d, 0x9f, 0x57, 0xf5, 0xa5, + 0xab, 0x64, 0xb1, 0xe4, 0xd3, 0x31, 0xd0, 0x02, 0x69, 0xb2, 0x2a, 0xab, + 0x4e, 0x2c, 0x7e, 0x7a, 0x85, 0x72, 0x40, 0x34, 0xb4, 0xd7, 0xf9, 0x83, + 0xc3, 0xd7, 0x3c, 0x09, 0x3d, 0xdc, 0x3d, 0x30, 0xfe, 0x07, 0xeb, 0xae, + 0x26, 0xcc, 0x99, 0xda, 0xf8, 0xd9, 0x49, 0x85, 0x7f, 0x7f, 0x1c, 0x11, + 0xb0, 0xd7, 0x79, 0x22, 0x7c, 0x49, 0x59, 0x97, 0xa5, 0x0b, 0x1c, 0x16, + 0x11, 0x95, 0x8f, 0x17, 0xc6, 0xc4, 0x92, 0x94, 0x73, 0x5f, 0x2e, 0xf8, + 0x1e, 0x83, 0xfd, 0xe5, 0xb0, 0x80, 0x4e, 0x5c, 0x3b, 0x27, 0x48, 0x56, + 0x05, 0x57, 0xe7, 0x1c, 0x5d, 0x5a, 0x54, 0xf3, 0x2c, 0x5b, 0x8e, 0x20, + 0x55, 0xa6, 0xee, 0x91, 0xe5, 0xff, 0xcc, 0x3c, 0x3e, 0xf6, 0x1c, 0x4a, + 0x92, 0x09, 0xe9, 0xb2, 0xd5, 0xb3, 0x93, 0x44, 0x43, 0xf3, 0x0c, 0x8f, + 0xbd, 0xa9, 0xab, 0x50, 0x68, 0xae, 0x77, 0x35, 0xc0, 0xda, 0x6e, 0x4c, + 0xb7, 0xe8, 0x2a, 0x4c, 0x87, 0x83, 0x4b, 0xb2, 0x4a, 0x15, 0xac, 0x66, + 0x30, 0x48, 0xfb, 0x4f, 0x8d, 0x26, 0x81, 0x4e, 0xed, 0xf0, 0x8f, 0x1f, + 0xcf, 0xe4, 0x28, 0x44, 0x8b, 0xdb, 0x94, 0x58, 0x46, 0x2d, 0xef, 0x69, + 0x40, 0x1f, 0x9f, 0xb8, 0xb4, 0x58, 0x2a, 0x34, 0x3c, 0x4b, 0x33, 0xc6, + 0xd6, 0x99, 0x0f, 0xa4, 0x7c, 0xc5, 0xd9, 0x84, 0xd3, 0x4b, 0x76, 0x07, + 0xea, 0x95, 0xd7, 0x3b, 0x44, 0xb7, 0x2c, 0xba, 0xf4, 0x3e, 0x56, 0x97, + 0xef, 0xe5, 0xa4, 0x64, 0x0d, 0x5f, 0xdc, 0x00, 0xad, 0x76, 0x7c, 0x4e, + 0x31, 0x0c, 0x2d, 0xec, 0xf6, 0x83, 0xcd, 0x16, 0x71, 0x99, 0x94, 0x77, + 0x02, 0xdd, 0x6b, 0x3c, 0xb8, 0x44, 0x63, 0xf4, 0x80, 0x67, 0x67, 0x44, + 0x5e, 0x17, 0x62, 0xd0, 0xaa, 0x25, 0x42, 0xd6, 0xac, 0x51, 0xc5, 0x25, + 0x95, 0x2e, 0x61, 0xc3, 0xc9, 0x66, 0x1e, 0x25, 0x38, 0xb6, 0x22, 0x0c, + 0xf1, 0x3e, 0x85, 0xe3, 0xbe, 0x9c, 0x68, 0x01, 0xd4, 0xa1, 0x5b, 0xfa, + 0x33, 0xd2, 0xd9, 0xed, 0x5c, 0x5f, 0x63, 0x34, 0xc5, 0x73, 0x74, 0x8e, + 0x8a, 0xf2, 0xa0, 0x48, 0xca, 0x39, 0xa7, 0xf2, 0x6e, 0xe2, 0x8f, 0x7c, + 0x2a, 0x87, 0xe9, 0x70, 0xb0, 0xf6, 0x06, 0xae, 0x7d, 0xc9, 0x39, 0x5f, + 0xb7, 0x5b, 0x97, 0xfa, 0x8b, 0x38, 0x84, 0xd5, 0x16, 0xf2, 0x83, 0x24, + 0x09, 0x5f, 0xcf, 0x56, 0x65, 0x7a, 0xbc, 0x9a, 0xee, 0xbf, 0x53, 0x25, + 0x13, 0x9a, 0x00, 0x69, 0x76, 0x44, 0x0c, 0x13, 0xdd, 0x15, 0x21, 0x91, + 0xc1, 0xd6, 0x3e, 0x71, 0xfe, 0xa2, 0xac, 0xb5, 0xf8, 0xc7, 0x00, 0x8e, + 0x02, 0x32, 0x82, 0x07, 0xbd, 0x7c, 0xce, 0x0b, 0x91, 0x2f, 0x51, 0x58, + 0xdc, 0x84, 0xcf, 0x4c, 0x72, 0x85, 0x98, 0xe7, 0x0c, 0x08, 0xa0, 0x50, + 0x0f, 0x7c, 0xe5, 0xb1, 0xed, 0xf0, 0x37, 0x10, 0xb8, 0xe1, 0x13, 0xff, + 0x2d, 0x9d, 0x45, 0x43, 0xea, 0x0b, 0xec, 0xc9, 0x5b, 0xe7, 0x6b, 0x08, + 0xb4, 0x0c, 0xb5, 0xdd, 0x4d, 0x51, 0x76, 0x85, 0x6f, 0x6f, 0x1b, 0xf4, + 0xf8, 0x45, 0x67, 0xc9, 0x23, 0xdf, 0x03, 0x53, 0xf0, 0x60, 0xc3, 0x4d, + 0x6e, 0x7d, 0x75, 0x0e, 0x28, 0x29, 0xb2, 0x04, 0x21, 0x89, 0x2e, 0x04, + 0x94, 0x0c, 0x30, 0x32, 0x7e, 0xb9, 0x5c, 0xd0, 0x1d, 0x73, 0xe1, 0x6a, + 0x3f, 0x50, 0x30, 0xe4, 0x7c, 0x65, 0x51, 0x68, 0xf8, 0x68, 0x06, 0x6b, + 0x17, 0x87, 0xb9, 0x2a, 0xb6, 0x09, 0x65, 0x2b, 0xab, 0xec, 0x40, 0x00, + 0x3e, 0xeb, 0xfb, 0x2a, 0x93, 0xac, 0xac, 0x64, 0x7a, 0xa0, 0x02, 0xa7, + 0x38, 0x4d, 0x6e, 0xa8, 0xfe, 0xf7, 0x10, 0xd1, 0x4e, 0x7d, 0x3d, 0x69, + 0x3e, 0x0a, 0x02, 0xe2, 0xf5, 0x16, 0x37, 0x59, 0x7b, 0xaf, 0x92, 0x5e, + 0x6f, 0x2a, 0x7c, 0x14, 0x17, 0x17, 0x4b, 0x75, 0x10, 0x8e, 0xcb, 0x49, + 0x70, 0xf5, 0x02, 0xb2, 0x05, 0x20, 0x5d, 0x68, 0xbc, 0x70, 0x32, 0xbb, + 0xb1, 0xac, 0x0b, 0x92, 0x10, 0x7c, 0x48, 0xe2, 0xa1, 0x58, 0xd9, 0xa2, + 0xaf, 0x27, 0x7e, 0xb9, 0x00, 0xfe, 0x1e, 0x29, 0xad, 0xcf, 0xce, 0x35, + 0x51, 0xfb, 0x9e, 0x21, 0x2e, 0x72, 0x31, 0x91, 0x47, 0xfe, 0x10, 0xfa, + 0xed, 0x89, 0x90, 0x55, 0xdd, 0xdd, 0xa7, 0x46, 0x45, 0x4f, 0xca, 0xaf, + 0x30, 0xce, 0x97, 0xd4, 0x75, 0x97, 0x4c, 0x51, 0xe0, 0x8d, 0xc9, 0xf6, + 0x3c, 0x03, 0x44, 0x1f, 0x23, 0x66, 0x71, 0xdf, 0x99, 0xa9, 0x2a, 0xcc, + 0x99, 0xb7, 0x17, 0x63, 0xaa, 0x94, 0x62, 0x46, 0x66, 0x14, 0x43, 0xa7, + 0xc1, 0x92, 0xa8, 0x17, 0x17, 0x7f, 0x89, 0xe1, 0xcd, 0x94, 0xbe, 0x45, + 0xe5, 0x26, 0xf7, 0xc0, 0xc8, 0x1d, 0xca, 0xb2, 0x76, 0xcb, 0xf6, 0x7d, + 0x69, 0x43, 0xe3, 0x46, 0xde, 0x1f, 0x10, 0x40, 0xd1, 0xb9, 0x53, 0x8f, + 0x8a, 0xf3, 0x76, 0x16, 0x9a, 0x57, 0x56, 0xdb, 0x4e, 0x6a, 0x50, 0x5b, + 0x4e, 0x0b, 0x76, 0x98, 0x4b, 0x18, 0xea, 0x71, 0x60, 0x3f, 0x4c, 0x98, + 0x32, 0xd5, 0xd4, 0x45, 0x7e, 0x0b, 0xbc, 0xa7, 0xaf, 0x67, 0x1e, 0x3f, + 0x43, 0xd0, 0xba, 0xbf, 0x6f, 0x27, 0x7a, 0xbf, 0x8a, 0x55, 0x3f, 0xfd, + 0xa2, 0x88, 0x28, 0x54, 0xd1, 0x90, 0x36, 0x25, 0x63, 0xad, 0x5f, 0x2c, + 0x1f, 0xeb, 0xd3, 0x65, 0x0b, 0x29, 0x27, 0xb0, 0x05, 0x18, 0xdc, 0xa2, + 0xe2, 0x92, 0x9a, 0x8e, 0xd9, 0x02, 0x69, 0x39, 0xae, 0xa8, 0x99, 0x24, + 0x29, 0xb5, 0xa6, 0xaa, 0x99, 0xac, 0xbd, 0x8d, 0x2c, 0x6c, 0xb2, 0x7c, + 0xa1, 0x7e, 0x53, 0x63, 0xfd, 0xa6, 0xc6, 0x1e, 0xd0, 0xb4, 0x7e, 0x01, + 0xb9, 0x72, 0x77, 0x9b, 0x69, 0x79, 0xf9, 0xf0, 0x86, 0x33, 0xeb, 0x92, + 0xa3, 0x76, 0xc6, 0x0a, 0xac, 0x5e, 0xaa, 0x00, 0xd1, 0x5b, 0x30, 0xf8, + 0x3d, 0x59, 0xf1, 0xbf, 0xbf, 0x8c, 0x08, 0x7a, 0xb2, 0x26, 0x20, 0x30, + 0x0d, 0xf1, 0x8f, 0xf9, 0x68, 0x1d, 0xd5, 0xb1, 0xd7, 0x6a, 0x73, 0x91, + 0x80, 0xa9, 0xdc, 0xe3, 0xed, 0x36, 0xf1, 0x72, 0x6e, 0xdf, 0x20, 0xf3, + 0x8a, 0xa5, 0x63, 0x5e, 0x07, 0x64, 0xc0, 0x5c, 0x89, 0xef, 0x57, 0x99, + 0x9e, 0xca, 0xcd, 0xb6, 0x7b, 0x69, 0x95, 0x74, 0x31, 0x42, 0xbc, 0x45, + 0x25, 0xfd, 0xd9, 0x22, 0xc4, 0x5f, 0x4b, 0x25, 0xbd, 0x4c, 0xaa, 0x4d, + 0x2a, 0xe9, 0xf3, 0xbb, 0x6f, 0x9d, 0xff, 0x30, 0xa0, 0x6f, 0x47, 0xf7, + 0xe4, 0x27, 0x51, 0xea, 0x91, 0x34, 0x8d, 0x29, 0xc5, 0xbb, 0x91, 0x5f, + 0x56, 0x8b, 0xaf, 0x72, 0x7c, 0xf7, 0x13, 0x85, 0x3f, 0x00, 0x45, 0x51, + 0x8c, 0x0e, 0x03, 0xae, 0xf4, 0xcf, 0x88, 0xab, 0x60, 0xea, 0x0c, 0xc3, + 0x2c, 0x6f, 0x7b, 0x2c, 0xbe, 0xac, 0xe4, 0xdb, 0xd7, 0x11, 0x52, 0x52, + 0x8f, 0x96, 0x7d, 0x41, 0x81, 0x23, 0x8b, 0xf0, 0xb8, 0x5c, 0x6b, 0x50, + 0x3a, 0xdb, 0xaa, 0x50, 0xc4, 0xe9, 0xef, 0xa9, 0xa2, 0xee, 0x3c, 0x15, + 0xfa, 0x2d, 0x20, 0x5b, 0x0d, 0xeb, 0x6f, 0x40, 0x32, 0xe9, 0x9e, 0x83, + 0x50, 0x47, 0x14, 0x33, 0x34, 0x13, 0x3c, 0x16, 0xb5, 0x31, 0x21, 0x8e, + 0xee, 0xc5, 0x66, 0x16, 0x8d, 0xf4, 0xf3, 0x06, 0xde, 0xd7, 0x7e, 0xfa, + 0x9b, 0xc6, 0x1e, 0xbd, 0x1d, 0x09, 0x35, 0x77, 0x7d, 0xd7, 0x16, 0x6b, + 0x4b, 0x74, 0x6e, 0xf3, 0x63, 0x22, 0x01, 0x99, 0xd4, 0x4c, 0x69, 0x14, + 0xf7, 0xa6, 0x6e, 0x45, 0xaf, 0xaf, 0xab, 0x7e, 0xed, 0x63, 0x5b, 0xc8, + 0x6d, 0x56, 0xf5, 0x1b, 0xc8, 0x7d, 0xc9, 0x20, 0x0b, 0xf1, 0xb6, 0x2d, + 0xde, 0x2a, 0x8c, 0xf8, 0x0b, 0x38, 0x93, 0x2f, 0x39, 0x48, 0xf7, 0xce, + 0xfd, 0x9f, 0x45, 0xe6, 0xe5, 0xac, 0x84, 0x23, 0xe6, 0x8d, 0xf8, 0xb9, + 0xe3, 0xa5, 0x85, 0x31, 0x72, 0xdf, 0xf7, 0xbf, 0xc3, 0x69, 0xf8, 0x6a, + 0xd3, 0xbd, 0x0c, 0xd3, 0x2b, 0x56, 0x25, 0xde, 0x77, 0xf7, 0x57, 0x99, + 0xc6, 0x32, 0x2d, 0x67, 0x88, 0x77, 0x1e, 0x89, 0x22, 0xa2, 0xef, 0x12, + 0x44, 0xb2, 0x6b, 0xee, 0x3b, 0x74, 0x2b, 0x72, 0x8d, 0xbe, 0x4f, 0x46, + 0xc1, 0xb5, 0xca, 0x4d, 0x5b, 0x12, 0xcb, 0xb6, 0xc4, 0xa4, 0x01, 0xbc, + 0xe2, 0xe8, 0xe3, 0xa1, 0x7e, 0x36, 0xcb, 0x13, 0x23, 0x15, 0xb8, 0xc7, + 0x02, 0xb5, 0xe6, 0xe7, 0x29, 0x0f, 0xb7, 0xce, 0x6c, 0x7b, 0xf8, 0xed, + 0x27, 0x24, 0xe9, 0x94, 0xb1, 0xe9, 0x84, 0x74, 0xd7, 0xf1, 0xe4, 0xe5, + 0x4e, 0x48, 0x34, 0x66, 0x15, 0x95, 0xa3, 0x0e, 0xea, 0x22, 0xa6, 0x33, + 0x7e, 0x57, 0x98, 0x7c, 0xaf, 0x7b, 0x74, 0x2a, 0x3d, 0x7a, 0x3b, 0x47, + 0xa7, 0x9f, 0x65, 0x62, 0x50, 0x1b, 0xd3, 0x15, 0x40, 0xf3, 0x79, 0x00, + 0x9e, 0xea, 0x76, 0x81, 0x10, 0x61, 0xa0, 0xe2, 0xae, 0x72, 0x4c, 0xa9, + 0xfc, 0x7d, 0x32, 0xdc, 0x3c, 0x08, 0xbb, 0x2c, 0x42, 0xfd, 0x81, 0xa3, + 0x2e, 0x10, 0xfc, 0xab, 0xcc, 0xa3, 0x86, 0x53, 0xe1, 0x98, 0xbc, 0x14, + 0xe5, 0x8f, 0xee, 0x4d, 0x88, 0x91, 0xbd, 0xde, 0xe6, 0x04, 0x94, 0xa1, + 0x0e, 0x25, 0xe0, 0x07, 0x13, 0x57, 0x46, 0x53, 0xa6, 0xd3, 0xbd, 0x02, + 0x4d, 0xfa, 0xbe, 0xce, 0x25, 0x3f, 0xcb, 0x74, 0x34, 0xf6, 0x76, 0xbb, + 0x21, 0x79, 0x0b, 0x40, 0x46, 0x38, 0x28, 0xe3, 0x9b, 0x2e, 0xfe, 0xea, + 0x6c, 0xe7, 0x9c, 0xd6, 0x1c, 0xe5, 0xd9, 0x93, 0x4c, 0xc5, 0xda, 0x9a, + 0x6f, 0xbe, 0x59, 0xc9, 0xd4, 0x4a, 0xfe, 0x11, 0x80, 0x9b, 0x37, 0x9e, + 0x58, 0xae, 0x03, 0x5c, 0xdb, 0xf7, 0x17, 0x13, 0xff, 0x59, 0x64, 0x63, + 0x41, 0xc8, 0x64, 0x3e, 0xf4, 0x5f, 0x26, 0xc5, 0x9f, 0x1b, 0x23, 0x75, + 0x4b, 0x72, 0x4f, 0x96, 0xfe, 0x06, 0xd3, 0x21, 0xe2, 0x33, 0xe4, 0x51, + 0x05, 0x04, 0x4b, 0x24, 0xb6, 0x80, 0x15, 0x7e, 0xea, 0x4d, 0xd9, 0x2e, + 0x08, 0xf6, 0x79, 0xc4, 0xae, 0xcd, 0x38, 0x78, 0xc5, 0x62, 0xca, 0x4d, + 0xca, 0xc3, 0x66, 0x05, 0x48, 0x6d, 0xe4, 0xea, 0xb4, 0xc5, 0x7b, 0x9b, + 0x15, 0x05, 0x29, 0x23, 0xd7, 0x85, 0x3e, 0x87, 0x7c, 0xcc, 0x2d, 0xf7, + 0xec, 0x62, 0xc5, 0x95, 0x6e, 0xd7, 0x33, 0xed, 0x79, 0xfa, 0x1c, 0xae, + 0x17, 0x82, 0x99, 0x55, 0x5f, 0x0a, 0x65, 0x9f, 0x12, 0xd1, 0xa8, 0x7b, + 0x12, 0xc8, 0x07, 0xa5, 0xd0, 0x5e, 0x99, 0x0c, 0x08, 0xc3, 0x17, 0x14, + 0x64, 0x24, 0x2e, 0xa8, 0x65, 0x58, 0xcf, 0x54, 0x7d, 0x96, 0xf7, 0xb5, + 0x14, 0x88, 0xc4, 0x0f, 0x10, 0xd1, 0xbe, 0x42, 0x99, 0x1c, 0x22, 0xf5, + 0xee, 0x20, 0xaa, 0xad, 0xa0, 0xdc, 0xf8, 0x91, 0x51, 0xaf, 0xc8, 0x3b, + 0xe7, 0x58, 0x0e, 0x93, 0x40, 0x87, 0x01, 0x68, 0x6b, 0x86, 0x64, 0x89, + 0x99, 0xda, 0x97, 0xcd, 0xd5, 0x0f, 0x39, 0xed, 0xd5, 0xb5, 0x41, 0x14, + 0x50, 0xa6, 0x5e, 0x28, 0x3d, 0xf0, 0xe6, 0x08, 0xfc, 0xda, 0x40, 0xae, + 0x82, 0x55, 0x90, 0x78, 0xfc, 0x61, 0x66, 0xe8, 0x29, 0x82, 0x5a, 0xdc, + 0x96, 0xcd, 0x37, 0xc4, 0xd5, 0xf4, 0x1e, 0x98, 0x2e, 0x87, 0xbe, 0xb7, + 0x37, 0x68, 0x5a, 0x96, 0x23, 0xf9, 0x79, 0xcd, 0xb3, 0x00, 0x61, 0x6e, + 0xe5, 0xdb, 0xfe, 0x94, 0x86, 0xde, 0x40, 0xf1, 0xb0, 0x2a, 0x6f, 0xe9, + 0xeb, 0x04, 0xbd, 0xb4, 0xac, 0xf8, 0xa3, 0xf1, 0x65, 0xfc, 0x21, 0xe3, + 0x7b, 0x22, 0x5a, 0x4d, 0x38, 0xc3, 0x90, 0x22, 0x75, 0x60, 0x05, 0x5f, + 0xe9, 0x09, 0xce, 0x99, 0xc4, 0xab, 0x86, 0xc6, 0x77, 0x59, 0x2e, 0x29, + 0xff, 0x02, 0x17, 0xf2, 0x7f, 0xba, 0xfa, 0xdf, 0x4e, 0x6b, 0x75, 0x12, + 0x51, 0xd5, 0x3a, 0xec, 0x28, 0x4b, 0x41, 0x95, 0x47, 0x00, 0xce, 0x05, + 0xa3, 0x69, 0x62, 0xda, 0x03, 0xd4, 0x21, 0x41, 0xba, 0x69, 0x3f, 0xef, + 0xf9, 0xfb, 0x5a, 0xb7, 0x44, 0x86, 0x0c, 0xc0, 0xc9, 0x26, 0x9d, 0xa0, + 0x7c, 0xde, 0x96, 0x3f, 0x20, 0xa5, 0x96, 0xe0, 0xba, 0x10, 0xe0, 0xf6, + 0xc8, 0xcc, 0xa3, 0x38, 0xfa, 0x22, 0x63, 0x94, 0x33, 0x9d, 0x59, 0x64, + 0x26, 0xe0, 0x5e, 0xfd, 0x96, 0x64, 0xfb, 0x37, 0x24, 0x1b, 0xf3, 0xc2, + 0xcb, 0xc9, 0xbf, 0x14, 0x4f, 0xe2, 0x5b, 0xa4, 0x56, 0x9f, 0xe5, 0x1a, + 0xed, 0x80, 0x6f, 0xc8, 0x33, 0x62, 0x60, 0x11, 0x35, 0xe9, 0xe7, 0x8d, + 0x8a, 0xdc, 0x71, 0x96, 0x94, 0xa5, 0x1d, 0x95, 0x32, 0x42, 0x04, 0xd5, + 0xeb, 0x15, 0x00, 0xd6, 0x5c, 0xac, 0x00, 0xd8, 0x11, 0x15, 0x98, 0x9a, + 0x99, 0x4b, 0x32, 0xe9, 0xcd, 0x79, 0xc0, 0x55, 0xa7, 0x30, 0x12, 0x6a, + 0xb0, 0x16, 0x59, 0x79, 0xf5, 0x6e, 0x89, 0x3a, 0xed, 0x19, 0x0a, 0x18, + 0x76, 0x49, 0x7d, 0x62, 0x7a, 0xc6, 0x27, 0xc2, 0x6c, 0x38, 0xc4, 0xb4, + 0xdd, 0x5a, 0x2e, 0xe2, 0x39, 0xb9, 0xb2, 0x00, 0x79, 0xa7, 0x17, 0xc5, + 0xc4, 0x4a, 0xde, 0xaf, 0x32, 0xbd, 0xbd, 0xb3, 0xed, 0x46, 0x66, 0x2d, + 0xa8, 0x98, 0xcd, 0x1b, 0xc2, 0x4b, 0x8c, 0x63, 0xe1, 0x43, 0x32, 0x31, + 0x1f, 0x59, 0xc2, 0x93, 0x78, 0xf2, 0x4d, 0x33, 0xa7, 0x37, 0xe8, 0x5f, + 0xa8, 0xc4, 0xd8, 0xd3, 0xdf, 0xc1, 0x87, 0xce, 0x4d, 0x52, 0xc5, 0x00, + 0xd8, 0x25, 0xd0, 0x2f, 0x81, 0xd8, 0xab, 0x22, 0x22, 0xc4, 0x50, 0xa5, + 0x45, 0x35, 0x66, 0xa3, 0x84, 0xf8, 0xd7, 0x09, 0x97, 0xc5, 0xcc, 0xfa, + 0x8b, 0x8e, 0xdd, 0x23, 0xdf, 0x03, 0x13, 0xa3, 0x38, 0xc4, 0xee, 0x46, + 0x91, 0xf7, 0x0d, 0x91, 0xaa, 0x51, 0xfa, 0xdc, 0xe0, 0x01, 0xf9, 0xbb, + 0xfc, 0xe1, 0x9c, 0x60, 0x71, 0x7a, 0xdf, 0xac, 0xdc, 0x30, 0x92, 0xc4, + 0xb9, 0xa6, 0x6d, 0xb0, 0xe5, 0x99, 0x6e, 0xc0, 0xc8, 0xcd, 0xf4, 0xc9, + 0xef, 0xcb, 0xf0, 0x65, 0x42, 0x01, 0x3b, 0x9e, 0x8f, 0x6f, 0xb0, 0x7d, + 0xf2, 0xe6, 0x89, 0x50, 0x1b, 0x95, 0x8b, 0x80, 0x87, 0xab, 0x72, 0x07, + 0xd0, 0x86, 0x9e, 0x80, 0x91, 0xce, 0xea, 0xfa, 0x83, 0x4d, 0x05, 0x67, + 0xb1, 0xaa, 0x94, 0x03, 0x75, 0x5f, 0xf9, 0x59, 0xd7, 0x98, 0xbd, 0xac, + 0xc2, 0x0c, 0xd0, 0x19, 0x15, 0x7e, 0x91, 0x99, 0xc4, 0x60, 0x41, 0x26, + 0xa0, 0xe6, 0x40, 0xb3, 0xfc, 0x0c, 0x08, 0x01, 0xac, 0x3c, 0xc6, 0x48, + 0x8f, 0x79, 0x61, 0x3b, 0x06, 0xa6, 0x00, 0x13, 0x9f, 0x87, 0x29, 0x60, + 0x16, 0x5c, 0x7a, 0x67, 0x16, 0x23, 0x97, 0xf5, 0x77, 0xb5, 0xf4, 0xf5, + 0x76, 0xe5, 0xde, 0xb6, 0x57, 0xe6, 0xea, 0xa8, 0x0e, 0x40, 0xe0, 0xdd, + 0xa1, 0x0e, 0x97, 0x27, 0x5c, 0x74, 0xd0, 0xb5, 0x7b, 0xed, 0x45, 0xed, + 0x5e, 0xac, 0x86, 0xc5, 0x38, 0x41, 0x3e, 0xa2, 0x60, 0x87, 0x5e, 0x0a, + 0x9b, 0x4c, 0x90, 0x48, 0xd2, 0xa6, 0xad, 0x55, 0x20, 0x93, 0xc8, 0x1b, + 0x09, 0xe8, 0x00, 0x6b, 0x9f, 0xdb, 0x13, 0x7d, 0xb8, 0x7b, 0x60, 0x36, + 0x14, 0x9f, 0xf5, 0x7e, 0xbb, 0x3a, 0xab, 0x52, 0x35, 0x4f, 0x2c, 0x74, + 0xe7, 0x79, 0xcc, 0x37, 0x56, 0x4d, 0x24, 0xaa, 0x29, 0xe3, 0xc1, 0xd5, + 0x1c, 0xde, 0x19, 0xa3, 0xde, 0xbb, 0x2b, 0x5d, 0xff, 0x59, 0x2b, 0x5d, + 0x0f, 0x0d, 0x1f, 0x34, 0x78, 0xef, 0x95, 0xd5, 0x7b, 0xde, 0x68, 0x92, + 0x73, 0x43, 0x0c, 0xcd, 0x3e, 0x5a, 0x24, 0xbe, 0xcd, 0x27, 0x14, 0x05, + 0x26, 0xba, 0xcf, 0xf2, 0x6f, 0xf0, 0xa7, 0x98, 0xf0, 0x1f, 0x27, 0x38, + 0x6e, 0xb8, 0x6e, 0x20, 0x6a, 0x81, 0x7a, 0x79, 0x02, 0x25, 0x3e, 0xfa, + 0x73, 0xcf, 0x31, 0x64, 0x60, 0xea, 0xc2, 0x1b, 0x11, 0x06, 0x9e, 0x5a, + 0xd3, 0x1e, 0x9e, 0xb5, 0x57, 0x53, 0x44, 0x35, 0xe9, 0x34, 0x17, 0x3b, + 0x99, 0x77, 0x1e, 0xfc, 0x6c, 0x16, 0x0e, 0x04, 0xbd, 0x1f, 0x5b, 0x83, + 0x44, 0x08, 0x2c, 0x0f, 0x58, 0x03, 0x82, 0xbd, 0xa6, 0xf9, 0x3b, 0x44, + 0x13, 0x75, 0x52, 0xa0, 0x4a, 0xf1, 0x39, 0xcb, 0x4b, 0x2d, 0x9e, 0xb9, + 0x22, 0x38, 0xa2, 0xea, 0x8d, 0x2c, 0x0e, 0xc5, 0x6a, 0x13, 0x9a, 0xd4, + 0xc8, 0x57, 0x4a, 0x4b, 0x5d, 0xb1, 0xb6, 0xfc, 0x58, 0x7c, 0xef, 0xee, + 0x39, 0xaa, 0x7f, 0x2f, 0x64, 0x88, 0x21, 0xf9, 0x4f, 0x62, 0x13, 0x14, + 0x38, 0xf6, 0x2d, 0x79, 0x30, 0x32, 0x9e, 0xd3, 0x53, 0x8c, 0xbc, 0x0e, + 0x6d, 0x7a, 0x0e, 0xe8, 0xc3, 0x83, 0xb6, 0x97, 0x8a, 0x4f, 0x97, 0x5a, + 0x5c, 0x86, 0x8f, 0x83, 0x19, 0x8e, 0x79, 0xa5, 0x95, 0x62, 0xba, 0x74, + 0xab, 0x51, 0x53, 0x61, 0xe5, 0x12, 0x71, 0xd1, 0x03, 0x4d, 0x0c, 0x6d, + 0x16, 0x85, 0x15, 0xfb, 0x11, 0x57, 0xa4, 0x9d, 0xbe, 0x86, 0xc0, 0x4f, + 0x06, 0x3a, 0x71, 0xb6, 0x90, 0xcc, 0x66, 0x74, 0xbb, 0x7d, 0xc8, 0x41, + 0x9d, 0xdb, 0xb5, 0xa1, 0x67, 0x58, 0x15, 0xe5, 0xc2, 0xe8, 0x70, 0x27, + 0x66, 0x32, 0xc7, 0xcc, 0xcb, 0x61, 0x67, 0x06, 0x66, 0x8b, 0xde, 0xa3, + 0x92, 0x42, 0x77, 0x4c, 0x14, 0xed, 0xc7, 0x02, 0x33, 0x4b, 0xf1, 0x39, + 0x90, 0x6c, 0x22, 0xef, 0x3e, 0x11, 0x87, 0xcc, 0x7e, 0xc8, 0x16, 0x72, + 0x04, 0x3a, 0x9a, 0xab, 0x3c, 0xc1, 0xda, 0xad, 0x48, 0xc7, 0xd6, 0x9b, + 0x48, 0x44, 0xa1, 0x47, 0x2e, 0x93, 0xa3, 0x45, 0x98, 0xd4, 0x52, 0xa9, + 0x4f, 0xfd, 0xa9, 0xc1, 0x04, 0x00, 0x70, 0x19, 0xab, 0x08, 0x0b, 0xdc, + 0x5f, 0x3c, 0xb2, 0x8c, 0x42, 0xab, 0x7b, 0xe4, 0x34, 0xd2, 0x6e, 0x5b, + 0xed, 0x72, 0xff, 0x0d, 0x9c, 0x79, 0x25, 0x38, 0xf3, 0x8a, 0x85, 0xf3, + 0xe7, 0x57, 0xc6, 0x60, 0x96, 0x01, 0xfd, 0xca, 0x18, 0x4c, 0xe8, 0x42, + 0x34, 0xfd, 0xca, 0x8c, 0x2b, 0xbf, 0xaa, 0x33, 0x0e, 0xbe, 0x99, 0x52, + 0x0d, 0x9e, 0xfa, 0x6b, 0x4e, 0x35, 0xcb, 0x6c, 0x93, 0x1d, 0x25, 0xe5, + 0x6e, 0x3f, 0xb4, 0xc0, 0xfa, 0x57, 0x99, 0x03, 0x45, 0x52, 0xbc, 0x65, + 0x95, 0xf5, 0xa2, 0x27, 0x2f, 0x3a, 0x26, 0x8f, 0x7c, 0x0f, 0x0c, 0xed, + 0x21, 0xe6, 0xed, 0x60, 0xb3, 0x67, 0xb0, 0x88, 0x9b, 0xef, 0xfe, 0x2a, + 0x07, 0x82, 0x5f, 0xa5, 0xa9, 0x6f, 0x29, 0xef, 0x94, 0xbf, 0xe0, 0xa6, + 0x94, 0x47, 0xc0, 0x18, 0x07, 0xb0, 0xb6, 0xf0, 0xf8, 0x2a, 0xca, 0xd0, + 0xf5, 0x80, 0x60, 0x31, 0x0a, 0x4e, 0xa6, 0x41, 0x82, 0xef, 0xc8, 0xf6, + 0xce, 0xa0, 0x32, 0xf6, 0xb0, 0x3d, 0x5d, 0x49, 0xdb, 0x0f, 0x1c, 0x08, + 0xaa, 0xeb, 0x1d, 0x1a, 0xdb, 0x16, 0x32, 0xed, 0x41, 0x63, 0xa9, 0xdd, + 0x95, 0x5a, 0x94, 0xbb, 0xfc, 0xa5, 0x6e, 0x7a, 0x0e, 0x77, 0xb0, 0xb8, + 0x1f, 0x8e, 0xa9, 0xfd, 0xa8, 0xef, 0x52, 0x56, 0xc6, 0xa9, 0x2d, 0xf9, + 0xca, 0x51, 0x74, 0x50, 0xf5, 0xbe, 0x37, 0x41, 0xd3, 0x40, 0xae, 0xa4, + 0xf6, 0xfe, 0x76, 0x05, 0x03, 0x0b, 0xc4, 0x2a, 0xe5, 0xc4, 0xd2, 0x55, + 0x58, 0x55, 0x05, 0x6e, 0x8b, 0xaf, 0xd7, 0xb9, 0x2d, 0x74, 0xec, 0xb7, + 0xcc, 0xdc, 0x5d, 0xdf, 0xab, 0x9f, 0x43, 0xd5, 0x1b, 0x58, 0x26, 0xdc, + 0x04, 0x64, 0xd2, 0xc8, 0x91, 0x2a, 0x1c, 0xa9, 0x60, 0x22, 0x1f, 0x32, + 0x2a, 0x24, 0xa1, 0x57, 0x02, 0x95, 0xf8, 0xe0, 0x97, 0xf4, 0x7b, 0x3a, + 0x3f, 0xec, 0xfe, 0x5b, 0x8d, 0xd7, 0xaf, 0xc1, 0xd8, 0xba, 0x55, 0xf0, + 0x86, 0xed, 0x24, 0x18, 0x9b, 0x0d, 0xf9, 0x74, 0x51, 0x26, 0xd0, 0x76, + 0x3c, 0x30, 0x43, 0xe8, 0x88, 0xa8, 0x12, 0x62, 0x15, 0x5d, 0xe5, 0x0a, + 0x5c, 0x36, 0x0a, 0x19, 0xa2, 0x11, 0x0f, 0xa7, 0x81, 0x69, 0x9a, 0x2c, + 0x58, 0x39, 0xa8, 0x46, 0x3e, 0x32, 0x1b, 0x11, 0x28, 0x77, 0x6d, 0xfd, + 0xeb, 0x78, 0x67, 0x9a, 0x89, 0x26, 0x2e, 0xbb, 0x91, 0xd6, 0xf4, 0x08, + 0x5e, 0x7f, 0xed, 0xdc, 0x8d, 0x9f, 0x78, 0xc5, 0xcd, 0x7a, 0x09, 0x31, + 0x57, 0x98, 0x86, 0x62, 0x09, 0xed, 0xc6, 0x53, 0x84, 0xa0, 0xe2, 0xd2, + 0xd6, 0x39, 0x31, 0xae, 0x61, 0x65, 0x47, 0x17, 0x7d, 0x7c, 0xf4, 0xc7, + 0x13, 0xa1, 0x2c, 0xd5, 0xc8, 0x48, 0x14, 0xd7, 0x39, 0x69, 0x85, 0x5a, + 0xa1, 0x05, 0xde, 0xa6, 0xb0, 0x72, 0x39, 0x46, 0xb1, 0xde, 0x07, 0x80, + 0xfb, 0x75, 0x98, 0xfc, 0x5c, 0x11, 0x79, 0x55, 0x45, 0x7a, 0xef, 0x9d, + 0x53, 0xde, 0xa8, 0xc7, 0x50, 0x75, 0x91, 0x87, 0xc9, 0x70, 0xb0, 0x01, + 0xeb, 0x41, 0x90, 0x3c, 0xe4, 0x9a, 0x50, 0xc6, 0xd1, 0x4e, 0x94, 0x91, + 0xf5, 0x85, 0x05, 0x2e, 0x93, 0x44, 0x48, 0xd2, 0x66, 0x0d, 0x12, 0x51, + 0x8d, 0x25, 0x6f, 0xc6, 0xf3, 0x4d, 0x25, 0x4c, 0x9e, 0xbd, 0x5e, 0x18, + 0x78, 0xb8, 0x31, 0x38, 0xe3, 0x4f, 0x75, 0xe8, 0x07, 0x9c, 0x48, 0xfa, + 0x0c, 0xd8, 0x32, 0x99, 0x5e, 0x67, 0x4d, 0x2a, 0x5f, 0xe5, 0xaf, 0x62, + 0x51, 0xf1, 0xb1, 0xee, 0xd0, 0x1b, 0xe1, 0xb7, 0x0a, 0x90, 0x6d, 0xcc, + 0x96, 0x38, 0x52, 0x4f, 0xc3, 0xa8, 0x65, 0x44, 0x54, 0xe1, 0x8a, 0xc9, + 0x3b, 0x49, 0x13, 0x92, 0x1e, 0xa6, 0x3d, 0xa8, 0x2f, 0xbb, 0x56, 0x69, + 0xd8, 0x45, 0x92, 0x03, 0x44, 0x92, 0x52, 0x56, 0x74, 0x52, 0x9f, 0xd2, + 0xcb, 0x49, 0xcc, 0x1b, 0xf8, 0xcc, 0xe9, 0xd8, 0xee, 0x75, 0x39, 0xb6, + 0x46, 0x3b, 0xf3, 0x95, 0xb4, 0x1d, 0x51, 0x7b, 0x32, 0xac, 0x79, 0x70, + 0x93, 0x8f, 0x01, 0x73, 0xe2, 0xe0, 0xf2, 0x7a, 0x68, 0x73, 0xd7, 0xfd, + 0x97, 0x00, 0xb2, 0xdd, 0x86, 0x89, 0x3d, 0xba, 0x7c, 0xea, 0xc9, 0x73, + 0x86, 0x80, 0x3b, 0xd6, 0x04, 0xe6, 0x44, 0x20, 0x92, 0x8e, 0x42, 0xef, + 0x0e, 0xaa, 0x6b, 0xdb, 0x78, 0xf2, 0x50, 0xee, 0x0e, 0x17, 0x6e, 0x8d, + 0x34, 0xe7, 0x10, 0xda, 0x5d, 0xfe, 0x31, 0x29, 0xcd, 0x48, 0xda, 0x4a, + 0xdb, 0x35, 0x91, 0xce, 0xe7, 0x35, 0xb4, 0xbc, 0xb7, 0xf8, 0x7c, 0x9c, + 0xd6, 0xe9, 0x64, 0x91, 0x80, 0xf8, 0x44, 0x61, 0x34, 0x48, 0x35, 0x43, + 0x8d, 0xcf, 0x70, 0x2c, 0xb3, 0x03, 0xf0, 0x31, 0xf8, 0x4b, 0x46, 0x9f, + 0x1c, 0x78, 0x89, 0x2b, 0xcc, 0x96, 0x88, 0xc1, 0x6d, 0x73, 0xc1, 0x5a, + 0x36, 0xc1, 0x15, 0x87, 0xa9, 0xb4, 0x58, 0x7f, 0xd9, 0xdf, 0xfc, 0x24, + 0xf1, 0xa5, 0x4f, 0xd3, 0x57, 0x9d, 0x69, 0x52, 0x4e, 0x3b, 0x06, 0x95, + 0x9b, 0x66, 0xc4, 0x00, 0x41, 0xb7, 0x4e, 0xb5, 0xaf, 0x38, 0x10, 0xe8, + 0x2d, 0x46, 0xc8, 0x6d, 0x41, 0xd2, 0x7f, 0xec, 0x64, 0xbb, 0xca, 0xe1, + 0xe2, 0xe8, 0xb0, 0xca, 0xbb, 0x0c, 0x0c, 0x5d, 0xd6, 0xfa, 0x4d, 0xeb, + 0x03, 0xf4, 0xbc, 0x7d, 0x01, 0xbc, 0x1a, 0x83, 0xdc, 0xe7, 0xdf, 0x88, + 0xc0, 0x0b, 0x78, 0x8d, 0x2d, 0x5f, 0x69, 0x5b, 0xc7, 0x66, 0x37, 0xad, + 0x76, 0x93, 0xae, 0xa5, 0x8e, 0x3a, 0x40, 0x6b, 0x03, 0x8c, 0xe9, 0xca, + 0x2e, 0x3f, 0x92, 0xb3, 0xf9, 0x7a, 0x5b, 0x89, 0x58, 0x03, 0xb9, 0xd1, + 0xb1, 0xd4, 0x76, 0x11, 0x3c, 0x34, 0x42, 0x82, 0xbd, 0xba, 0x0b, 0xc4, + 0x6c, 0x3f, 0x15, 0xfb, 0xa2, 0xd8, 0x30, 0xa6, 0x63, 0xcb, 0x31, 0x9b, + 0xfc, 0x8a, 0x3d, 0x0b, 0xcc, 0x7d, 0x26, 0x88, 0x0b, 0x8d, 0xcb, 0x67, + 0x64, 0xd9, 0x07, 0x1d, 0x8d, 0xcf, 0x8d, 0xa9, 0xba, 0x26, 0xd0, 0xc4, + 0xe3, 0x9c, 0x93, 0x1c, 0x27, 0x7d, 0x23, 0x4a, 0x35, 0x39, 0x87, 0xe4, + 0xd8, 0x47, 0x53, 0x59, 0xde, 0x06, 0xd7, 0x61, 0xd2, 0x86, 0xc2, 0xe4, + 0x03, 0x29, 0x87, 0x13, 0x31, 0x54, 0xec, 0x74, 0x84, 0x5c, 0x32, 0xb2, + 0xef, 0x5c, 0x76, 0xa1, 0x32, 0x03, 0x57, 0x94, 0x1d, 0xd5, 0x5d, 0xaa, + 0xdd, 0xb6, 0x56, 0x04, 0xfa, 0xe8, 0xe0, 0x3a, 0x98, 0x67, 0xc5, 0x67, + 0x8d, 0xec, 0xb3, 0xa6, 0xab, 0x7c, 0xd6, 0xe9, 0x7a, 0x37, 0x83, 0xab, + 0xc1, 0x01, 0x18, 0x57, 0x75, 0x3c, 0x9b, 0x40, 0xd9, 0x03, 0xc6, 0x61, + 0x38, 0x1c, 0xb3, 0x1b, 0xa7, 0xa2, 0xa3, 0x8c, 0x48, 0x68, 0xab, 0x8e, + 0x70, 0xf5, 0x62, 0xb5, 0x9d, 0xee, 0x2d, 0x33, 0x1e, 0x7c, 0xc7, 0x4b, + 0x17, 0x95, 0xc6, 0x73, 0xa9, 0xee, 0x7e, 0xd9, 0x44, 0x39, 0xdc, 0x7b, + 0x71, 0xa5, 0x86, 0x53, 0x3f, 0x74, 0xcf, 0xfa, 0x77, 0xba, 0xf0, 0xc8, + 0x14, 0xda, 0x35, 0x4a, 0x77, 0x6b, 0x72, 0xac, 0x66, 0xc6, 0x9a, 0x40, + 0x41, 0x4d, 0x21, 0x59, 0x54, 0xb7, 0xa3, 0xfd, 0x01, 0x91, 0x3f, 0x1e, + 0x65, 0x06, 0x02, 0x6e, 0x51, 0x38, 0x86, 0x10, 0x97, 0x87, 0x1c, 0x19, + 0xe0, 0x0b, 0x32, 0x80, 0x07, 0xc6, 0x0c, 0x16, 0x49, 0x83, 0x4d, 0x9a, + 0x2a, 0x6b, 0x13, 0x11, 0xea, 0x5b, 0xa2, 0x57, 0xf4, 0xa8, 0xaf, 0x11, + 0xb0, 0x4e, 0x0d, 0x81, 0xb4, 0x84, 0x32, 0x89, 0x3c, 0xd9, 0x3a, 0x24, + 0xcc, 0xaf, 0x4d, 0x80, 0x4f, 0x57, 0x1a, 0x71, 0x04, 0xa2, 0xef, 0xb0, + 0x5a, 0xc7, 0x63, 0x89, 0x51, 0x69, 0x02, 0xc4, 0x15, 0x1c, 0x75, 0x04, + 0x7b, 0x9b, 0xe1, 0x94, 0xc2, 0xbe, 0xd2, 0x59, 0x4f, 0x30, 0xd0, 0x39, + 0xd8, 0x0e, 0x9a, 0xa8, 0x2f, 0x64, 0xb0, 0x0f, 0x08, 0xe6, 0x35, 0x50, + 0xd6, 0x82, 0x30, 0x27, 0x7c, 0x4e, 0xed, 0x4d, 0x5c, 0x7c, 0x1c, 0x5f, + 0xbf, 0x4e, 0xdd, 0x3c, 0x4d, 0x44, 0x2f, 0x29, 0xd2, 0xe6, 0x98, 0x68, + 0x7e, 0xd3, 0xc7, 0xc9, 0xc8, 0x23, 0x69, 0x4f, 0x63, 0x92, 0x8e, 0x3c, + 0x8d, 0xc9, 0x97, 0xf1, 0x54, 0xfd, 0x5e, 0xde, 0x37, 0x61, 0x97, 0x1c, + 0x7e, 0x17, 0x4f, 0xcd, 0x94, 0x4e, 0xf3, 0x37, 0x46, 0xdc, 0x43, 0xf9, + 0xca, 0xd8, 0xa9, 0xcc, 0x8d, 0xc5, 0x3c, 0xc9, 0x5e, 0x66, 0xfa, 0xbe, + 0x01, 0x7d, 0x36, 0x44, 0x65, 0x40, 0x7f, 0x28, 0xc4, 0x15, 0xb1, 0x05, + 0x6a, 0x09, 0x30, 0xcf, 0x24, 0x71, 0x62, 0x1c, 0xfd, 0x3a, 0xe9, 0x4d, + 0xa8, 0xef, 0x54, 0x86, 0x29, 0xd3, 0x27, 0x4a, 0x3d, 0x0d, 0x94, 0x8f, + 0xd4, 0x95, 0xf2, 0x29, 0xea, 0x77, 0x7e, 0x42, 0x01, 0xfa, 0x75, 0x6e, + 0xb1, 0xe2, 0x65, 0x84, 0x30, 0xcf, 0xb0, 0xd0, 0x84, 0xfc, 0x36, 0x17, + 0xbf, 0xcd, 0xc5, 0x47, 0x9d, 0x8b, 0xdf, 0x72, 0xde, 0x37, 0xf8, 0x2c, + 0x3f, 0x6d, 0xcb, 0x79, 0x9b, 0xf5, 0xb2, 0x99, 0xa7, 0x8f, 0x76, 0xd1, + 0xbb, 0x4d, 0x10, 0x1d, 0xd6, 0xed, 0x7b, 0xfa, 0xb8, 0x1c, 0x5f, 0xfc, + 0x44, 0x5b, 0x40, 0x3e, 0xac, 0xe8, 0x71, 0xe3, 0x26, 0x6f, 0xde, 0x98, + 0x4f, 0x21, 0xb3, 0xc8, 0xda, 0x56, 0xfa, 0x76, 0x5b, 0xc9, 0x1b, 0x03, + 0x98, 0x90, 0x91, 0x22, 0xad, 0x12, 0xae, 0x2f, 0x52, 0xe6, 0x59, 0x70, + 0x51, 0xfa, 0xd5, 0x6a, 0x99, 0xde, 0x8b, 0xcd, 0x2c, 0x23, 0xe7, 0x41, + 0x25, 0xd4, 0x12, 0xe9, 0xd6, 0x17, 0x71, 0xf3, 0x96, 0x62, 0x94, 0xb3, + 0xff, 0x17, 0x9b, 0x78, 0xd1, 0x99, 0x70, 0x9b, 0xbd, 0xfe, 0x0d, 0x64, + 0x74, 0x32, 0xe5, 0xea, 0x4c, 0x0d, 0x6c, 0x0d, 0x5d, 0xcd, 0xd5, 0x7d, + 0xf8, 0x8f, 0xbf, 0xff, 0xe7, 0x1f, 0x3e, 0xcc, 0x13, 0x76, 0x0a, 0x69, + 0x92, 0xca, 0xb8, 0xbe, 0x90, 0xed, 0xda, 0x92, 0xff, 0x52, 0x62, 0x58, + 0x4a, 0xc8, 0xad, 0x46, 0xc0, 0x1f, 0x2b, 0x01, 0xf6, 0x7a, 0x66, 0x2c, + 0xf3, 0xc5, 0x56, 0x42, 0xb3, 0x8d, 0xe1, 0x6d, 0xc1, 0x1b, 0x8b, 0xb5, + 0x82, 0x8e, 0xca, 0xe1, 0x7c, 0xab, 0x09, 0x80, 0x3d, 0x98, 0xb6, 0xf5, + 0xe8, 0x5b, 0x4d, 0x1d, 0x6c, 0xf9, 0xe4, 0xe2, 0x78, 0xd3, 0x8a, 0xe5, + 0x1c, 0xf2, 0xd0, 0xc0, 0xee, 0x6f, 0x91, 0x4e, 0x7d, 0x88, 0x15, 0x1d, + 0x40, 0x98, 0x02, 0x06, 0xda, 0xc1, 0xe6, 0x3d, 0xf4, 0xb5, 0x12, 0x0f, + 0x03, 0x8f, 0xc5, 0x0d, 0x02, 0x8a, 0x69, 0x76, 0x57, 0x90, 0x5b, 0xc2, + 0xb7, 0xba, 0x3b, 0x04, 0xa7, 0x43, 0x50, 0x2b, 0x62, 0x08, 0x9c, 0x4b, + 0xf9, 0xcc, 0x91, 0x0b, 0x7e, 0x5a, 0x8f, 0x8a, 0x5b, 0x81, 0x01, 0x0a, + 0x68, 0x14, 0x7a, 0x4c, 0xfe, 0x83, 0xaf, 0x65, 0x7f, 0x9f, 0xa9, 0xda, + 0x21, 0x24, 0x2e, 0x77, 0x00, 0xfc, 0x02, 0xf9, 0x95, 0x01, 0x9c, 0x1e, + 0xc3, 0xd5, 0x80, 0x7c, 0x19, 0x39, 0x7f, 0x10, 0x78, 0x4f, 0x35, 0x48, + 0x89, 0xe5, 0x80, 0x86, 0xba, 0x65, 0x20, 0x5c, 0x49, 0x5e, 0x5a, 0xfd, + 0x60, 0x21, 0xb5, 0xc4, 0x40, 0x7b, 0x3d, 0xba, 0x7e, 0xaf, 0x87, 0x44, + 0x62, 0x54, 0x03, 0x32, 0x0b, 0xce, 0xc6, 0x3a, 0x40, 0xe5, 0x7f, 0x7d, + 0x46, 0xe7, 0x16, 0x5e, 0x8d, 0xc2, 0x42, 0x03, 0x62, 0x36, 0xcb, 0x5b, + 0x20, 0xba, 0x96, 0x54, 0x50, 0xcd, 0x89, 0xdc, 0x42, 0x62, 0x8e, 0x0c, + 0xe5, 0xdb, 0xe1, 0x09, 0x9f, 0x99, 0xbd, 0x4d, 0x8b, 0xdc, 0x40, 0xf1, + 0x10, 0x10, 0x78, 0x18, 0x97, 0x26, 0xf1, 0xd8, 0x38, 0x4a, 0x3c, 0x82, + 0x1b, 0xc9, 0xb6, 0x8c, 0xbf, 0x1a, 0x14, 0x12, 0xa5, 0x0f, 0x0f, 0x31, + 0x68, 0x8b, 0xa8, 0x72, 0xec, 0x00, 0x29, 0x3f, 0xb6, 0xab, 0x23, 0xf7, + 0xd7, 0x50, 0xa5, 0x00, 0x7a, 0xaf, 0xe0, 0x76, 0xe6, 0x32, 0x6d, 0x86, + 0x60, 0x21, 0x5a, 0x54, 0x1e, 0xc1, 0x72, 0x92, 0xf0, 0xf9, 0x43, 0x1c, + 0xb2, 0xdb, 0xf3, 0x0b, 0xe0, 0x7e, 0x02, 0x5e, 0xa2, 0x41, 0x57, 0xb5, + 0x23, 0x47, 0xd5, 0xd3, 0x14, 0xc3, 0x41, 0x4b, 0xe8, 0xe7, 0x22, 0x13, + 0xc5, 0x11, 0x3b, 0x8f, 0x3c, 0x24, 0x14, 0x2f, 0x4b, 0xfc, 0x6c, 0xeb, + 0x91, 0x70, 0x0c, 0x6f, 0x0e, 0x9c, 0xa0, 0xa5, 0x29, 0x14, 0xbe, 0x23, + 0xb9, 0x36, 0xf2, 0xba, 0x29, 0x2a, 0x0a, 0xf3, 0x0f, 0x91, 0x2f, 0x0e, + 0xe2, 0xa0, 0xa9, 0xfa, 0xac, 0x34, 0x73, 0xbb, 0x84, 0xdf, 0xaf, 0x6f, + 0x6f, 0x65, 0x2c, 0x1e, 0x27, 0xf8, 0x4b, 0x99, 0x5a, 0x45, 0x01, 0xc1, + 0x3a, 0x0a, 0xdb, 0xd1, 0x17, 0x00, 0xff, 0x18, 0x0e, 0x2b, 0xd4, 0xaf, + 0x73, 0x20, 0x4c, 0x7b, 0x24, 0x80, 0x72, 0x90, 0x8a, 0x9d, 0x5a, 0xa2, + 0x03, 0x00, 0xbc, 0xac, 0xc1, 0x33, 0x0b, 0xe0, 0x68, 0x92, 0x21, 0xc0, + 0xea, 0xd0, 0x53, 0x53, 0xb6, 0xbe, 0x22, 0x62, 0x5b, 0xfb, 0xc0, 0x33, + 0x9d, 0x5e, 0x33, 0x52, 0xbd, 0xda, 0x10, 0x90, 0x57, 0xb0, 0xbd, 0x58, + 0xe9, 0x74, 0x42, 0xf2, 0x18, 0xfc, 0xa6, 0xf8, 0x59, 0x7c, 0xfb, 0x9e, + 0x11, 0x3c, 0x47, 0x6e, 0xe5, 0x3b, 0xd2, 0xe8, 0x2d, 0xfd, 0xb6, 0xa6, + 0x5c, 0xc9, 0x6e, 0xb8, 0x81, 0x3c, 0x57, 0xf1, 0x35, 0x71, 0xb0, 0xc7, + 0x38, 0x65, 0x38, 0xa2, 0xbd, 0xf4, 0xed, 0xcb, 0xa3, 0xbf, 0x5e, 0x07, + 0x16, 0x8e, 0x03, 0x78, 0xb0, 0x88, 0xa8, 0x8b, 0xd7, 0x25, 0x34, 0x11, + 0x0c, 0x40, 0xe3, 0x0d, 0xbe, 0xbe, 0x47, 0x8f, 0x8b, 0x47, 0xe0, 0xb3, + 0x4c, 0x22, 0x03, 0x44, 0x4b, 0x63, 0xf1, 0x06, 0x2c, 0x51, 0x81, 0x36, + 0x79, 0x32, 0x4f, 0xdf, 0x0b, 0x0e, 0x68, 0x99, 0x8f, 0x7d, 0xf4, 0x76, + 0x30, 0xa5, 0x21, 0xa4, 0x1d, 0x71, 0x28, 0xf1, 0x98, 0x04, 0x4d, 0xe2, + 0xe7, 0xe9, 0x69, 0x34, 0x71, 0x30, 0xe1, 0xf4, 0x45, 0xf2, 0x48, 0x0c, + 0xcf, 0xe5, 0xe7, 0x19, 0x8b, 0x9f, 0x18, 0xdb, 0xb7, 0x2d, 0x17, 0xe1, + 0xf7, 0xb8, 0x8e, 0x30, 0x6d, 0x63, 0xb0, 0x14, 0x92, 0xa7, 0x83, 0x56, + 0x47, 0xeb, 0x0b, 0xcf, 0x59, 0x30, 0xc6, 0x54, 0xe7, 0xec, 0x91, 0x25, + 0xd9, 0xcb, 0x07, 0xa0, 0x09, 0xcb, 0xb3, 0x29, 0xb6, 0x41, 0x34, 0x7c, + 0xc2, 0xb4, 0x38, 0x85, 0x1c, 0x9a, 0x12, 0xd0, 0xed, 0xe0, 0x4a, 0x06, + 0xdf, 0x94, 0x39, 0x5f, 0x30, 0x14, 0x3c, 0x1e, 0xee, 0xe8, 0x51, 0x4c, + 0xcc, 0x0f, 0x6b, 0x2a, 0x1d, 0x62, 0x12, 0x8d, 0x25, 0xad, 0x44, 0x54, + 0xe0, 0xec, 0x78, 0x32, 0x96, 0x8f, 0x98, 0x28, 0xa6, 0x0c, 0xa7, 0xd7, + 0x68, 0xb9, 0xfb, 0x70, 0x0e, 0xc3, 0x9c, 0x01, 0x4d, 0x0b, 0x0a, 0xe7, + 0x96, 0xef, 0x65, 0x71, 0x6c, 0x73, 0xc2, 0x3e, 0xd7, 0xd5, 0xac, 0xcc, + 0xdc, 0xbe, 0x6e, 0x02, 0x2a, 0xcc, 0x40, 0x0e, 0xf8, 0x3e, 0x9c, 0x77, + 0xf4, 0x7a, 0x5e, 0xd8, 0x6f, 0x50, 0xde, 0x9c, 0x6f, 0xe1, 0xfb, 0xe1, + 0x1d, 0x7e, 0x73, 0x01, 0x04, 0x37, 0xf5, 0xe1, 0xdd, 0x79, 0x48, 0xbf, + 0x88, 0x00, 0x00, 0xf6, 0x2b, 0x72, 0xca, 0xb4, 0x15, 0x97, 0xb5, 0xae, + 0xe7, 0x3f, 0xee, 0x21, 0xb3, 0x91, 0xab, 0x4a, 0xb2, 0xe9, 0xbe, 0x0c, + 0x8d, 0x29, 0x68, 0x24, 0xed, 0x2a, 0x1b, 0x02, 0x73, 0x13, 0x1c, 0xfa, + 0xb2, 0x76, 0x5f, 0xf4, 0xb2, 0x22, 0x43, 0x31, 0x97, 0x4a, 0x4e, 0xdd, + 0xf8, 0x64, 0xa1, 0x90, 0x11, 0x7e, 0x5c, 0x72, 0x5c, 0x2c, 0x20, 0x9d, + 0x52, 0x0f, 0xe3, 0xe7, 0x8a, 0x18, 0x75, 0xad, 0xa3, 0x2b, 0x29, 0xa0, + 0xf3, 0xc2, 0x12, 0xb9, 0xaf, 0xb9, 0xab, 0x9b, 0x53, 0xe4, 0x56, 0x9d, + 0xd4, 0xa6, 0x8c, 0x00, 0x89, 0x0b, 0x68, 0x55, 0x37, 0x7e, 0x7e, 0xd8, + 0xe9, 0x20, 0x5c, 0x81, 0x28, 0x3a, 0x86, 0x96, 0x0c, 0xb9, 0x67, 0x0f, + 0x0c, 0x01, 0xaa, 0xb4, 0x8b, 0xf8, 0x9a, 0x26, 0xab, 0xf9, 0x31, 0x38, + 0x0c, 0xd0, 0x72, 0x28, 0xfd, 0x18, 0xcb, 0x8f, 0x7d, 0x4b, 0x86, 0x2c, + 0x3a, 0xda, 0xf7, 0x62, 0x47, 0x45, 0xd8, 0x6c, 0xa6, 0x1e, 0x54, 0x14, + 0xd6, 0x00, 0x1b, 0xa7, 0xfe, 0x09, 0x7c, 0xde, 0xf4, 0x09, 0xe0, 0xbd, + 0x13, 0xed, 0x60, 0xbd, 0xae, 0x9a, 0x92, 0xb2, 0x88, 0x11, 0x5b, 0xf6, + 0x31, 0x04, 0x2d, 0xd5, 0x17, 0x82, 0x08, 0x92, 0x22, 0xe4, 0xe6, 0x2f, + 0x00, 0x88, 0xd8, 0xae, 0x64, 0x77, 0xdf, 0x22, 0x20, 0xde, 0x0d, 0x1f, + 0x4c, 0x8d, 0xac, 0x89, 0xdf, 0xf2, 0x6b, 0x01, 0x8a, 0x7e, 0x51, 0xe8, + 0xdd, 0xef, 0x56, 0xbc, 0xc2, 0xf9, 0x65, 0x8b, 0xcf, 0xe5, 0xbe, 0x6b, + 0x05, 0x42, 0xa9, 0xa5, 0x74, 0x29, 0x3b, 0x0f, 0x97, 0x14, 0x6f, 0x39, + 0x50, 0x16, 0x0d, 0x2b, 0xa9, 0xbb, 0xe6, 0xbb, 0x96, 0x5d, 0x3e, 0xa1, + 0x27, 0x30, 0xf4, 0xc5, 0x67, 0x8e, 0xe5, 0xba, 0xd2, 0xa6, 0x2e, 0x62, + 0x95, 0xbd, 0x8d, 0x0b, 0x91, 0x5d, 0xea, 0xa0, 0xdc, 0x37, 0x7c, 0x38, + 0x41, 0x52, 0x02, 0x66, 0x04, 0x73, 0x4f, 0x7b, 0x7e, 0xed, 0x00, 0xbb, + 0x3e, 0x7c, 0x48, 0x58, 0x7b, 0xb2, 0x77, 0x2b, 0x24, 0xe6, 0xdf, 0x62, + 0xb1, 0xf7, 0xc5, 0x62, 0x7f, 0x79, 0x6d, 0x0e, 0xf8, 0x32, 0xa0, 0x6f, + 0x87, 0x03, 0xfe, 0x97, 0x3f, 0x29, 0x81, 0xcf, 0x7b, 0x6b, 0x0d, 0xeb, + 0x21, 0x09, 0xce, 0xff, 0xb4, 0x11, 0x97, 0x6d, 0x88, 0xd1, 0xe0, 0x70, + 0xe8, 0x20, 0x6f, 0xbf, 0xc7, 0xf2, 0xfa, 0x3d, 0x82, 0xd0, 0x8d, 0x0e, + 0xde, 0xb3, 0x46, 0x82, 0x05, 0xcb, 0x36, 0xe2, 0xf1, 0x2c, 0x84, 0x31, + 0x96, 0x72, 0x2c, 0xa9, 0xfb, 0xa7, 0x02, 0x94, 0x5d, 0xc5, 0x04, 0x5e, + 0x28, 0x81, 0xbe, 0xa5, 0xe6, 0xf9, 0xc1, 0x3d, 0xf0, 0x32, 0x1b, 0x0e, + 0x21, 0xdf, 0x53, 0xe4, 0x9c, 0x16, 0xa9, 0x0b, 0x2a, 0x0c, 0xde, 0x7d, + 0xfc, 0xe3, 0x1f, 0xdf, 0xa1, 0xb7, 0xad, 0xf0, 0xc4, 0xdf, 0x6b, 0x5c, + 0x16, 0x77, 0x20, 0x3c, 0xbb, 0xf6, 0x95, 0xa6, 0xab, 0x87, 0x4d, 0xa8, + 0x9c, 0x7a, 0x81, 0xd3, 0x16, 0xb6, 0x3f, 0x80, 0x0b, 0x22, 0xee, 0xb6, + 0x1e, 0x48, 0x7d, 0x1f, 0x71, 0xbb, 0x52, 0xbd, 0xb4, 0xd2, 0x6a, 0x69, + 0x6f, 0xdb, 0x4e, 0xd4, 0x7a, 0x50, 0xe1, 0x58, 0x8e, 0x2a, 0xd5, 0x21, + 0x38, 0x01, 0x84, 0xb7, 0xce, 0xf3, 0xfe, 0x4c, 0xc4, 0x40, 0xf8, 0x8f, + 0x7d, 0xb1, 0x73, 0x8f, 0xa7, 0xe2, 0xd3, 0xb4, 0x4f, 0xb5, 0x2e, 0x42, + 0xeb, 0x93, 0x5b, 0x66, 0x14, 0xe4, 0x3e, 0x7d, 0xdb, 0x1d, 0x6f, 0xb0, + 0xf8, 0x7f, 0x7c, 0xe5, 0xdd, 0xd1, 0xbe, 0xa9, 0xdd, 0xf1, 0xcf, 0x32, + 0x5c, 0xfe, 0x5e, 0xfb, 0x75, 0xbe, 0xab, 0x10, 0x0f, 0x03, 0x11, 0x39, + 0x4a, 0xeb, 0x7b, 0x10, 0x7b, 0x20, 0x91, 0x21, 0x88, 0x53, 0x35, 0x02, + 0xbe, 0x44, 0xd6, 0x44, 0x41, 0x3e, 0x07, 0xf1, 0xc4, 0xc0, 0x81, 0xb1, + 0x08, 0xf1, 0x30, 0x87, 0x34, 0xd3, 0x3d, 0xe0, 0x12, 0x38, 0xea, 0x65, + 0x98, 0x3f, 0x65, 0xb0, 0x89, 0x43, 0x59, 0x39, 0xfb, 0x62, 0x7f, 0x59, + 0x75, 0x42, 0x4b, 0x87, 0xa2, 0xdf, 0x28, 0x8f, 0xf4, 0xa6, 0x3b, 0xff, + 0x6d, 0x8d, 0xb8, 0x61, 0x8d, 0xf8, 0xf3, 0x56, 0x34, 0xc3, 0x73, 0x2c, + 0x10, 0x65, 0x34, 0xdf, 0xd0, 0x02, 0x21, 0x32, 0xf6, 0x19, 0x82, 0x0c, + 0xf4, 0x5f, 0x50, 0x4b, 0x19, 0x28, 0x8c, 0x62, 0x05, 0x11, 0x30, 0x83, + 0xee, 0x97, 0x81, 0xce, 0xf7, 0x10, 0x8f, 0xea, 0x37, 0xa6, 0x26, 0x95, + 0xfa, 0x65, 0x02, 0x8a, 0x39, 0x86, 0x0c, 0x61, 0x65, 0xc3, 0x80, 0x39, + 0x15, 0x8e, 0x56, 0x37, 0x49, 0x8c, 0xcc, 0x88, 0xa1, 0x9a, 0xfe, 0x60, + 0x7c, 0xd6, 0x13, 0x66, 0x1d, 0x50, 0x7a, 0xa6, 0xc7, 0x32, 0xc5, 0xb4, + 0x52, 0x45, 0x63, 0xcd, 0x36, 0x06, 0x20, 0xc8, 0xc2, 0x61, 0xde, 0xa1, + 0x26, 0x0d, 0xb9, 0xfc, 0x2f, 0x1f, 0x91, 0x3d, 0xa9, 0xaf, 0xd4, 0x48, + 0xe8, 0xaa, 0xa0, 0x40, 0x54, 0x4d, 0x5c, 0x54, 0xad, 0x28, 0x99, 0x21, + 0x5f, 0xac, 0x6c, 0x5b, 0x7e, 0x93, 0x2a, 0xae, 0x21, 0x12, 0x25, 0x68, + 0xf2, 0x1a, 0xe2, 0xd7, 0xad, 0x12, 0x1b, 0x4a, 0x4b, 0x72, 0xa9, 0xa0, + 0xd4, 0xd2, 0x8b, 0x4e, 0xe3, 0xdb, 0xcc, 0xfa, 0xfb, 0xdd, 0x21, 0xfb, + 0x6b, 0x9d, 0x7d, 0x88, 0xf3, 0x95, 0xf1, 0x13, 0x81, 0x07, 0xf8, 0xd3, + 0x2a, 0xa3, 0xd0, 0xa4, 0x6e, 0x4f, 0x2b, 0x4c, 0x3e, 0xfa, 0xac, 0xf3, + 0x09, 0xe5, 0x4e, 0x84, 0x44, 0xe7, 0x4e, 0xbd, 0x23, 0xf6, 0x2d, 0x2f, + 0xe0, 0x0f, 0xb3, 0xdb, 0xe2, 0x7a, 0x67, 0xe7, 0x1a, 0xf7, 0x4b, 0x74, + 0x86, 0x25, 0x6e, 0xa6, 0xb4, 0xc2, 0x80, 0x54, 0x93, 0x66, 0xdb, 0xa9, + 0x99, 0xc0, 0x24, 0x32, 0x5b, 0xc2, 0xa0, 0xf7, 0xd0, 0x00, 0x75, 0xd9, + 0xa6, 0x02, 0x2c, 0x83, 0x00, 0x83, 0x38, 0xb1, 0x3e, 0xfd, 0xfb, 0x92, + 0x58, 0xdb, 0x05, 0x50, 0x0a, 0x5d, 0xb5, 0xd2, 0xb3, 0x89, 0x06, 0x0a, + 0x18, 0xce, 0xd9, 0x47, 0x37, 0x0d, 0x9f, 0xf2, 0x82, 0x72, 0x02, 0x3c, + 0x17, 0xf9, 0x94, 0x81, 0x73, 0xe0, 0xff, 0x05, 0xc5, 0x84, 0x7b, 0xdb, + 0x9d, 0x47, 0x7a, 0x05, 0x20, 0x97, 0xd2, 0xdc, 0xa0, 0x93, 0x87, 0xeb, + 0xed, 0xde, 0xbd, 0xe7, 0xfc, 0xf5, 0x12, 0x4b, 0xec, 0x1d, 0xac, 0x97, + 0x8d, 0x20, 0x86, 0xd2, 0x3c, 0x63, 0x56, 0x96, 0x02, 0xab, 0x3e, 0x13, + 0xf4, 0x04, 0x59, 0x58, 0x99, 0xfb, 0x42, 0xd8, 0x25, 0xec, 0x06, 0x1e, + 0x19, 0xc2, 0x17, 0x20, 0x00, 0x96, 0xb7, 0x2d, 0x4a, 0x8f, 0x23, 0xd6, + 0x37, 0x4d, 0x6a, 0x76, 0x04, 0x97, 0xa6, 0x7f, 0x11, 0x6a, 0xf5, 0xdf, + 0xc5, 0x3d, 0x30, 0x3d, 0x0e, 0x65, 0x8b, 0x7c, 0x5e, 0xe2, 0xf6, 0x90, + 0x1e, 0x46, 0xb8, 0x6c, 0xe7, 0xb8, 0x9a, 0x0a, 0xd2, 0x60, 0xbd, 0x2e, + 0xdf, 0x8c, 0x31, 0xf5, 0x67, 0xe0, 0x62, 0xfb, 0xf5, 0x1f, 0x44, 0x73, + 0xf3, 0x8c, 0x81, 0x14, 0x6c, 0x7f, 0xde, 0x50, 0x14, 0x26, 0x7f, 0x07, + 0x11, 0x91, 0x64, 0xf5, 0x29, 0xae, 0x88, 0x62, 0xd6, 0x1b, 0xc1, 0x65, + 0x5b, 0x51, 0x9c, 0x95, 0x6e, 0x7f, 0xb8, 0xa9, 0xfa, 0x6a, 0x26, 0x51, + 0x86, 0xf0, 0x10, 0xb3, 0x79, 0x36, 0x81, 0xbf, 0xdf, 0x19, 0xdf, 0xf2, + 0x0e, 0x5c, 0x2e, 0xd5, 0x8e, 0x3c, 0x4f, 0x25, 0xf8, 0x8e, 0x5a, 0xe5, + 0xd5, 0x55, 0x64, 0xcb, 0x62, 0x49, 0x3f, 0x6e, 0x04, 0x74, 0x50, 0xc0, + 0x0c, 0x41, 0xf6, 0xfc, 0xad, 0xc9, 0xd0, 0x37, 0xed, 0x31, 0x52, 0xbb, + 0x0c, 0xd1, 0xb9, 0xb0, 0xa1, 0xc4, 0x0d, 0x94, 0x65, 0xbb, 0x15, 0x86, + 0x65, 0x3a, 0x50, 0x9c, 0xdf, 0xff, 0xe0, 0x46, 0x71, 0x9b, 0x21, 0xfd, + 0x04, 0x86, 0x14, 0xa4, 0x03, 0xc2, 0xaa, 0x1d, 0xe5, 0xa9, 0x01, 0x9d, + 0x09, 0xea, 0xa1, 0x3b, 0x39, 0x85, 0x45, 0xa7, 0xe6, 0xd0, 0xce, 0x9c, + 0xf5, 0x34, 0x07, 0x4f, 0xd7, 0xdf, 0x59, 0x59, 0x24, 0x3e, 0xca, 0x06, + 0xf5, 0x3a, 0x4f, 0x2c, 0xa3, 0xf1, 0x37, 0x39, 0x77, 0x67, 0x6a, 0xa9, + 0xc1, 0x16, 0x3d, 0x4d, 0x0c, 0x2a, 0x9c, 0xc4, 0x3d, 0x0a, 0xc1, 0x18, + 0x60, 0x92, 0xf0, 0x71, 0xc1, 0xf9, 0xb3, 0xf4, 0x07, 0x04, 0x8c, 0x52, + 0x41, 0x13, 0x44, 0xea, 0x9a, 0xd0, 0x66, 0x84, 0x5a, 0x30, 0xe4, 0xe3, + 0x80, 0xf4, 0x7c, 0xd6, 0xf9, 0xcc, 0xa5, 0x08, 0x02, 0xb8, 0xc6, 0xcb, + 0x5e, 0x24, 0x02, 0x29, 0x6a, 0xd1, 0x88, 0x24, 0xc7, 0x03, 0x1e, 0xdc, + 0x8a, 0x5e, 0xcd, 0x5a, 0xcb, 0xfc, 0x38, 0xf4, 0x31, 0x5d, 0x7f, 0xc2, + 0x07, 0xbd, 0xd4, 0x8b, 0x1a, 0x98, 0x95, 0x18, 0x9d, 0x06, 0x5b, 0xa0, + 0xe9, 0x3a, 0xb3, 0x79, 0xf5, 0x2c, 0xc9, 0x43, 0xfc, 0x3e, 0xeb, 0x15, + 0xfe, 0x26, 0xf3, 0xfc, 0x5a, 0x42, 0xcf, 0x6e, 0xab, 0x57, 0x98, 0x45, + 0x03, 0x63, 0x8f, 0x11, 0x35, 0x86, 0xbd, 0xeb, 0x84, 0x7b, 0xb1, 0x8f, + 0x92, 0x8b, 0x19, 0x5d, 0xcf, 0x09, 0x3d, 0x26, 0x04, 0x86, 0x3a, 0xcc, + 0xe3, 0x88, 0x77, 0x67, 0xa2, 0x0d, 0x94, 0x41, 0xc0, 0x8a, 0x03, 0x28, + 0x95, 0x5c, 0x91, 0x77, 0x2f, 0xed, 0x49, 0x92, 0xec, 0xac, 0xba, 0x25, + 0x67, 0xd8, 0xdf, 0x46, 0xb2, 0xfc, 0x36, 0x93, 0xfc, 0x79, 0x77, 0xb0, + 0xd1, 0x6e, 0x34, 0xc9, 0xfb, 0x26, 0x74, 0x1b, 0xe8, 0x21, 0xba, 0xb7, + 0x13, 0x51, 0xff, 0x4d, 0x66, 0xa8, 0x32, 0x4f, 0xad, 0x86, 0x87, 0x42, + 0xe7, 0x7e, 0xcb, 0xee, 0x86, 0xce, 0xe6, 0x61, 0xc9, 0x92, 0xc9, 0x70, + 0x79, 0xa6, 0xba, 0x06, 0xd2, 0x1d, 0xac, 0x6a, 0x01, 0x10, 0x3f, 0xd5, + 0x83, 0x50, 0x15, 0x6e, 0xd6, 0x03, 0xe1, 0x72, 0x1c, 0x5c, 0x78, 0x0e, + 0x44, 0xfe, 0xa9, 0xf0, 0x21, 0x8e, 0xf4, 0x54, 0x18, 0xf6, 0xc6, 0x02, + 0x22, 0xf8, 0xbb, 0x39, 0x84, 0x2f, 0x58, 0x26, 0x01, 0x2e, 0x8d, 0x16, + 0x53, 0x49, 0x46, 0xc3, 0xaa, 0x5c, 0x36, 0xa4, 0xb5, 0x2e, 0xe6, 0x38, + 0xc9, 0x1e, 0x61, 0x06, 0xc0, 0xaa, 0xfb, 0x6d, 0x96, 0xea, 0x71, 0x84, + 0x16, 0x75, 0x46, 0xad, 0xf8, 0x52, 0x74, 0x78, 0x39, 0xa9, 0x9d, 0x4e, + 0xda, 0x67, 0x80, 0xb9, 0x76, 0xb0, 0x57, 0xef, 0x8f, 0xe5, 0x25, 0x2e, + 0x07, 0x48, 0x05, 0x06, 0xa6, 0x75, 0x1f, 0x18, 0x67, 0xc3, 0x85, 0x9b, + 0xea, 0x09, 0xf4, 0x20, 0x3c, 0xf1, 0x8a, 0xfb, 0xc5, 0xbd, 0x1c, 0x8b, + 0x18, 0x08, 0x37, 0x4c, 0x15, 0x26, 0xe6, 0xe1, 0xa8, 0x8d, 0xca, 0x67, + 0x35, 0xfa, 0xcc, 0x32, 0xca, 0xcc, 0xba, 0x7b, 0x41, 0x92, 0xd5, 0xf8, + 0x6c, 0xbe, 0xa2, 0xa6, 0x70, 0xb6, 0x47, 0x1b, 0xac, 0xeb, 0xd3, 0x5e, + 0xc5, 0x2a, 0x96, 0xde, 0x63, 0xe5, 0x5f, 0xe7, 0xa8, 0x8e, 0x87, 0x4b, + 0xa8, 0xf4, 0x5c, 0x59, 0x85, 0x38, 0xdf, 0xcd, 0x77, 0x77, 0xcb, 0x50, + 0x3d, 0xdc, 0x3d, 0x30, 0x8c, 0x65, 0xe7, 0xbd, 0x5a, 0xc0, 0x03, 0xea, + 0x9a, 0xda, 0x89, 0x34, 0xcd, 0x2b, 0x7a, 0xa5, 0xca, 0xdc, 0x7c, 0x59, + 0xfd, 0x3d, 0x3f, 0x94, 0x59, 0xbd, 0xce, 0x13, 0x61, 0x08, 0x64, 0x6a, + 0x6f, 0x5a, 0x74, 0x26, 0xd5, 0x1a, 0x0e, 0xb2, 0xe2, 0xc4, 0xbc, 0xe6, + 0x79, 0x2f, 0x1a, 0x78, 0xdd, 0x82, 0x6a, 0x14, 0x57, 0x5d, 0x01, 0x0f, + 0x19, 0xf6, 0x0c, 0x7e, 0x28, 0xe5, 0x63, 0xae, 0x71, 0x08, 0x0e, 0x88, + 0xcb, 0x29, 0xcb, 0xb0, 0x0c, 0x5b, 0x05, 0x84, 0x0b, 0x79, 0x02, 0xbc, + 0x80, 0x62, 0x4d, 0x20, 0xd5, 0xb4, 0x21, 0x34, 0x9f, 0xca, 0xf8, 0xf8, + 0xa8, 0x3d, 0x1c, 0xbb, 0x91, 0x4f, 0x90, 0x56, 0x51, 0xce, 0xc6, 0x94, + 0xee, 0xfa, 0xd8, 0x7e, 0xe9, 0x33, 0x93, 0xb1, 0xe4, 0xc1, 0x24, 0x28, + 0xed, 0xcc, 0x5c, 0x8d, 0x8a, 0x4e, 0x76, 0xe0, 0x7a, 0xbf, 0x8c, 0x05, + 0x66, 0x70, 0x6d, 0x00, 0xb5, 0x4d, 0xbc, 0x0a, 0x01, 0x33, 0x1c, 0x45, + 0x19, 0x5c, 0x2a, 0xcb, 0x33, 0xde, 0x8b, 0xb5, 0x95, 0x7d, 0xc6, 0x47, + 0x12, 0x38, 0x9e, 0xeb, 0xcf, 0xdc, 0x97, 0xa1, 0x55, 0x29, 0x3a, 0xae, + 0xfa, 0x83, 0x65, 0xdd, 0x19, 0x7c, 0x0e, 0x7c, 0x58, 0x40, 0xe6, 0x00, + 0x6a, 0x1d, 0x0a, 0xf6, 0x6c, 0x5f, 0x1d, 0x13, 0x3e, 0xf7, 0x3b, 0x7e, + 0x14, 0x86, 0xb9, 0xb9, 0x70, 0xb1, 0x16, 0xfb, 0xc1, 0xbf, 0x43, 0xed, + 0x5f, 0x6f, 0xa1, 0xad, 0x09, 0x2b, 0x1b, 0xe9, 0x2b, 0x75, 0x50, 0x69, + 0xcc, 0xff, 0x4a, 0x3c, 0x8d, 0x86, 0x04, 0xae, 0x6d, 0x1c, 0xe0, 0xcd, + 0x6c, 0xfd, 0xa6, 0x65, 0x09, 0xab, 0x49, 0x1f, 0x1c, 0x6c, 0xe8, 0x27, + 0x14, 0x27, 0xd2, 0x07, 0x43, 0xee, 0x68, 0xfe, 0x70, 0xd3, 0x57, 0x42, + 0x58, 0x01, 0x10, 0x80, 0xfa, 0x5a, 0x17, 0xc3, 0x48, 0xc8, 0x00, 0xff, + 0x94, 0xb1, 0xf4, 0xd2, 0x86, 0x6c, 0xf9, 0x19, 0x91, 0x88, 0xd9, 0x2b, + 0x4d, 0x3b, 0x0f, 0x2b, 0x41, 0x31, 0xfa, 0xe6, 0xf9, 0x70, 0x66, 0x78, + 0xbe, 0x20, 0x1a, 0xb7, 0xc8, 0x33, 0xd1, 0x34, 0x12, 0xe7, 0x4d, 0x05, + 0x2f, 0xe5, 0x86, 0xba, 0x48, 0x1c, 0xcb, 0xc4, 0xe0, 0x66, 0x19, 0xd8, + 0xe8, 0xbd, 0xba, 0x5e, 0x2b, 0xb1, 0x0c, 0xa1, 0xf0, 0x86, 0x79, 0xc9, + 0xa8, 0xa0, 0xb1, 0xab, 0xa9, 0xb9, 0xf5, 0xd0, 0xe4, 0xdb, 0xe2, 0x63, + 0x38, 0xdf, 0xf3, 0xb9, 0x96, 0xf8, 0x04, 0xbc, 0x7a, 0x50, 0xd4, 0x01, + 0x65, 0xcd, 0xae, 0xc6, 0x97, 0x64, 0x5f, 0x20, 0x47, 0xc1, 0x19, 0xa0, + 0xe2, 0x9e, 0xb2, 0x08, 0x95, 0x7d, 0xc0, 0x5d, 0xbd, 0x0f, 0xf8, 0x79, + 0x5a, 0xdc, 0x0a, 0x31, 0x11, 0xcf, 0x73, 0x4a, 0x8e, 0x86, 0x5c, 0x8e, + 0xa9, 0x24, 0x61, 0x3b, 0x89, 0xdb, 0xe2, 0x28, 0x39, 0x2a, 0xcc, 0xcb, + 0xd6, 0x85, 0xb6, 0x02, 0xf1, 0x83, 0xe7, 0x84, 0x72, 0x54, 0x4c, 0x1d, + 0x4e, 0xbc, 0xc8, 0x61, 0x1d, 0x6f, 0x26, 0x79, 0x03, 0x32, 0xec, 0x0e, + 0xfe, 0x3e, 0x2e, 0x59, 0x50, 0xdf, 0x8b, 0xf3, 0x1a, 0x09, 0x57, 0xcf, + 0x57, 0x29, 0xd8, 0x14, 0x33, 0x2c, 0x51, 0x80, 0x35, 0xe0, 0x55, 0x4a, + 0x60, 0xb7, 0x9b, 0xbd, 0x8c, 0xfa, 0x45, 0xae, 0x58, 0xc2, 0x84, 0x77, + 0x07, 0x1e, 0x83, 0x38, 0x81, 0x48, 0xcc, 0xdf, 0x9c, 0xa8, 0x3e, 0xa0, + 0x69, 0x8b, 0x6f, 0x04, 0xb5, 0x3a, 0xb1, 0xa7, 0x0a, 0x7a, 0x04, 0x52, + 0x45, 0xf9, 0x83, 0x2e, 0x51, 0x17, 0x62, 0x84, 0xcc, 0xba, 0x13, 0x2c, + 0x54, 0x22, 0x47, 0xff, 0xe9, 0xfc, 0xee, 0x59, 0xc7, 0xc6, 0x05, 0x0d, + 0xa8, 0xfe, 0x02, 0x26, 0xfb, 0xca, 0x5f, 0xb3, 0x13, 0x26, 0xc8, 0xb4, + 0xa1, 0x19, 0xd6, 0x22, 0x0b, 0xfd, 0xc7, 0x03, 0xa3, 0x98, 0xe5, 0xcd, + 0xef, 0x92, 0x35, 0xe4, 0xcb, 0x97, 0xff, 0x0f, 0x46, 0x6f, 0x78, 0x06, + 0xa2, 0xb5, 0x04, 0x00}; +z_const size_t kPhoneNumberMetaDataCompressedLength = + sizeof(kPhoneNumberMetaData); z_const size_t kPhoneNumberMetaDataExpandedLength = 308642; #endif // TESTING diff --git a/libPhoneNumber/NBMetadataHelper.h b/libPhoneNumber/NBMetadataHelper.h index 43e58c6..45e609c 100644 --- a/libPhoneNumber/NBMetadataHelper.h +++ b/libPhoneNumber/NBMetadataHelper.h @@ -9,7 +9,6 @@ #import #import "NBPhoneNumberDefines.h" - @class NBPhoneMetaData; @interface NBMetadataHelper : NSObject diff --git a/libPhoneNumber/NBMetadataHelper.m b/libPhoneNumber/NBMetadataHelper.m index eab2bb7..903a40d 100644 --- a/libPhoneNumber/NBMetadataHelper.m +++ b/libPhoneNumber/NBMetadataHelper.m @@ -7,9 +7,8 @@ // #import "NBMetadataHelper.h" -#import "NBPhoneMetaData.h" #import "NBGeneratedPhoneNumberMetaData.h" - +#import "NBPhoneMetaData.h" @interface NBMetadataHelper () @@ -23,14 +22,14 @@ static NSString *StringByTrimming(NSString *aString) { static dispatch_once_t onceToken; static NSCharacterSet *whitespaceCharSet = nil; dispatch_once(&onceToken, ^{ - NSMutableCharacterSet *spaceCharSet = [NSMutableCharacterSet characterSetWithCharactersInString:NB_NON_BREAKING_SPACE]; + NSMutableCharacterSet *spaceCharSet = + [NSMutableCharacterSet characterSetWithCharactersInString:NB_NON_BREAKING_SPACE]; [spaceCharSet formUnionWithCharacterSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; whitespaceCharSet = spaceCharSet; }); return [aString stringByTrimmingCharactersInSet:whitespaceCharSet]; } - @implementation NBMetadataHelper /* @@ -40,108 +39,106 @@ static NSString *StringByTrimming(NSString *aString) { Ref. site (countrycode.org) */ + (NSDictionary *)phoneNumberDataMap { - static NSDictionary *phoneNumberDataDictionary; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - // Data is a gzipped JSON file that is embedded in the binary. - // See GeneratePhoneNumberHeader.sh and PhoneNumberMetaData.h for details. - NSMutableData* gunzippedData = [NSMutableData dataWithLength:kPhoneNumberMetaDataExpandedLength]; + static NSDictionary *phoneNumberDataDictionary; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + // Data is a gzipped JSON file that is embedded in the binary. + // See GeneratePhoneNumberHeader.sh and PhoneNumberMetaData.h for details. + NSMutableData *gunzippedData = + [NSMutableData dataWithLength:kPhoneNumberMetaDataExpandedLength]; - z_stream zStream; - memset(&zStream, 0, sizeof(zStream)); - __attribute((unused)) int err = inflateInit2(&zStream, 16); - NSAssert(err == Z_OK, @"Unable to init stream. err = %d", err); + z_stream zStream; + memset(&zStream, 0, sizeof(zStream)); + __attribute((unused)) int err = inflateInit2(&zStream, 16); + NSAssert(err == Z_OK, @"Unable to init stream. err = %d", err); - zStream.next_in = kPhoneNumberMetaData; - zStream.avail_in = (uint)kPhoneNumberMetaDataCompressedLength; - zStream.next_out = (Bytef *)gunzippedData.bytes; - zStream.avail_out = (uint)gunzippedData.length; + zStream.next_in = kPhoneNumberMetaData; + zStream.avail_in = (uint)kPhoneNumberMetaDataCompressedLength; + zStream.next_out = (Bytef *)gunzippedData.bytes; + zStream.avail_out = (uint)gunzippedData.length; - err = inflate(&zStream, Z_FINISH); - NSAssert(err == Z_STREAM_END, @"Unable to inflate compressed data. err = %d", err); + err = inflate(&zStream, Z_FINISH); + NSAssert(err == Z_STREAM_END, @"Unable to inflate compressed data. err = %d", err); - err = inflateEnd(&zStream); - NSAssert(err == Z_OK, @"Unable to inflate compressed data. err = %d", err); + err = inflateEnd(&zStream); + NSAssert(err == Z_OK, @"Unable to inflate compressed data. err = %d", err); - NSError *error = nil; - phoneNumberDataDictionary = [NSJSONSerialization JSONObjectWithData:gunzippedData - options:0 - error:&error]; - NSAssert(error == nil, @"Unable to convert JSON - %@", error); - }); - return phoneNumberDataDictionary; + NSError *error = nil; + phoneNumberDataDictionary = + [NSJSONSerialization JSONObjectWithData:gunzippedData options:0 error:&error]; + NSAssert(error == nil, @"Unable to convert JSON - %@", error); + }); + return phoneNumberDataDictionary; } + (NSDictionary *)CCode2CNMap { - static NSMutableDictionary *mapCCode2CN; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - NSDictionary *countryCodeToRegionCodeMap = [self CN2CCodeMap]; - mapCCode2CN = [[NSMutableDictionary alloc] init]; - for (NSString *countryCode in countryCodeToRegionCodeMap) { - NSArray *regionCodes = countryCodeToRegionCodeMap[countryCode]; - for (NSString *regionCode in regionCodes) { - mapCCode2CN[regionCode] = countryCode; - } - } - }); - return mapCCode2CN; + static NSMutableDictionary *mapCCode2CN; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSDictionary *countryCodeToRegionCodeMap = [self CN2CCodeMap]; + mapCCode2CN = [[NSMutableDictionary alloc] init]; + for (NSString *countryCode in countryCodeToRegionCodeMap) { + NSArray *regionCodes = countryCodeToRegionCodeMap[countryCode]; + for (NSString *regionCode in regionCodes) { + mapCCode2CN[regionCode] = countryCode; + } + } + }); + return mapCCode2CN; } -+(NSDictionary *)CN2CCodeMap { - return [self phoneNumberDataMap][@"countryCodeToRegionCodeMap"]; ++ (NSDictionary *)CN2CCodeMap { + return [self phoneNumberDataMap][@"countryCodeToRegionCodeMap"]; } -- (NSArray*)getAllMetadata -{ - NSArray *countryCodes = [NSLocale ISOCountryCodes]; - NSMutableArray *resultMetadata = [[NSMutableArray alloc] initWithCapacity:countryCodes.count]; +- (NSArray *)getAllMetadata { + NSArray *countryCodes = [NSLocale ISOCountryCodes]; + NSMutableArray *resultMetadata = [[NSMutableArray alloc] initWithCapacity:countryCodes.count]; - for (NSString *countryCode in countryCodes) { - id countryDictionaryInstance = [NSDictionary dictionaryWithObject:countryCode forKey:NSLocaleCountryCode]; - NSString *identifier = [NSLocale localeIdentifierFromComponents:countryDictionaryInstance]; - NSString *country = [[NSLocale currentLocale] displayNameForKey:NSLocaleIdentifier value:identifier]; + for (NSString *countryCode in countryCodes) { + id countryDictionaryInstance = + [NSDictionary dictionaryWithObject:countryCode forKey:NSLocaleCountryCode]; + NSString *identifier = [NSLocale localeIdentifierFromComponents:countryDictionaryInstance]; + NSString *country = + [[NSLocale currentLocale] displayNameForKey:NSLocaleIdentifier value:identifier]; - NSMutableDictionary *countryMeta = [[NSMutableDictionary alloc] init]; - if (country) { - [countryMeta setObject:country forKey:@"name"]; - } else { - NSString *systemCountry = [[NSLocale systemLocale] displayNameForKey:NSLocaleIdentifier value:identifier]; - if (systemCountry) { - [countryMeta setObject:systemCountry forKey:@"name"]; - } - } - - if (countryCode) { - [countryMeta setObject:countryCode forKey:@"code"]; - } - - NBPhoneMetaData *metaData = [self getMetadataForRegion:countryCode]; - if (metaData) { - [countryMeta setObject:metaData forKey:@"metadata"]; - } - - [resultMetadata addObject:countryMeta]; + NSMutableDictionary *countryMeta = [[NSMutableDictionary alloc] init]; + if (country) { + [countryMeta setObject:country forKey:@"name"]; + } else { + NSString *systemCountry = + [[NSLocale systemLocale] displayNameForKey:NSLocaleIdentifier value:identifier]; + if (systemCountry) { + [countryMeta setObject:systemCountry forKey:@"name"]; + } } - return resultMetadata; -} - - -+ (NSArray *)regionCodeFromCountryCode:(NSNumber *)countryCodeNumber -{ - NSArray *res = [self CN2CCodeMap][[countryCodeNumber stringValue]]; - if ([res isKindOfClass:[NSArray class]] && [res count] > 0) { - return res; + if (countryCode) { + [countryMeta setObject:countryCode forKey:@"code"]; } - return nil; + NBPhoneMetaData *metaData = [self getMetadataForRegion:countryCode]; + if (metaData) { + [countryMeta setObject:metaData forKey:@"metadata"]; + } + + [resultMetadata addObject:countryMeta]; + } + + return resultMetadata; } ++ (NSArray *)regionCodeFromCountryCode:(NSNumber *)countryCodeNumber { + NSArray *res = [self CN2CCodeMap][[countryCodeNumber stringValue]]; + if ([res isKindOfClass:[NSArray class]] && [res count] > 0) { + return res; + } -+ (NSString *)countryCodeFromRegionCode:(NSString* )regionCode -{ - return [self CCode2CNMap][regionCode]; + return nil; +} + ++ (NSString *)countryCodeFromRegionCode:(NSString *)regionCode { + return [self CCode2CNMap][regionCode]; } /** @@ -151,44 +148,40 @@ static NSString *StringByTrimming(NSString *aString) { * @param {?string} regionCode * @return {i18n.phonenumbers.PhoneMetadata} */ -- (NBPhoneMetaData *)getMetadataForRegion:(NSString *)regionCode -{ - regionCode = StringByTrimming(regionCode); - if (regionCode.length == 0) { - return nil; - } - - regionCode = [regionCode uppercaseString]; - - if ([_cachedMetaDataKey isEqualToString:regionCode]) { - return _cachedMetaData; - } - - NSDictionary *dict = [[self class] phoneNumberDataMap][@"countryToMetadata"]; - NSArray *entry = dict[regionCode]; - if (entry) { - NBPhoneMetaData *metadata = [[NBPhoneMetaData alloc] initWithEntry:entry]; - _cachedMetaData = metadata; - _cachedMetaDataKey = regionCode; - return metadata; - } - +- (NBPhoneMetaData *)getMetadataForRegion:(NSString *)regionCode { + regionCode = StringByTrimming(regionCode); + if (regionCode.length == 0) { return nil; -} + } + regionCode = [regionCode uppercaseString]; + + if ([_cachedMetaDataKey isEqualToString:regionCode]) { + return _cachedMetaData; + } + + NSDictionary *dict = [[self class] phoneNumberDataMap][@"countryToMetadata"]; + NSArray *entry = dict[regionCode]; + if (entry) { + NBPhoneMetaData *metadata = [[NBPhoneMetaData alloc] initWithEntry:entry]; + _cachedMetaData = metadata; + _cachedMetaDataKey = regionCode; + return metadata; + } + + return nil; +} /** * @param countryCallingCode countryCallingCode * @return {i18n.phonenumbers.PhoneMetadata} */ -- (NBPhoneMetaData *)getMetadataForNonGeographicalRegion:(NSNumber *)countryCallingCode -{ - NSString *countryCallingCodeStr = countryCallingCode.stringValue; - return [self getMetadataForRegion:countryCallingCodeStr]; +- (NBPhoneMetaData *)getMetadataForNonGeographicalRegion:(NSNumber *)countryCallingCode { + NSString *countryCallingCodeStr = countryCallingCode.stringValue; + return [self getMetadataForRegion:countryCallingCodeStr]; } -+ (BOOL)hasValue:(NSString*)string -{ ++ (BOOL)hasValue:(NSString *)string { string = StringByTrimming(string); return string.length != 0; } diff --git a/libPhoneNumber/NBNumberFormat.h b/libPhoneNumber/NBNumberFormat.h old mode 100755 new mode 100644 index 97e815f..db0445b --- a/libPhoneNumber/NBNumberFormat.h +++ b/libPhoneNumber/NBNumberFormat.h @@ -6,18 +6,22 @@ #import - @interface NBNumberFormat : NSObject // from phonemetadata.pb.js -/* 1 */ @property (nonatomic, strong) NSString *pattern; -/* 2 */ @property (nonatomic, strong) NSString *format; -/* 3 */ @property (nonatomic, strong) NSArray *leadingDigitsPatterns; -/* 4 */ @property (nonatomic, strong) NSString *nationalPrefixFormattingRule; -/* 6 */ @property (nonatomic, assign) BOOL nationalPrefixOptionalWhenFormatting; -/* 5 */ @property (nonatomic, strong) NSString *domesticCarrierCodeFormattingRule; +/* 1 */ @property(nonatomic, strong) NSString *pattern; +/* 2 */ @property(nonatomic, strong) NSString *format; +/* 3 */ @property(nonatomic, strong) NSArray *leadingDigitsPatterns; +/* 4 */ @property(nonatomic, strong) NSString *nationalPrefixFormattingRule; +/* 6 */ @property(nonatomic, assign) BOOL nationalPrefixOptionalWhenFormatting; +/* 5 */ @property(nonatomic, strong) NSString *domesticCarrierCodeFormattingRule; -- (instancetype)initWithPattern:(NSString *)pattern withFormat:(NSString *)format withLeadingDigitsPatterns:(NSArray *)leadingDigitsPatterns withNationalPrefixFormattingRule:(NSString *)nationalPrefixFormattingRule whenFormatting:(BOOL)nationalPrefixOptionalWhenFormatting withDomesticCarrierCodeFormattingRule:(NSString *)domesticCarrierCodeFormattingRule; +- (instancetype)initWithPattern:(NSString *)pattern + withFormat:(NSString *)format + withLeadingDigitsPatterns:(NSArray *)leadingDigitsPatterns + withNationalPrefixFormattingRule:(NSString *)nationalPrefixFormattingRule + whenFormatting:(BOOL)nationalPrefixOptionalWhenFormatting + withDomesticCarrierCodeFormattingRule:(NSString *)domesticCarrierCodeFormattingRule; - (instancetype)initWithEntry:(NSArray *)entry; @end diff --git a/libPhoneNumber/NBNumberFormat.m b/libPhoneNumber/NBNumberFormat.m old mode 100755 new mode 100644 index 5768734..fdb7240 --- a/libPhoneNumber/NBNumberFormat.m +++ b/libPhoneNumber/NBNumberFormat.m @@ -9,82 +9,86 @@ @implementation NBNumberFormat - -- (instancetype)initWithPattern:(NSString *)pattern withFormat:(NSString *)format withLeadingDigitsPatterns:(NSArray *)leadingDigitsPatterns withNationalPrefixFormattingRule:(NSString *)nationalPrefixFormattingRule whenFormatting:(BOOL)nationalPrefixOptionalWhenFormatting withDomesticCarrierCodeFormattingRule:(NSString *)domesticCarrierCodeFormattingRule -{ - self = [super init]; - if (self) { - _pattern = pattern; - _format = format; - _leadingDigitsPatterns = leadingDigitsPatterns; - _nationalPrefixFormattingRule = nationalPrefixFormattingRule; - _nationalPrefixOptionalWhenFormatting = nationalPrefixOptionalWhenFormatting; - _domesticCarrierCodeFormattingRule = domesticCarrierCodeFormattingRule; - } - return self; +- (instancetype)initWithPattern:(NSString *)pattern + withFormat:(NSString *)format + withLeadingDigitsPatterns:(NSArray *)leadingDigitsPatterns + withNationalPrefixFormattingRule:(NSString *)nationalPrefixFormattingRule + whenFormatting:(BOOL)nationalPrefixOptionalWhenFormatting + withDomesticCarrierCodeFormattingRule:(NSString *)domesticCarrierCodeFormattingRule { + self = [super init]; + if (self) { + _pattern = pattern; + _format = format; + _leadingDigitsPatterns = leadingDigitsPatterns; + _nationalPrefixFormattingRule = nationalPrefixFormattingRule; + _nationalPrefixOptionalWhenFormatting = nationalPrefixOptionalWhenFormatting; + _domesticCarrierCodeFormattingRule = domesticCarrierCodeFormattingRule; + } + return self; } -- (instancetype)initWithEntry:(NSArray *)entry -{ - self = [super init]; - if (self && entry != nil) { - _pattern = [entry nb_safeStringAtIndex:1]; - _format = [entry nb_safeStringAtIndex:2]; - _leadingDigitsPatterns = [entry nb_safeArrayAtIndex:3]; - _nationalPrefixFormattingRule = [entry nb_safeStringAtIndex:4]; - _nationalPrefixOptionalWhenFormatting = [[entry nb_safeNumberAtIndex:6] boolValue]; - _domesticCarrierCodeFormattingRule = [entry nb_safeStringAtIndex:5]; - } - return self; +- (instancetype)initWithEntry:(NSArray *)entry { + self = [super init]; + if (self && entry != nil) { + _pattern = [entry nb_safeStringAtIndex:1]; + _format = [entry nb_safeStringAtIndex:2]; + _leadingDigitsPatterns = [entry nb_safeArrayAtIndex:3]; + _nationalPrefixFormattingRule = [entry nb_safeStringAtIndex:4]; + _nationalPrefixOptionalWhenFormatting = [[entry nb_safeNumberAtIndex:6] boolValue]; + _domesticCarrierCodeFormattingRule = [entry nb_safeStringAtIndex:5]; + } + return self; } -- (NSString *)description -{ - return [NSString stringWithFormat:@"[pattern:%@, format:%@, leadingDigitsPattern:%@, nationalPrefixFormattingRule:%@, nationalPrefixOptionalWhenFormatting:%@, domesticCarrierCodeFormattingRule:%@]", - self.pattern, self.format, self.leadingDigitsPatterns, self.nationalPrefixFormattingRule, self.nationalPrefixOptionalWhenFormatting?@"Y":@"N", self.domesticCarrierCodeFormattingRule]; +- (NSString *)description { + return [NSString + stringWithFormat: + @"[pattern:%@, format:%@, leadingDigitsPattern:%@, nationalPrefixFormattingRule:%@, " + @"nationalPrefixOptionalWhenFormatting:%@, domesticCarrierCodeFormattingRule:%@]", + self.pattern, self.format, self.leadingDigitsPatterns, self.nationalPrefixFormattingRule, + self.nationalPrefixOptionalWhenFormatting ? @"Y" : @"N", + self.domesticCarrierCodeFormattingRule]; } - -- (id)copyWithZone:(NSZone *)zone -{ - return [[NBNumberFormat alloc] initWithPattern:self.pattern - withFormat:self.format - withLeadingDigitsPatterns:self.leadingDigitsPatterns - withNationalPrefixFormattingRule:self.nationalPrefixFormattingRule - whenFormatting:self.nationalPrefixOptionalWhenFormatting - withDomesticCarrierCodeFormattingRule:self.domesticCarrierCodeFormattingRule]; +- (id)copyWithZone:(NSZone *)zone { + return [[NBNumberFormat alloc] initWithPattern:self.pattern + withFormat:self.format + withLeadingDigitsPatterns:self.leadingDigitsPatterns + withNationalPrefixFormattingRule:self.nationalPrefixFormattingRule + whenFormatting:self.nationalPrefixOptionalWhenFormatting + withDomesticCarrierCodeFormattingRule:self.domesticCarrierCodeFormattingRule]; } - #ifdef NB_USE_EXTENSIONS // We believe these methods are unused. // If you would like them back (not behind a flag) please file a bug with a reason for needing // them. -- (instancetype)initWithCoder:(NSCoder*)coder -{ - if (self = [super init]) { - _pattern = [coder decodeObjectForKey:@"pattern"]; - _format = [coder decodeObjectForKey:@"format"]; - _leadingDigitsPatterns = [coder decodeObjectForKey:@"leadingDigitsPatterns"]; - _nationalPrefixFormattingRule = [coder decodeObjectForKey:@"nationalPrefixFormattingRule"]; - _nationalPrefixOptionalWhenFormatting = [[coder decodeObjectForKey:@"nationalPrefixOptionalWhenFormatting"] boolValue]; - _domesticCarrierCodeFormattingRule = [coder decodeObjectForKey:@"domesticCarrierCodeFormattingRule"]; - } - return self; +- (instancetype)initWithCoder:(NSCoder *)coder { + if (self = [super init]) { + _pattern = [coder decodeObjectForKey:@"pattern"]; + _format = [coder decodeObjectForKey:@"format"]; + _leadingDigitsPatterns = [coder decodeObjectForKey:@"leadingDigitsPatterns"]; + _nationalPrefixFormattingRule = [coder decodeObjectForKey:@"nationalPrefixFormattingRule"]; + _nationalPrefixOptionalWhenFormatting = + [[coder decodeObjectForKey:@"nationalPrefixOptionalWhenFormatting"] boolValue]; + _domesticCarrierCodeFormattingRule = + [coder decodeObjectForKey:@"domesticCarrierCodeFormattingRule"]; + } + return self; } - -- (void)encodeWithCoder:(NSCoder*)coder -{ - [coder encodeObject:self.pattern forKey:@"pattern"]; - [coder encodeObject:self.format forKey:@"format"]; - [coder encodeObject:self.leadingDigitsPatterns forKey:@"leadingDigitsPatterns"]; - [coder encodeObject:self.nationalPrefixFormattingRule forKey:@"nationalPrefixFormattingRule"]; - [coder encodeObject:[NSNumber numberWithBool:self.nationalPrefixOptionalWhenFormatting] forKey:@"nationalPrefixOptionalWhenFormatting"]; - [coder encodeObject:self.domesticCarrierCodeFormattingRule forKey:@"domesticCarrierCodeFormattingRule"]; +- (void)encodeWithCoder:(NSCoder *)coder { + [coder encodeObject:self.pattern forKey:@"pattern"]; + [coder encodeObject:self.format forKey:@"format"]; + [coder encodeObject:self.leadingDigitsPatterns forKey:@"leadingDigitsPatterns"]; + [coder encodeObject:self.nationalPrefixFormattingRule forKey:@"nationalPrefixFormattingRule"]; + [coder encodeObject:[NSNumber numberWithBool:self.nationalPrefixOptionalWhenFormatting] + forKey:@"nationalPrefixOptionalWhenFormatting"]; + [coder encodeObject:self.domesticCarrierCodeFormattingRule + forKey:@"domesticCarrierCodeFormattingRule"]; } -#endif // NB_USE_EXTENSIONS +#endif // NB_USE_EXTENSIONS @end diff --git a/libPhoneNumber/NBPhoneMetaData.h b/libPhoneNumber/NBPhoneMetaData.h old mode 100755 new mode 100644 index 43dd777..451c5df --- a/libPhoneNumber/NBPhoneMetaData.h +++ b/libPhoneNumber/NBPhoneMetaData.h @@ -6,39 +6,38 @@ #import - @class NBPhoneNumberDesc, NBNumberFormat; @interface NBPhoneMetaData : NSObject // from phonemetadata.pb.js -/* 1 */ @property (nonatomic, strong) NBPhoneNumberDesc *generalDesc; -/* 2 */ @property (nonatomic, strong) NBPhoneNumberDesc *fixedLine; -/* 3 */ @property (nonatomic, strong) NBPhoneNumberDesc *mobile; -/* 4 */ @property (nonatomic, strong) NBPhoneNumberDesc *tollFree; -/* 5 */ @property (nonatomic, strong) NBPhoneNumberDesc *premiumRate; -/* 6 */ @property (nonatomic, strong) NBPhoneNumberDesc *sharedCost; -/* 7 */ @property (nonatomic, strong) NBPhoneNumberDesc *personalNumber; -/* 8 */ @property (nonatomic, strong) NBPhoneNumberDesc *voip; -/* 21 */ @property (nonatomic, strong) NBPhoneNumberDesc *pager; -/* 25 */ @property (nonatomic, strong) NBPhoneNumberDesc *uan; -/* 27 */ @property (nonatomic, strong) NBPhoneNumberDesc *emergency; -/* 28 */ @property (nonatomic, strong) NBPhoneNumberDesc *voicemail; -/* 24 */ @property (nonatomic, strong) NBPhoneNumberDesc *noInternationalDialling; -/* 9 */ @property (nonatomic, strong) NSString *codeID; -/* 10 */ @property (nonatomic, strong) NSNumber *countryCode; -/* 11 */ @property (nonatomic, strong) NSString *internationalPrefix; -/* 17 */ @property (nonatomic, strong) NSString *preferredInternationalPrefix; -/* 12 */ @property (nonatomic, strong) NSString *nationalPrefix; -/* 13 */ @property (nonatomic, strong) NSString *preferredExtnPrefix; -/* 15 */ @property (nonatomic, strong) NSString *nationalPrefixForParsing; -/* 16 */ @property (nonatomic, strong) NSString *nationalPrefixTransformRule; -/* 18 */ @property (nonatomic, assign) BOOL sameMobileAndFixedLinePattern; -/* 19 */ @property (nonatomic, strong) NSArray *numberFormats; -/* 20 */ @property (nonatomic, strong) NSArray *intlNumberFormats; -/* 22 */ @property (nonatomic, assign) BOOL mainCountryForCode; -/* 23 */ @property (nonatomic, strong) NSString *leadingDigits; -/* 26 */ @property (nonatomic, assign) BOOL leadingZeroPossible; +/* 1 */ @property(nonatomic, strong) NBPhoneNumberDesc *generalDesc; +/* 2 */ @property(nonatomic, strong) NBPhoneNumberDesc *fixedLine; +/* 3 */ @property(nonatomic, strong) NBPhoneNumberDesc *mobile; +/* 4 */ @property(nonatomic, strong) NBPhoneNumberDesc *tollFree; +/* 5 */ @property(nonatomic, strong) NBPhoneNumberDesc *premiumRate; +/* 6 */ @property(nonatomic, strong) NBPhoneNumberDesc *sharedCost; +/* 7 */ @property(nonatomic, strong) NBPhoneNumberDesc *personalNumber; +/* 8 */ @property(nonatomic, strong) NBPhoneNumberDesc *voip; +/* 21 */ @property(nonatomic, strong) NBPhoneNumberDesc *pager; +/* 25 */ @property(nonatomic, strong) NBPhoneNumberDesc *uan; +/* 27 */ @property(nonatomic, strong) NBPhoneNumberDesc *emergency; +/* 28 */ @property(nonatomic, strong) NBPhoneNumberDesc *voicemail; +/* 24 */ @property(nonatomic, strong) NBPhoneNumberDesc *noInternationalDialling; +/* 9 */ @property(nonatomic, strong) NSString *codeID; +/* 10 */ @property(nonatomic, strong) NSNumber *countryCode; +/* 11 */ @property(nonatomic, strong) NSString *internationalPrefix; +/* 17 */ @property(nonatomic, strong) NSString *preferredInternationalPrefix; +/* 12 */ @property(nonatomic, strong) NSString *nationalPrefix; +/* 13 */ @property(nonatomic, strong) NSString *preferredExtnPrefix; +/* 15 */ @property(nonatomic, strong) NSString *nationalPrefixForParsing; +/* 16 */ @property(nonatomic, strong) NSString *nationalPrefixTransformRule; +/* 18 */ @property(nonatomic, assign) BOOL sameMobileAndFixedLinePattern; +/* 19 */ @property(nonatomic, strong) NSArray *numberFormats; +/* 20 */ @property(nonatomic, strong) NSArray *intlNumberFormats; +/* 22 */ @property(nonatomic, assign) BOOL mainCountryForCode; +/* 23 */ @property(nonatomic, strong) NSString *leadingDigits; +/* 26 */ @property(nonatomic, assign) BOOL leadingZeroPossible; - (instancetype)initWithEntry:(NSArray *)entry; @end diff --git a/libPhoneNumber/NBPhoneMetaData.m b/libPhoneNumber/NBPhoneMetaData.m old mode 100755 new mode 100644 index af0a8d6..2d8de81 --- a/libPhoneNumber/NBPhoneMetaData.m +++ b/libPhoneNumber/NBPhoneMetaData.m @@ -5,79 +5,90 @@ // #import "NBPhoneMetaData.h" -#import "NBPhoneNumberDesc.h" #import "NBNumberFormat.h" +#import "NBPhoneNumberDesc.h" #import "NSArray+NBAdditions.h" - @implementation NBPhoneMetaData +- (instancetype)init { + self = [super init]; -- (instancetype)init -{ - self = [super init]; + if (self) { + _numberFormats = [[NSMutableArray alloc] init]; + _intlNumberFormats = [[NSMutableArray alloc] init]; - if (self) { - _numberFormats = [[NSMutableArray alloc] init]; - _intlNumberFormats = [[NSMutableArray alloc] init]; + _leadingZeroPossible = NO; + _mainCountryForCode = NO; + _sameMobileAndFixedLinePattern = NO; + _internationalPrefix = @"NA"; + } - _leadingZeroPossible = NO; - _mainCountryForCode = NO; - _sameMobileAndFixedLinePattern = NO; - _internationalPrefix = @"NA"; - } - - return self; + return self; } - (instancetype)initWithEntry:(NSArray *)entry { - self = [super init]; - if (self && entry != nil) { - _generalDesc = [[NBPhoneNumberDesc alloc] initWithEntry:[entry nb_safeArrayAtIndex:1]]; - _fixedLine = [[NBPhoneNumberDesc alloc] initWithEntry:[entry nb_safeArrayAtIndex:2]]; - _mobile = [[NBPhoneNumberDesc alloc] initWithEntry:[entry nb_safeArrayAtIndex:3]]; - _tollFree = [[NBPhoneNumberDesc alloc] initWithEntry:[entry nb_safeArrayAtIndex:4]]; - _premiumRate = [[NBPhoneNumberDesc alloc] initWithEntry:[entry nb_safeArrayAtIndex:5]]; - _sharedCost = [[NBPhoneNumberDesc alloc] initWithEntry:[entry nb_safeArrayAtIndex:6]]; - _personalNumber = [[NBPhoneNumberDesc alloc] initWithEntry:[entry nb_safeArrayAtIndex:7]]; - _voip = [[NBPhoneNumberDesc alloc] initWithEntry:[entry nb_safeArrayAtIndex:8]]; - _pager = [[NBPhoneNumberDesc alloc] initWithEntry:[entry nb_safeArrayAtIndex:21]]; - _uan = [[NBPhoneNumberDesc alloc] initWithEntry:[entry nb_safeArrayAtIndex:25]]; - _emergency = [[NBPhoneNumberDesc alloc] initWithEntry:[entry nb_safeArrayAtIndex:27]]; - _voicemail = [[NBPhoneNumberDesc alloc] initWithEntry:[entry nb_safeArrayAtIndex:28]]; - _noInternationalDialling = [[NBPhoneNumberDesc alloc] initWithEntry:[entry nb_safeArrayAtIndex:24]]; - _codeID = [entry nb_safeStringAtIndex:9]; - _countryCode = [entry nb_safeNumberAtIndex:10]; - _internationalPrefix = [entry nb_safeStringAtIndex:11]; - _preferredInternationalPrefix = [entry nb_safeStringAtIndex:17]; - _nationalPrefix = [entry nb_safeStringAtIndex:12]; - _preferredExtnPrefix = [entry nb_safeStringAtIndex:13]; - _nationalPrefixForParsing = [entry nb_safeStringAtIndex:15]; - _nationalPrefixTransformRule = [entry nb_safeStringAtIndex:16]; - _sameMobileAndFixedLinePattern = [[entry nb_safeNumberAtIndex:18] boolValue]; - _numberFormats= [self numberFormatsFromEntry:[entry nb_safeArrayAtIndex:19]]; - _intlNumberFormats = [self numberFormatsFromEntry:[entry nb_safeArrayAtIndex:20]]; - _mainCountryForCode = [[entry nb_safeNumberAtIndex:22] boolValue]; - _leadingDigits = [entry nb_safeStringAtIndex:23]; - _leadingZeroPossible = [[entry nb_safeNumberAtIndex:26] boolValue]; - } + self = [super init]; + if (self && entry != nil) { + _generalDesc = [[NBPhoneNumberDesc alloc] initWithEntry:[entry nb_safeArrayAtIndex:1]]; + _fixedLine = [[NBPhoneNumberDesc alloc] initWithEntry:[entry nb_safeArrayAtIndex:2]]; + _mobile = [[NBPhoneNumberDesc alloc] initWithEntry:[entry nb_safeArrayAtIndex:3]]; + _tollFree = [[NBPhoneNumberDesc alloc] initWithEntry:[entry nb_safeArrayAtIndex:4]]; + _premiumRate = [[NBPhoneNumberDesc alloc] initWithEntry:[entry nb_safeArrayAtIndex:5]]; + _sharedCost = [[NBPhoneNumberDesc alloc] initWithEntry:[entry nb_safeArrayAtIndex:6]]; + _personalNumber = [[NBPhoneNumberDesc alloc] initWithEntry:[entry nb_safeArrayAtIndex:7]]; + _voip = [[NBPhoneNumberDesc alloc] initWithEntry:[entry nb_safeArrayAtIndex:8]]; + _pager = [[NBPhoneNumberDesc alloc] initWithEntry:[entry nb_safeArrayAtIndex:21]]; + _uan = [[NBPhoneNumberDesc alloc] initWithEntry:[entry nb_safeArrayAtIndex:25]]; + _emergency = [[NBPhoneNumberDesc alloc] initWithEntry:[entry nb_safeArrayAtIndex:27]]; + _voicemail = [[NBPhoneNumberDesc alloc] initWithEntry:[entry nb_safeArrayAtIndex:28]]; + _noInternationalDialling = + [[NBPhoneNumberDesc alloc] initWithEntry:[entry nb_safeArrayAtIndex:24]]; + _codeID = [entry nb_safeStringAtIndex:9]; + _countryCode = [entry nb_safeNumberAtIndex:10]; + _internationalPrefix = [entry nb_safeStringAtIndex:11]; + _preferredInternationalPrefix = [entry nb_safeStringAtIndex:17]; + _nationalPrefix = [entry nb_safeStringAtIndex:12]; + _preferredExtnPrefix = [entry nb_safeStringAtIndex:13]; + _nationalPrefixForParsing = [entry nb_safeStringAtIndex:15]; + _nationalPrefixTransformRule = [entry nb_safeStringAtIndex:16]; + _sameMobileAndFixedLinePattern = [[entry nb_safeNumberAtIndex:18] boolValue]; + _numberFormats = [self numberFormatsFromEntry:[entry nb_safeArrayAtIndex:19]]; + _intlNumberFormats = [self numberFormatsFromEntry:[entry nb_safeArrayAtIndex:20]]; + _mainCountryForCode = [[entry nb_safeNumberAtIndex:22] boolValue]; + _leadingDigits = [entry nb_safeStringAtIndex:23]; + _leadingZeroPossible = [[entry nb_safeNumberAtIndex:26] boolValue]; + } - return self; + return self; } - (NSArray *)numberFormatsFromEntry:(NSArray *)entry { - NSMutableArray *formats = [NSMutableArray arrayWithCapacity:entry.count]; - for (NSArray *format in entry) { - NBNumberFormat *numberFormat = [[NBNumberFormat alloc] initWithEntry:format]; - [formats addObject:numberFormat]; - } - return formats; + NSMutableArray *formats = [NSMutableArray arrayWithCapacity:entry.count]; + for (NSArray *format in entry) { + NBNumberFormat *numberFormat = [[NBNumberFormat alloc] initWithEntry:format]; + [formats addObject:numberFormat]; + } + return formats; } -- (NSString *)description -{ - return [NSString stringWithFormat:@"* codeID[%@] countryCode[%@] generalDesc[%@] fixedLine[%@] mobile[%@] tollFree[%@] premiumRate[%@] sharedCost[%@] personalNumber[%@] voip[%@] pager[%@] uan[%@] emergency[%@] voicemail[%@] noInternationalDialling[%@] internationalPrefix[%@] preferredInternationalPrefix[%@] nationalPrefix[%@] preferredExtnPrefix[%@] nationalPrefixForParsing[%@] nationalPrefixTransformRule[%@] sameMobileAndFixedLinePattern[%@] numberFormats[%@] intlNumberFormats[%@] mainCountryForCode[%@] leadingDigits[%@] leadingZeroPossible[%@]", - _codeID, _countryCode, _generalDesc, _fixedLine, _mobile, _tollFree, _premiumRate, _sharedCost, _personalNumber, _voip, _pager, _uan, _emergency, _voicemail, _noInternationalDialling, _internationalPrefix, _preferredInternationalPrefix, _nationalPrefix, _preferredExtnPrefix, _nationalPrefixForParsing, _nationalPrefixTransformRule, _sameMobileAndFixedLinePattern?@"Y":@"N", _numberFormats, _intlNumberFormats, _mainCountryForCode?@"Y":@"N", _leadingDigits, _leadingZeroPossible?@"Y":@"N"]; +- (NSString *)description { + return [NSString + stringWithFormat: + @"* codeID[%@] countryCode[%@] generalDesc[%@] fixedLine[%@] mobile[%@] tollFree[%@] " + @"premiumRate[%@] sharedCost[%@] personalNumber[%@] voip[%@] pager[%@] uan[%@] " + @"emergency[%@] voicemail[%@] noInternationalDialling[%@] internationalPrefix[%@] " + @"preferredInternationalPrefix[%@] nationalPrefix[%@] preferredExtnPrefix[%@] " + @"nationalPrefixForParsing[%@] nationalPrefixTransformRule[%@] " + @"sameMobileAndFixedLinePattern[%@] numberFormats[%@] intlNumberFormats[%@] " + @"mainCountryForCode[%@] leadingDigits[%@] leadingZeroPossible[%@]", + _codeID, _countryCode, _generalDesc, _fixedLine, _mobile, _tollFree, _premiumRate, + _sharedCost, _personalNumber, _voip, _pager, _uan, _emergency, _voicemail, + _noInternationalDialling, _internationalPrefix, _preferredInternationalPrefix, + _nationalPrefix, _preferredExtnPrefix, _nationalPrefixForParsing, + _nationalPrefixTransformRule, _sameMobileAndFixedLinePattern ? @"Y" : @"N", + _numberFormats, _intlNumberFormats, _mainCountryForCode ? @"Y" : @"N", _leadingDigits, + _leadingZeroPossible ? @"Y" : @"N"]; } #ifdef NB_USE_EXTENSIONS @@ -85,72 +96,71 @@ // If you would like them back (not behind a flag) please file a bug with a reason for needing // them. -- (instancetype)initWithCoder:(NSCoder*)coder -{ - if (self = [super init]) { - _generalDesc = [coder decodeObjectForKey:@"generalDesc"]; - _fixedLine = [coder decodeObjectForKey:@"fixedLine"]; - _mobile = [coder decodeObjectForKey:@"mobile"]; - _tollFree = [coder decodeObjectForKey:@"tollFree"]; - _premiumRate = [coder decodeObjectForKey:@"premiumRate"]; - _sharedCost = [coder decodeObjectForKey:@"sharedCost"]; - _personalNumber = [coder decodeObjectForKey:@"personalNumber"]; - _voip = [coder decodeObjectForKey:@"voip"]; - _pager = [coder decodeObjectForKey:@"pager"]; - _uan = [coder decodeObjectForKey:@"uan"]; - _emergency = [coder decodeObjectForKey:@"emergency"]; - _voicemail = [coder decodeObjectForKey:@"voicemail"]; - _noInternationalDialling = [coder decodeObjectForKey:@"noInternationalDialling"]; - _codeID = [coder decodeObjectForKey:@"codeID"]; - _countryCode = [coder decodeObjectForKey:@"countryCode"]; - _internationalPrefix = [coder decodeObjectForKey:@"internationalPrefix"]; - _preferredInternationalPrefix = [coder decodeObjectForKey:@"preferredInternationalPrefix"]; - _nationalPrefix = [coder decodeObjectForKey:@"nationalPrefix"]; - _preferredExtnPrefix = [coder decodeObjectForKey:@"preferredExtnPrefix"]; - _nationalPrefixForParsing = [coder decodeObjectForKey:@"nationalPrefixForParsing"]; - _nationalPrefixTransformRule = [coder decodeObjectForKey:@"nationalPrefixTransformRule"]; - _sameMobileAndFixedLinePattern = [[coder decodeObjectForKey:@"sameMobileAndFixedLinePattern"] boolValue]; - _numberFormats = [coder decodeObjectForKey:@"numberFormats"]; - _intlNumberFormats = [coder decodeObjectForKey:@"intlNumberFormats"]; - _mainCountryForCode = [[coder decodeObjectForKey:@"mainCountryForCode"] boolValue]; - _leadingDigits = [coder decodeObjectForKey:@"leadingDigits"]; - _leadingZeroPossible = [[coder decodeObjectForKey:@"leadingZeroPossible"] boolValue]; - } - return self; +- (instancetype)initWithCoder:(NSCoder *)coder { + if (self = [super init]) { + _generalDesc = [coder decodeObjectForKey:@"generalDesc"]; + _fixedLine = [coder decodeObjectForKey:@"fixedLine"]; + _mobile = [coder decodeObjectForKey:@"mobile"]; + _tollFree = [coder decodeObjectForKey:@"tollFree"]; + _premiumRate = [coder decodeObjectForKey:@"premiumRate"]; + _sharedCost = [coder decodeObjectForKey:@"sharedCost"]; + _personalNumber = [coder decodeObjectForKey:@"personalNumber"]; + _voip = [coder decodeObjectForKey:@"voip"]; + _pager = [coder decodeObjectForKey:@"pager"]; + _uan = [coder decodeObjectForKey:@"uan"]; + _emergency = [coder decodeObjectForKey:@"emergency"]; + _voicemail = [coder decodeObjectForKey:@"voicemail"]; + _noInternationalDialling = [coder decodeObjectForKey:@"noInternationalDialling"]; + _codeID = [coder decodeObjectForKey:@"codeID"]; + _countryCode = [coder decodeObjectForKey:@"countryCode"]; + _internationalPrefix = [coder decodeObjectForKey:@"internationalPrefix"]; + _preferredInternationalPrefix = [coder decodeObjectForKey:@"preferredInternationalPrefix"]; + _nationalPrefix = [coder decodeObjectForKey:@"nationalPrefix"]; + _preferredExtnPrefix = [coder decodeObjectForKey:@"preferredExtnPrefix"]; + _nationalPrefixForParsing = [coder decodeObjectForKey:@"nationalPrefixForParsing"]; + _nationalPrefixTransformRule = [coder decodeObjectForKey:@"nationalPrefixTransformRule"]; + _sameMobileAndFixedLinePattern = + [[coder decodeObjectForKey:@"sameMobileAndFixedLinePattern"] boolValue]; + _numberFormats = [coder decodeObjectForKey:@"numberFormats"]; + _intlNumberFormats = [coder decodeObjectForKey:@"intlNumberFormats"]; + _mainCountryForCode = [[coder decodeObjectForKey:@"mainCountryForCode"] boolValue]; + _leadingDigits = [coder decodeObjectForKey:@"leadingDigits"]; + _leadingZeroPossible = [[coder decodeObjectForKey:@"leadingZeroPossible"] boolValue]; + } + return self; } - -- (void)encodeWithCoder:(NSCoder*)coder -{ - [coder encodeObject:_generalDesc forKey:@"generalDesc"]; - [coder encodeObject:_fixedLine forKey:@"fixedLine"]; - [coder encodeObject:_mobile forKey:@"mobile"]; - [coder encodeObject:_tollFree forKey:@"tollFree"]; - [coder encodeObject:_premiumRate forKey:@"premiumRate"]; - [coder encodeObject:_sharedCost forKey:@"sharedCost"]; - [coder encodeObject:_personalNumber forKey:@"personalNumber"]; - [coder encodeObject:_voip forKey:@"voip"]; - [coder encodeObject:_pager forKey:@"pager"]; - [coder encodeObject:_uan forKey:@"uan"]; - [coder encodeObject:_emergency forKey:@"emergency"]; - [coder encodeObject:_voicemail forKey:@"voicemail"]; - [coder encodeObject:_noInternationalDialling forKey:@"noInternationalDialling"]; - [coder encodeObject:_codeID forKey:@"codeID"]; - [coder encodeObject:_countryCode forKey:@"countryCode"]; - [coder encodeObject:_internationalPrefix forKey:@"internationalPrefix"]; - [coder encodeObject:_preferredInternationalPrefix forKey:@"preferredInternationalPrefix"]; - [coder encodeObject:_nationalPrefix forKey:@"nationalPrefix"]; - [coder encodeObject:_preferredExtnPrefix forKey:@"preferredExtnPrefix"]; - [coder encodeObject:_nationalPrefixForParsing forKey:@"nationalPrefixForParsing"]; - [coder encodeObject:_nationalPrefixTransformRule forKey:@"nationalPrefixTransformRule"]; - [coder encodeObject:[NSNumber numberWithBool:_sameMobileAndFixedLinePattern] forKey:@"sameMobileAndFixedLinePattern"]; - [coder encodeObject:_numberFormats forKey:@"numberFormats"]; - [coder encodeObject:_intlNumberFormats forKey:@"intlNumberFormats"]; - [coder encodeObject:[NSNumber numberWithBool:_mainCountryForCode] forKey:@"mainCountryForCode"]; - [coder encodeObject:_leadingDigits forKey:@"leadingDigits"]; - [coder encodeObject:[NSNumber numberWithBool:_leadingZeroPossible] forKey:@"leadingZeroPossible"]; +- (void)encodeWithCoder:(NSCoder *)coder { + [coder encodeObject:_generalDesc forKey:@"generalDesc"]; + [coder encodeObject:_fixedLine forKey:@"fixedLine"]; + [coder encodeObject:_mobile forKey:@"mobile"]; + [coder encodeObject:_tollFree forKey:@"tollFree"]; + [coder encodeObject:_premiumRate forKey:@"premiumRate"]; + [coder encodeObject:_sharedCost forKey:@"sharedCost"]; + [coder encodeObject:_personalNumber forKey:@"personalNumber"]; + [coder encodeObject:_voip forKey:@"voip"]; + [coder encodeObject:_pager forKey:@"pager"]; + [coder encodeObject:_uan forKey:@"uan"]; + [coder encodeObject:_emergency forKey:@"emergency"]; + [coder encodeObject:_voicemail forKey:@"voicemail"]; + [coder encodeObject:_noInternationalDialling forKey:@"noInternationalDialling"]; + [coder encodeObject:_codeID forKey:@"codeID"]; + [coder encodeObject:_countryCode forKey:@"countryCode"]; + [coder encodeObject:_internationalPrefix forKey:@"internationalPrefix"]; + [coder encodeObject:_preferredInternationalPrefix forKey:@"preferredInternationalPrefix"]; + [coder encodeObject:_nationalPrefix forKey:@"nationalPrefix"]; + [coder encodeObject:_preferredExtnPrefix forKey:@"preferredExtnPrefix"]; + [coder encodeObject:_nationalPrefixForParsing forKey:@"nationalPrefixForParsing"]; + [coder encodeObject:_nationalPrefixTransformRule forKey:@"nationalPrefixTransformRule"]; + [coder encodeObject:[NSNumber numberWithBool:_sameMobileAndFixedLinePattern] + forKey:@"sameMobileAndFixedLinePattern"]; + [coder encodeObject:_numberFormats forKey:@"numberFormats"]; + [coder encodeObject:_intlNumberFormats forKey:@"intlNumberFormats"]; + [coder encodeObject:[NSNumber numberWithBool:_mainCountryForCode] forKey:@"mainCountryForCode"]; + [coder encodeObject:_leadingDigits forKey:@"leadingDigits"]; + [coder encodeObject:[NSNumber numberWithBool:_leadingZeroPossible] forKey:@"leadingZeroPossible"]; } -#endif // NB_USE_EXTENSIONS +#endif // NB_USE_EXTENSIONS @end diff --git a/libPhoneNumber/NBPhoneNumber.h b/libPhoneNumber/NBPhoneNumber.h old mode 100755 new mode 100644 index bf517ca..f67ed42 --- a/libPhoneNumber/NBPhoneNumber.h +++ b/libPhoneNumber/NBPhoneNumber.h @@ -1,24 +1,23 @@ // // NBPhoneNumber.h // libPhoneNumber -// +// // #import #import "NBPhoneNumberDefines.h" - -@interface NBPhoneNumber : NSObject +@interface NBPhoneNumber : NSObject // from phonemetadata.pb.js -/* 1 */ @property (nonatomic, strong, readwrite) NSNumber *countryCode; -/* 2 */ @property (nonatomic, strong, readwrite) NSNumber *nationalNumber; -/* 3 */ @property (nonatomic, strong, readwrite) NSString *extension; -/* 4 */ @property (nonatomic, assign, readwrite) BOOL italianLeadingZero; -/* 8 */ @property (nonatomic, strong, readwrite) NSNumber *numberOfLeadingZeros; -/* 5 */ @property (nonatomic, strong, readwrite) NSString *rawInput; -/* 6 */ @property (nonatomic, strong, readwrite) NSNumber *countryCodeSource; -/* 7 */ @property (nonatomic, strong, readwrite) NSString *preferredDomesticCarrierCode; +/* 1 */ @property(nonatomic, strong, readwrite) NSNumber *countryCode; +/* 2 */ @property(nonatomic, strong, readwrite) NSNumber *nationalNumber; +/* 3 */ @property(nonatomic, strong, readwrite) NSString *extension; +/* 4 */ @property(nonatomic, assign, readwrite) BOOL italianLeadingZero; +/* 8 */ @property(nonatomic, strong, readwrite) NSNumber *numberOfLeadingZeros; +/* 5 */ @property(nonatomic, strong, readwrite) NSString *rawInput; +/* 6 */ @property(nonatomic, strong, readwrite) NSNumber *countryCodeSource; +/* 7 */ @property(nonatomic, strong, readwrite) NSString *preferredDomesticCarrierCode; - (void)clearCountryCodeSource; - (NBECountryCodeSource)getCountryCodeSourceOrDefault; diff --git a/libPhoneNumber/NBPhoneNumber.m b/libPhoneNumber/NBPhoneNumber.m old mode 100755 new mode 100644 index 8dff115..e24064c --- a/libPhoneNumber/NBPhoneNumber.m +++ b/libPhoneNumber/NBPhoneNumber.m @@ -7,112 +7,104 @@ #import "NBPhoneNumber.h" #import "NBPhoneNumberDefines.h" - @implementation NBPhoneNumber -- (instancetype)init -{ - self = [super init]; - - if (self) { - self.nationalNumber = @-1; - self.countryCode = @-1; - self.numberOfLeadingZeros = @(1); - } - - return self; +- (instancetype)init { + self = [super init]; + + if (self) { + self.nationalNumber = @-1; + self.countryCode = @-1; + self.numberOfLeadingZeros = @(1); + } + + return self; } - -- (void)clearCountryCodeSource -{ - [self setCountryCodeSource:nil]; +- (void)clearCountryCodeSource { + [self setCountryCodeSource:nil]; } +- (NBECountryCodeSource)getCountryCodeSourceOrDefault { + if (nil == self.countryCodeSource) { + return NBECountryCodeSourceFROM_NUMBER_WITH_PLUS_SIGN; + } -- (NBECountryCodeSource)getCountryCodeSourceOrDefault -{ - if (nil == self.countryCodeSource) { - return NBECountryCodeSourceFROM_NUMBER_WITH_PLUS_SIGN; - } - - return [self.countryCodeSource integerValue]; + return [self.countryCodeSource integerValue]; } -- (NSUInteger)hash -{ - // See https://stackoverflow.com/questions/4948780/magic-number-in-boosthash-combine - NSUInteger hash = self.countryCode.hash; - hash ^= self.nationalNumber.hash + 0x9e3779b9 + (hash << 6) + (hash >> 2); - hash ^= self.numberOfLeadingZeros.hash + 0x9e3779b9 + (hash << 6) + (hash >> 2); - hash ^= self.extension.hash + 0x9e3779b9 + (hash << 6) + (hash >> 2); - return hash; +- (NSUInteger)hash { + // See https://stackoverflow.com/questions/4948780/magic-number-in-boosthash-combine + NSUInteger hash = self.countryCode.hash; + hash ^= self.nationalNumber.hash + 0x9e3779b9 + (hash << 6) + (hash >> 2); + hash ^= self.numberOfLeadingZeros.hash + 0x9e3779b9 + (hash << 6) + (hash >> 2); + hash ^= self.extension.hash + 0x9e3779b9 + (hash << 6) + (hash >> 2); + return hash; } +- (BOOL)isEqual:(id)object { + if (![object isKindOfClass:[NBPhoneNumber class]]) { + return NO; + } -- (BOOL)isEqual:(id)object -{ - if (![object isKindOfClass:[NBPhoneNumber class]]) { - return NO; - } - - NBPhoneNumber *other = object; - return ([self.countryCode isEqualToNumber:other.countryCode]) && ([self.nationalNumber isEqualToNumber:other.nationalNumber]) && - (self.italianLeadingZero == other.italianLeadingZero) && ([self.numberOfLeadingZeros isEqualToNumber:other.numberOfLeadingZeros]) && - ((self.extension == nil && other.extension == nil) || [self.extension isEqualToString:other.extension]); + NBPhoneNumber *other = object; + return ([self.countryCode isEqualToNumber:other.countryCode]) && + ([self.nationalNumber isEqualToNumber:other.nationalNumber]) && + (self.italianLeadingZero == other.italianLeadingZero) && + ([self.numberOfLeadingZeros isEqualToNumber:other.numberOfLeadingZeros]) && + ((self.extension == nil && other.extension == nil) || + [self.extension isEqualToString:other.extension]); } +- (id)copyWithZone:(NSZone *)zone { + NBPhoneNumber *phoneNumberCopy = [[NBPhoneNumber allocWithZone:zone] init]; -- (id)copyWithZone:(NSZone *)zone -{ - NBPhoneNumber *phoneNumberCopy = [[NBPhoneNumber allocWithZone:zone] init]; - - phoneNumberCopy.countryCode = [self.countryCode copy]; - phoneNumberCopy.nationalNumber = [self.nationalNumber copy]; - phoneNumberCopy.extension = [self.extension copy]; - phoneNumberCopy.italianLeadingZero = self.italianLeadingZero; - phoneNumberCopy.numberOfLeadingZeros = [self.numberOfLeadingZeros copy]; - phoneNumberCopy.rawInput = [self.rawInput copy]; - phoneNumberCopy.countryCodeSource = [self.countryCodeSource copy]; - phoneNumberCopy.preferredDomesticCarrierCode = [self.preferredDomesticCarrierCode copy]; - - return phoneNumberCopy; + phoneNumberCopy.countryCode = [self.countryCode copy]; + phoneNumberCopy.nationalNumber = [self.nationalNumber copy]; + phoneNumberCopy.extension = [self.extension copy]; + phoneNumberCopy.italianLeadingZero = self.italianLeadingZero; + phoneNumberCopy.numberOfLeadingZeros = [self.numberOfLeadingZeros copy]; + phoneNumberCopy.rawInput = [self.rawInput copy]; + phoneNumberCopy.countryCodeSource = [self.countryCodeSource copy]; + phoneNumberCopy.preferredDomesticCarrierCode = [self.preferredDomesticCarrierCode copy]; + + return phoneNumberCopy; } - -- (instancetype)initWithCoder:(NSCoder*)coder -{ - if (self = [super init]) { - self.countryCode = [coder decodeObjectForKey:@"countryCode"]; - self.nationalNumber = [coder decodeObjectForKey:@"nationalNumber"]; - self.extension = [coder decodeObjectForKey:@"extension"]; - self.italianLeadingZero = [[coder decodeObjectForKey:@"italianLeadingZero"] boolValue]; - self.numberOfLeadingZeros = [coder decodeObjectForKey:@"numberOfLeadingZeros"]; - self.rawInput = [coder decodeObjectForKey:@"rawInput"]; - self.countryCodeSource = [coder decodeObjectForKey:@"countryCodeSource"]; - self.preferredDomesticCarrierCode = [coder decodeObjectForKey:@"preferredDomesticCarrierCode"]; - } - return self; +- (instancetype)initWithCoder:(NSCoder *)coder { + if (self = [super init]) { + self.countryCode = [coder decodeObjectForKey:@"countryCode"]; + self.nationalNumber = [coder decodeObjectForKey:@"nationalNumber"]; + self.extension = [coder decodeObjectForKey:@"extension"]; + self.italianLeadingZero = [[coder decodeObjectForKey:@"italianLeadingZero"] boolValue]; + self.numberOfLeadingZeros = [coder decodeObjectForKey:@"numberOfLeadingZeros"]; + self.rawInput = [coder decodeObjectForKey:@"rawInput"]; + self.countryCodeSource = [coder decodeObjectForKey:@"countryCodeSource"]; + self.preferredDomesticCarrierCode = [coder decodeObjectForKey:@"preferredDomesticCarrierCode"]; + } + return self; } - -- (void)encodeWithCoder:(NSCoder*)coder -{ - [coder encodeObject:self.countryCode forKey:@"countryCode"]; - [coder encodeObject:self.nationalNumber forKey:@"nationalNumber"]; - [coder encodeObject:self.extension forKey:@"extension"]; - [coder encodeObject:[NSNumber numberWithBool:self.italianLeadingZero] forKey:@"italianLeadingZero"]; - [coder encodeObject:self.numberOfLeadingZeros forKey:@"numberOfLeadingZeros"]; - [coder encodeObject:self.rawInput forKey:@"rawInput"]; - [coder encodeObject:self.countryCodeSource forKey:@"countryCodeSource"]; - [coder encodeObject:self.preferredDomesticCarrierCode forKey:@"preferredDomesticCarrierCode"]; +- (void)encodeWithCoder:(NSCoder *)coder { + [coder encodeObject:self.countryCode forKey:@"countryCode"]; + [coder encodeObject:self.nationalNumber forKey:@"nationalNumber"]; + [coder encodeObject:self.extension forKey:@"extension"]; + [coder encodeObject:[NSNumber numberWithBool:self.italianLeadingZero] + forKey:@"italianLeadingZero"]; + [coder encodeObject:self.numberOfLeadingZeros forKey:@"numberOfLeadingZeros"]; + [coder encodeObject:self.rawInput forKey:@"rawInput"]; + [coder encodeObject:self.countryCodeSource forKey:@"countryCodeSource"]; + [coder encodeObject:self.preferredDomesticCarrierCode forKey:@"preferredDomesticCarrierCode"]; } - - -- (NSString *)description -{ - return [NSString stringWithFormat:@" - countryCode[%@], nationalNumber[%@], extension[%@], italianLeadingZero[%@], numberOfLeadingZeros[%@], rawInput[%@] countryCodeSource[%@] preferredDomesticCarrierCode[%@]", self.countryCode, self.nationalNumber, self.extension, self.italianLeadingZero?@"Y":@"N", self.numberOfLeadingZeros, self.rawInput, self.countryCodeSource, self.preferredDomesticCarrierCode]; +- (NSString *)description { + return [NSString stringWithFormat: + @" - countryCode[%@], nationalNumber[%@], extension[%@], " + @"italianLeadingZero[%@], numberOfLeadingZeros[%@], rawInput[%@] " + @"countryCodeSource[%@] preferredDomesticCarrierCode[%@]", + self.countryCode, self.nationalNumber, self.extension, + self.italianLeadingZero ? @"Y" : @"N", self.numberOfLeadingZeros, + self.rawInput, self.countryCodeSource, self.preferredDomesticCarrierCode]; } @end diff --git a/libPhoneNumber/NBPhoneNumberDefines.h b/libPhoneNumber/NBPhoneNumberDefines.h old mode 100755 new mode 100644 index 0d334a8..1dfa983 --- a/libPhoneNumber/NBPhoneNumberDefines.h +++ b/libPhoneNumber/NBPhoneNumberDefines.h @@ -15,76 +15,72 @@ #pragma mark - Enum - typedef NS_ENUM(NSInteger, NBEPhoneNumberFormat) { - NBEPhoneNumberFormatE164 = 0, - NBEPhoneNumberFormatINTERNATIONAL = 1, - NBEPhoneNumberFormatNATIONAL = 2, - NBEPhoneNumberFormatRFC3966 = 3 + NBEPhoneNumberFormatE164 = 0, + NBEPhoneNumberFormatINTERNATIONAL = 1, + NBEPhoneNumberFormatNATIONAL = 2, + NBEPhoneNumberFormatRFC3966 = 3 }; - typedef NS_ENUM(NSInteger, NBEPhoneNumberType) { - NBEPhoneNumberTypeFIXED_LINE = 0, - NBEPhoneNumberTypeMOBILE = 1, - // In some regions (e.g. the USA), it is impossible to distinguish between - // fixed-line and mobile numbers by looking at the phone number itself. - NBEPhoneNumberTypeFIXED_LINE_OR_MOBILE = 2, - // Freephone lines - NBEPhoneNumberTypeTOLL_FREE = 3, - NBEPhoneNumberTypePREMIUM_RATE = 4, - // The cost of this call is shared between the caller and the recipient, and - // is hence typically less than PREMIUM_RATE calls. See - // http://en.wikipedia.org/wiki/Shared_Cost_Service for more information. - NBEPhoneNumberTypeSHARED_COST = 5, - // Voice over IP numbers. This includes TSoIP (Telephony Service over IP). - NBEPhoneNumberTypeVOIP = 6, - // A personal number is associated with a particular person, and may be routed - // to either a MOBILE or FIXED_LINE number. Some more information can be found - // here = http://en.wikipedia.org/wiki/Personal_Numbers - NBEPhoneNumberTypePERSONAL_NUMBER = 7, - NBEPhoneNumberTypePAGER = 8, - // Used for 'Universal Access Numbers' or 'Company Numbers'. They may be - // further routed to specific offices, but allow one number to be used for a - // company. - NBEPhoneNumberTypeUAN = 9, - // Used for 'Voice Mail Access Numbers'. - NBEPhoneNumberTypeVOICEMAIL = 10, - // A phone number is of type UNKNOWN when it does not fit any of the known - // patterns for a specific region. - NBEPhoneNumberTypeUNKNOWN = -1 + NBEPhoneNumberTypeFIXED_LINE = 0, + NBEPhoneNumberTypeMOBILE = 1, + // In some regions (e.g. the USA), it is impossible to distinguish between + // fixed-line and mobile numbers by looking at the phone number itself. + NBEPhoneNumberTypeFIXED_LINE_OR_MOBILE = 2, + // Freephone lines + NBEPhoneNumberTypeTOLL_FREE = 3, + NBEPhoneNumberTypePREMIUM_RATE = 4, + // The cost of this call is shared between the caller and the recipient, and + // is hence typically less than PREMIUM_RATE calls. See + // http://en.wikipedia.org/wiki/Shared_Cost_Service for more information. + NBEPhoneNumberTypeSHARED_COST = 5, + // Voice over IP numbers. This includes TSoIP (Telephony Service over IP). + NBEPhoneNumberTypeVOIP = 6, + // A personal number is associated with a particular person, and may be routed + // to either a MOBILE or FIXED_LINE number. Some more information can be found + // here = http://en.wikipedia.org/wiki/Personal_Numbers + NBEPhoneNumberTypePERSONAL_NUMBER = 7, + NBEPhoneNumberTypePAGER = 8, + // Used for 'Universal Access Numbers' or 'Company Numbers'. They may be + // further routed to specific offices, but allow one number to be used for a + // company. + NBEPhoneNumberTypeUAN = 9, + // Used for 'Voice Mail Access Numbers'. + NBEPhoneNumberTypeVOICEMAIL = 10, + // A phone number is of type UNKNOWN when it does not fit any of the known + // patterns for a specific region. + NBEPhoneNumberTypeUNKNOWN = -1 }; - typedef NS_ENUM(NSInteger, NBEMatchType) { - NBEMatchTypeNOT_A_NUMBER = 0, - NBEMatchTypeNO_MATCH = 1, - NBEMatchTypeSHORT_NSN_MATCH = 2, - NBEMatchTypeNSN_MATCH = 3, - NBEMatchTypeEXACT_MATCH = 4 + NBEMatchTypeNOT_A_NUMBER = 0, + NBEMatchTypeNO_MATCH = 1, + NBEMatchTypeSHORT_NSN_MATCH = 2, + NBEMatchTypeNSN_MATCH = 3, + NBEMatchTypeEXACT_MATCH = 4 }; - typedef NS_ENUM(NSInteger, NBEValidationResult) { - NBEValidationResultINVALID_LENGTH = -1, - NBEValidationResultUNKNOWN = 0, - NBEValidationResultIS_POSSIBLE = 1, - NBEValidationResultINVALID_COUNTRY_CODE = 2, - NBEValidationResultTOO_SHORT = 3, - NBEValidationResultTOO_LONG = 4, - NBEValidationResultIS_POSSIBLE_LOCAL_ONLY = 5 + NBEValidationResultINVALID_LENGTH = -1, + NBEValidationResultUNKNOWN = 0, + NBEValidationResultIS_POSSIBLE = 1, + NBEValidationResultINVALID_COUNTRY_CODE = 2, + NBEValidationResultTOO_SHORT = 3, + NBEValidationResultTOO_LONG = 4, + NBEValidationResultIS_POSSIBLE_LOCAL_ONLY = 5 }; - typedef NS_ENUM(NSInteger, NBECountryCodeSource) { - NBECountryCodeSourceFROM_NUMBER_WITH_PLUS_SIGN = 1, - NBECountryCodeSourceFROM_NUMBER_WITH_IDD = 5, - NBECountryCodeSourceFROM_NUMBER_WITHOUT_PLUS_SIGN = 10, - NBECountryCodeSourceFROM_DEFAULT_COUNTRY = 20 + NBECountryCodeSourceFROM_NUMBER_WITH_PLUS_SIGN = 1, + NBECountryCodeSourceFROM_NUMBER_WITH_IDD = 5, + NBECountryCodeSourceFROM_NUMBER_WITHOUT_PLUS_SIGN = 10, + NBECountryCodeSourceFROM_DEFAULT_COUNTRY = 20 }; -extern NSString * const NB_UNKNOWN_REGION; -extern NSString * const NB_NON_BREAKING_SPACE; -extern NSString * const NB_PLUS_CHARS; -extern NSString * const NB_VALID_DIGITS_STRING; -extern NSString * const NB_REGION_CODE_FOR_NON_GEO_ENTITY; +extern NSString* const NB_UNKNOWN_REGION; +extern NSString* const NB_NON_BREAKING_SPACE; +extern NSString* const NB_PLUS_CHARS; +extern NSString* const NB_VALID_DIGITS_STRING; +extern NSString* const NB_REGION_CODE_FOR_NON_GEO_ENTITY; #endif diff --git a/libPhoneNumber/NBPhoneNumberDefines.m b/libPhoneNumber/NBPhoneNumberDefines.m index e0a3f17..ed803c4 100644 --- a/libPhoneNumber/NBPhoneNumberDefines.m +++ b/libPhoneNumber/NBPhoneNumberDefines.m @@ -1,7 +1,7 @@ #import "NBPhoneNumberDefines.h" -NSString * const NB_UNKNOWN_REGION = @"ZZ"; -NSString * const NB_NON_BREAKING_SPACE = @"\u00a0"; -NSString * const NB_PLUS_CHARS = @"++"; -NSString * const NB_VALID_DIGITS_STRING = @"0-90-9٠-٩۰-۹"; -NSString * const NB_REGION_CODE_FOR_NON_GEO_ENTITY = @"001"; +NSString* const NB_UNKNOWN_REGION = @"ZZ"; +NSString* const NB_NON_BREAKING_SPACE = @"\u00a0"; +NSString* const NB_PLUS_CHARS = @"++"; +NSString* const NB_VALID_DIGITS_STRING = @"0-90-9٠-٩۰-۹"; +NSString* const NB_REGION_CODE_FOR_NON_GEO_ENTITY = @"001"; diff --git a/libPhoneNumber/NBPhoneNumberDesc.h b/libPhoneNumber/NBPhoneNumberDesc.h old mode 100755 new mode 100644 index dac6f46..0388367 --- a/libPhoneNumber/NBPhoneNumberDesc.h +++ b/libPhoneNumber/NBPhoneNumberDesc.h @@ -6,17 +6,16 @@ #import - @interface NBPhoneNumberDesc : NSObject // from phonemetadata.pb.js -/* 2 */ @property (nonatomic, strong, readonly) NSString *nationalNumberPattern; -/* 3 */ @property (nonatomic, strong, readonly) NSString *possibleNumberPattern; -/* 9 */ @property (nonatomic, strong, readonly) NSArray *possibleLength; -/* 10 */ @property (nonatomic, strong, readonly) NSArray *possibleLengthLocalOnly; -/* 6 */ @property (nonatomic, strong, readonly) NSString *exampleNumber; -/* 7 */ @property (nonatomic, strong, readonly) NSData *nationalNumberMatcherData; -/* 8 */ @property (nonatomic, strong, readonly) NSData *possibleNumberMatcherData; +/* 2 */ @property(nonatomic, strong, readonly) NSString *nationalNumberPattern; +/* 3 */ @property(nonatomic, strong, readonly) NSString *possibleNumberPattern; +/* 9 */ @property(nonatomic, strong, readonly) NSArray *possibleLength; +/* 10 */ @property(nonatomic, strong, readonly) NSArray *possibleLengthLocalOnly; +/* 6 */ @property(nonatomic, strong, readonly) NSString *exampleNumber; +/* 7 */ @property(nonatomic, strong, readonly) NSData *nationalNumberMatcherData; +/* 8 */ @property(nonatomic, strong, readonly) NSData *possibleNumberMatcherData; - (instancetype)initWithEntry:(NSArray *)entry; @end diff --git a/libPhoneNumber/NBPhoneNumberDesc.m b/libPhoneNumber/NBPhoneNumberDesc.m old mode 100755 new mode 100644 index 3552bc3..449d2b1 --- a/libPhoneNumber/NBPhoneNumberDesc.m +++ b/libPhoneNumber/NBPhoneNumberDesc.m @@ -9,28 +9,26 @@ @implementation NBPhoneNumberDesc -- (instancetype)initWithEntry:(NSArray *)entry -{ - self = [super init]; - if (self && entry != nil) { - _nationalNumberPattern = [entry nb_safeStringAtIndex:2]; - _possibleNumberPattern = [entry nb_safeStringAtIndex:3]; - _possibleLength = [entry nb_safeArrayAtIndex:9]; - _possibleLengthLocalOnly = [entry nb_safeArrayAtIndex:10]; - _exampleNumber = [entry nb_safeStringAtIndex:6]; - _nationalNumberMatcherData = [entry nb_safeDataAtIndex:7]; - _possibleNumberMatcherData = [entry nb_safeDataAtIndex:8]; - } - return self; +- (instancetype)initWithEntry:(NSArray *)entry { + self = [super init]; + if (self && entry != nil) { + _nationalNumberPattern = [entry nb_safeStringAtIndex:2]; + _possibleNumberPattern = [entry nb_safeStringAtIndex:3]; + _possibleLength = [entry nb_safeArrayAtIndex:9]; + _possibleLengthLocalOnly = [entry nb_safeArrayAtIndex:10]; + _exampleNumber = [entry nb_safeStringAtIndex:6]; + _nationalNumberMatcherData = [entry nb_safeDataAtIndex:7]; + _possibleNumberMatcherData = [entry nb_safeDataAtIndex:8]; + } + return self; } - - - -- (NSString *)description -{ - return [NSString stringWithFormat:@"nationalNumberPattern[%@] possibleNumberPattern[%@] possibleLength[%@] possibleLengthLocalOnly[%@] exampleNumber[%@]", - self.nationalNumberPattern, self.possibleNumberPattern, self.possibleLength, self.possibleLengthLocalOnly, self.exampleNumber]; +- (NSString *)description { + return [NSString stringWithFormat: + @"nationalNumberPattern[%@] possibleNumberPattern[%@] possibleLength[%@] " + @"possibleLengthLocalOnly[%@] exampleNumber[%@]", + self.nationalNumberPattern, self.possibleNumberPattern, self.possibleLength, + self.possibleLengthLocalOnly, self.exampleNumber]; } #ifdef NB_USE_EXTENSIONS @@ -38,55 +36,48 @@ // If you would like them back (not behind a flag) please file a bug with a reason for needing // them. -- (instancetype)initWithCoder:(NSCoder*)coder -{ - if (self = [super init]) { - _nationalNumberPattern = [coder decodeObjectForKey:@"nationalNumberPattern"]; - _possibleNumberPattern = [coder decodeObjectForKey:@"possibleNumberPattern"]; - _possibleLength = [coder decodeObjectForKey:@"possibleLength"]; - _possibleLengthLocalOnly = [coder decodeObjectForKey:@"possibleLengthLocalOnly"]; - _exampleNumber = [coder decodeObjectForKey:@"exampleNumber"]; - _nationalNumberMatcherData = [coder decodeObjectForKey:@"nationalNumberMatcherData"]; - _possibleNumberMatcherData = [coder decodeObjectForKey:@"possibleNumberMatcherData"]; - } - return self; -} - - -- (void)encodeWithCoder:(NSCoder*)coder -{ - [coder encodeObject:self.nationalNumberPattern forKey:@"nationalNumberPattern"]; - [coder encodeObject:self.possibleNumberPattern forKey:@"possibleNumberPattern"]; - [coder encodeObject:self.possibleLength forKey:@"possibleLength"]; - [coder encodeObject:self.possibleLengthLocalOnly forKey:@"possibleLengthLocalOnly"]; - [coder encodeObject:self.exampleNumber forKey:@"exampleNumber"]; - [coder encodeObject:self.nationalNumberMatcherData forKey:@"nationalNumberMatcherData"]; - [coder encodeObject:self.possibleNumberMatcherData forKey:@"possibleNumberMatcherData"]; -} - - -- (id)copyWithZone:(NSZone *)zone -{ +- (instancetype)initWithCoder:(NSCoder *)coder { + if (self = [super init]) { + _nationalNumberPattern = [coder decodeObjectForKey:@"nationalNumberPattern"]; + _possibleNumberPattern = [coder decodeObjectForKey:@"possibleNumberPattern"]; + _possibleLength = [coder decodeObjectForKey:@"possibleLength"]; + _possibleLengthLocalOnly = [coder decodeObjectForKey:@"possibleLengthLocalOnly"]; + _exampleNumber = [coder decodeObjectForKey:@"exampleNumber"]; + _nationalNumberMatcherData = [coder decodeObjectForKey:@"nationalNumberMatcherData"]; + _possibleNumberMatcherData = [coder decodeObjectForKey:@"possibleNumberMatcherData"]; + } return self; } - -- (BOOL)isEqual:(id)object -{ - if ([object isKindOfClass:[NBPhoneNumberDesc class]] == NO) { - return NO; - } - - NBPhoneNumberDesc *other = object; - return [self.nationalNumberPattern isEqual:other.nationalNumberPattern] && - [self.possibleNumberPattern isEqual:other.possibleNumberPattern] && - [self.possibleLength isEqual:other.possibleLength] && - [self.possibleLengthLocalOnly isEqual:other.possibleLengthLocalOnly] && - [self.exampleNumber isEqual:other.exampleNumber] && - [self.nationalNumberMatcherData isEqualToData:other.nationalNumberMatcherData] && - [self.possibleNumberMatcherData isEqualToData:other.possibleNumberMatcherData]; +- (void)encodeWithCoder:(NSCoder *)coder { + [coder encodeObject:self.nationalNumberPattern forKey:@"nationalNumberPattern"]; + [coder encodeObject:self.possibleNumberPattern forKey:@"possibleNumberPattern"]; + [coder encodeObject:self.possibleLength forKey:@"possibleLength"]; + [coder encodeObject:self.possibleLengthLocalOnly forKey:@"possibleLengthLocalOnly"]; + [coder encodeObject:self.exampleNumber forKey:@"exampleNumber"]; + [coder encodeObject:self.nationalNumberMatcherData forKey:@"nationalNumberMatcherData"]; + [coder encodeObject:self.possibleNumberMatcherData forKey:@"possibleNumberMatcherData"]; } -#endif // NB_USE_EXTENSIONS +- (id)copyWithZone:(NSZone *)zone { + return self; +} + +- (BOOL)isEqual:(id)object { + if ([object isKindOfClass:[NBPhoneNumberDesc class]] == NO) { + return NO; + } + + NBPhoneNumberDesc *other = object; + return [self.nationalNumberPattern isEqual:other.nationalNumberPattern] && + [self.possibleNumberPattern isEqual:other.possibleNumberPattern] && + [self.possibleLength isEqual:other.possibleLength] && + [self.possibleLengthLocalOnly isEqual:other.possibleLengthLocalOnly] && + [self.exampleNumber isEqual:other.exampleNumber] && + [self.nationalNumberMatcherData isEqualToData:other.nationalNumberMatcherData] && + [self.possibleNumberMatcherData isEqualToData:other.possibleNumberMatcherData]; +} + +#endif // NB_USE_EXTENSIONS @end diff --git a/libPhoneNumber/NBPhoneNumberUtil.h b/libPhoneNumber/NBPhoneNumberUtil.h old mode 100755 new mode 100644 index 5deac22..4de9aba --- a/libPhoneNumber/NBPhoneNumberUtil.h +++ b/libPhoneNumber/NBPhoneNumberUtil.h @@ -9,95 +9,129 @@ #import #import "NBPhoneNumberDefines.h" - @class NBPhoneMetaData, NBPhoneNumber; @interface NBPhoneNumberUtil : NSObject -+ (NBPhoneNumberUtil*)sharedInstance; ++ (NBPhoneNumberUtil *)sharedInstance; // regular expressions -- (NSArray*)matchesByRegex:(NSString*)sourceString regex:(NSString*)pattern; -- (NSArray*)matchedStringByRegex:(NSString*)sourceString regex:(NSString*)pattern; -- (NSString*)replaceStringByRegex:(NSString*)sourceString regex:(NSString*)pattern withTemplate:(NSString*)templateString; -- (int)stringPositionByRegex:(NSString*)sourceString regex:(NSString*)pattern; +- (NSArray *)matchesByRegex:(NSString *)sourceString regex:(NSString *)pattern; +- (NSArray *)matchedStringByRegex:(NSString *)sourceString regex:(NSString *)pattern; +- (NSString *)replaceStringByRegex:(NSString *)sourceString + regex:(NSString *)pattern + withTemplate:(NSString *)templateString; +- (int)stringPositionByRegex:(NSString *)sourceString regex:(NSString *)pattern; // libPhoneNumber Util functions -- (NSString*)convertAlphaCharactersInNumber:(NSString*)number; +- (NSString *)convertAlphaCharactersInNumber:(NSString *)number; -- (NSString*)normalize:(NSString*)phoneNumber; -- (NSString*)normalizeDigitsOnly:(NSString*)number; -- (NSString*)normalizeDiallableCharsOnly:(NSString*)number; +- (NSString *)normalize:(NSString *)phoneNumber; +- (NSString *)normalizeDigitsOnly:(NSString *)number; +- (NSString *)normalizeDiallableCharsOnly:(NSString *)number; -- (BOOL)isNumberGeographical:(NBPhoneNumber*)phoneNumber; +- (BOOL)isNumberGeographical:(NBPhoneNumber *)phoneNumber; -- (NSString*)extractPossibleNumber:(NSString*)phoneNumber; -- (NSNumber*)extractCountryCode:(NSString*)fullNumber nationalNumber:(NSString**)nationalNumber; +- (NSString *)extractPossibleNumber:(NSString *)phoneNumber; +- (NSNumber *)extractCountryCode:(NSString *)fullNumber nationalNumber:(NSString **)nationalNumber; #if TARGET_OS_IOS - (NSString *)countryCodeByCarrier; #endif -- (NSString*)getNddPrefixForRegion:(NSString*)regionCode stripNonDigits:(BOOL)stripNonDigits; -- (NSString*)getNationalSignificantNumber:(NBPhoneNumber*)phoneNumber; +- (NSString *)getNddPrefixForRegion:(NSString *)regionCode stripNonDigits:(BOOL)stripNonDigits; +- (NSString *)getNationalSignificantNumber:(NBPhoneNumber *)phoneNumber; - (NSArray *)getSupportedRegions; -- (NBEPhoneNumberType)getNumberType:(NBPhoneNumber*)phoneNumber; +- (NBEPhoneNumberType)getNumberType:(NBPhoneNumber *)phoneNumber; -- (NSNumber*)getCountryCodeForRegion:(NSString*)regionCode; +- (NSNumber *)getCountryCodeForRegion:(NSString *)regionCode; -- (NSString*)getRegionCodeForCountryCode:(NSNumber*)countryCallingCode; -- (NSArray*)getRegionCodesForCountryCode:(NSNumber*)countryCallingCode; -- (NSString*)getRegionCodeForNumber:(NBPhoneNumber*)phoneNumber; +- (NSString *)getRegionCodeForCountryCode:(NSNumber *)countryCallingCode; +- (NSArray *)getRegionCodesForCountryCode:(NSNumber *)countryCallingCode; +- (NSString *)getRegionCodeForNumber:(NBPhoneNumber *)phoneNumber; -- (NBPhoneNumber*)getExampleNumber:(NSString*)regionCode error:(NSError**)error; -- (NBPhoneNumber*)getExampleNumberForType:(NSString*)regionCode type:(NBEPhoneNumberType)type error:(NSError**)error; -- (NBPhoneNumber*)getExampleNumberForNonGeoEntity:(NSNumber*)countryCallingCode error:(NSError**)error; +- (NBPhoneNumber *)getExampleNumber:(NSString *)regionCode error:(NSError **)error; +- (NBPhoneNumber *)getExampleNumberForType:(NSString *)regionCode + type:(NBEPhoneNumberType)type + error:(NSError **)error; +- (NBPhoneNumber *)getExampleNumberForNonGeoEntity:(NSNumber *)countryCallingCode + error:(NSError **)error; -- (BOOL)canBeInternationallyDialled:(NBPhoneNumber*)number error:(NSError**)error; +- (BOOL)canBeInternationallyDialled:(NBPhoneNumber *)number error:(NSError **)error; -- (BOOL)truncateTooLongNumber:(NBPhoneNumber*)number; +- (BOOL)truncateTooLongNumber:(NBPhoneNumber *)number; -- (BOOL)isValidNumber:(NBPhoneNumber*)number; -- (BOOL)isViablePhoneNumber:(NSString*)phoneNumber; -- (BOOL)isAlphaNumber:(NSString*)number; -- (BOOL)isValidNumberForRegion:(NBPhoneNumber*)number regionCode:(NSString*)regionCode; -- (BOOL)isNANPACountry:(NSString*)regionCode; -- (BOOL)isLeadingZeroPossible:(NSNumber*)countryCallingCode; +- (BOOL)isValidNumber:(NBPhoneNumber *)number; +- (BOOL)isViablePhoneNumber:(NSString *)phoneNumber; +- (BOOL)isAlphaNumber:(NSString *)number; +- (BOOL)isValidNumberForRegion:(NBPhoneNumber *)number regionCode:(NSString *)regionCode; +- (BOOL)isNANPACountry:(NSString *)regionCode; +- (BOOL)isLeadingZeroPossible:(NSNumber *)countryCallingCode; -- (NBEValidationResult)isPossibleNumberWithReason:(NBPhoneNumber*)number error:(NSError**)error; +- (NBEValidationResult)isPossibleNumberWithReason:(NBPhoneNumber *)number error:(NSError **)error; -- (BOOL)isPossibleNumber:(NBPhoneNumber*)number; -- (BOOL)isPossibleNumber:(NBPhoneNumber*)number error:(NSError**)error; -- (BOOL)isPossibleNumberString:(NSString*)number regionDialingFrom:(NSString*)regionDialingFrom error:(NSError**)error; +- (BOOL)isPossibleNumber:(NBPhoneNumber *)number; +- (BOOL)isPossibleNumber:(NBPhoneNumber *)number error:(NSError **)error; +- (BOOL)isPossibleNumberString:(NSString *)number + regionDialingFrom:(NSString *)regionDialingFrom + error:(NSError **)error; -- (NBEMatchType)isNumberMatch:(id)firstNumberIn second:(id)secondNumberIn error:(NSError**)error; +- (NBEMatchType)isNumberMatch:(id)firstNumberIn second:(id)secondNumberIn error:(NSError **)error; -- (int)getLengthOfGeographicalAreaCode:(NBPhoneNumber*)phoneNumber error:(NSError**)error; -- (int)getLengthOfNationalDestinationCode:(NBPhoneNumber*)phoneNumber error:(NSError**)error; +- (int)getLengthOfGeographicalAreaCode:(NBPhoneNumber *)phoneNumber error:(NSError **)error; +- (int)getLengthOfNationalDestinationCode:(NBPhoneNumber *)phoneNumber error:(NSError **)error; -- (BOOL)maybeStripNationalPrefixAndCarrierCode:(NSString**)numberStr metadata:(NBPhoneMetaData*)metadata carrierCode:(NSString**)carrierCode; -- (NBECountryCodeSource)maybeStripInternationalPrefixAndNormalize:(NSString**)numberStr possibleIddPrefix:(NSString*)possibleIddPrefix; +- (BOOL)maybeStripNationalPrefixAndCarrierCode:(NSString **)numberStr + metadata:(NBPhoneMetaData *)metadata + carrierCode:(NSString **)carrierCode; +- (NBECountryCodeSource)maybeStripInternationalPrefixAndNormalize:(NSString **)numberStr + possibleIddPrefix:(NSString *)possibleIddPrefix; -- (NSNumber*)maybeExtractCountryCode:(NSString*)number metadata:(NBPhoneMetaData*)defaultRegionMetadata - nationalNumber:(NSString**)nationalNumber keepRawInput:(BOOL)keepRawInput - phoneNumber:(NBPhoneNumber**)phoneNumber error:(NSError**)error; +- (NSNumber *)maybeExtractCountryCode:(NSString *)number + metadata:(NBPhoneMetaData *)defaultRegionMetadata + nationalNumber:(NSString **)nationalNumber + keepRawInput:(BOOL)keepRawInput + phoneNumber:(NBPhoneNumber **)phoneNumber + error:(NSError **)error; -- (NBPhoneNumber*)parse:(NSString*)numberToParse defaultRegion:(NSString*)defaultRegion error:(NSError**)error; -- (NBPhoneNumber*)parseAndKeepRawInput:(NSString*)numberToParse defaultRegion:(NSString*)defaultRegion error:(NSError**)error; -- (NBPhoneNumber*)parseWithPhoneCarrierRegion:(NSString*)numberToParse error:(NSError**)error; +- (NBPhoneNumber *)parse:(NSString *)numberToParse + defaultRegion:(NSString *)defaultRegion + error:(NSError **)error; +- (NBPhoneNumber *)parseAndKeepRawInput:(NSString *)numberToParse + defaultRegion:(NSString *)defaultRegion + error:(NSError **)error; +- (NBPhoneNumber *)parseWithPhoneCarrierRegion:(NSString *)numberToParse error:(NSError **)error; -- (NSString*)format:(NBPhoneNumber*)phoneNumber numberFormat:(NBEPhoneNumberFormat)numberFormat error:(NSError**)error; -- (NSString*)formatByPattern:(NBPhoneNumber*)number numberFormat:(NBEPhoneNumberFormat)numberFormat userDefinedFormats:(NSArray*)userDefinedFormats error:(NSError**)error; -- (NSString*)formatNumberForMobileDialing:(NBPhoneNumber*)number regionCallingFrom:(NSString*)regionCallingFrom withFormatting:(BOOL)withFormatting error:(NSError**)error; -- (NSString*)formatOutOfCountryCallingNumber:(NBPhoneNumber*)number regionCallingFrom:(NSString*)regionCallingFrom error:(NSError**)error; -- (NSString*)formatOutOfCountryKeepingAlphaChars:(NBPhoneNumber*)number regionCallingFrom:(NSString*)regionCallingFrom error:(NSError**)error; -- (NSString*)formatNationalNumberWithCarrierCode:(NBPhoneNumber*)number carrierCode:(NSString*)carrierCode error:(NSError**)error; -- (NSString*)formatInOriginalFormat:(NBPhoneNumber*)number regionCallingFrom:(NSString*)regionCallingFrom error:(NSError**)error; -- (NSString*)formatNationalNumberWithPreferredCarrierCode:(NBPhoneNumber*)number fallbackCarrierCode:(NSString*)fallbackCarrierCode error:(NSError**)error; +- (NSString *)format:(NBPhoneNumber *)phoneNumber + numberFormat:(NBEPhoneNumberFormat)numberFormat + error:(NSError **)error; +- (NSString *)formatByPattern:(NBPhoneNumber *)number + numberFormat:(NBEPhoneNumberFormat)numberFormat + userDefinedFormats:(NSArray *)userDefinedFormats + error:(NSError **)error; +- (NSString *)formatNumberForMobileDialing:(NBPhoneNumber *)number + regionCallingFrom:(NSString *)regionCallingFrom + withFormatting:(BOOL)withFormatting + error:(NSError **)error; +- (NSString *)formatOutOfCountryCallingNumber:(NBPhoneNumber *)number + regionCallingFrom:(NSString *)regionCallingFrom + error:(NSError **)error; +- (NSString *)formatOutOfCountryKeepingAlphaChars:(NBPhoneNumber *)number + regionCallingFrom:(NSString *)regionCallingFrom + error:(NSError **)error; +- (NSString *)formatNationalNumberWithCarrierCode:(NBPhoneNumber *)number + carrierCode:(NSString *)carrierCode + error:(NSError **)error; +- (NSString *)formatInOriginalFormat:(NBPhoneNumber *)number + regionCallingFrom:(NSString *)regionCallingFrom + error:(NSError **)error; +- (NSString *)formatNationalNumberWithPreferredCarrierCode:(NBPhoneNumber *)number + fallbackCarrierCode:(NSString *)fallbackCarrierCode + error:(NSError **)error; -- (BOOL)formattingRuleHasFirstGroupOnly:(NSString*)nationalPrefixFormattingRule; +- (BOOL)formattingRuleHasFirstGroupOnly:(NSString *)nationalPrefixFormattingRule; -@property (nonatomic, strong, readonly) NSDictionary *DIGIT_MAPPINGS; +@property(nonatomic, strong, readonly) NSDictionary *DIGIT_MAPPINGS; @end diff --git a/libPhoneNumber/NBPhoneNumberUtil.m b/libPhoneNumber/NBPhoneNumberUtil.m old mode 100755 new mode 100644 index 554491b..be66d3d --- a/libPhoneNumber/NBPhoneNumberUtil.m +++ b/libPhoneNumber/NBPhoneNumberUtil.m @@ -7,46 +7,44 @@ // #import "NBPhoneNumberUtil.h" -#import "NBPhoneNumberDefines.h" -#import "NBPhoneNumber.h" -#import "NBNumberFormat.h" -#import "NBPhoneNumberDesc.h" -#import "NBPhoneMetaData.h" -#import "NBMetadataHelper.h" #import +#import "NBMetadataHelper.h" +#import "NBNumberFormat.h" +#import "NBPhoneMetaData.h" +#import "NBPhoneNumber.h" +#import "NBPhoneNumberDefines.h" +#import "NBPhoneNumberDesc.h" #if TARGET_OS_IOS -#import #import +#import #endif static NSString *NormalizeNonBreakingSpace(NSString *aString) { return [aString stringByReplacingOccurrencesOfString:NB_NON_BREAKING_SPACE withString:@" "]; } - #pragma mark - NBPhoneNumberUtil interface - @interface NBPhoneNumberUtil () -@property (nonatomic, strong) NSLock *entireStringCacheLock; -@property (nonatomic, strong) NSMutableDictionary *entireStringRegexCache; +@property(nonatomic, strong) NSLock *entireStringCacheLock; +@property(nonatomic, strong) NSMutableDictionary *entireStringRegexCache; -@property (nonatomic, strong) NSLock *lockPatternCache; -@property (nonatomic, strong) NSMutableDictionary *regexPatternCache; +@property(nonatomic, strong) NSLock *lockPatternCache; +@property(nonatomic, strong) NSMutableDictionary *regexPatternCache; -@property (nonatomic, strong) NSRegularExpression *CAPTURING_DIGIT_PATTERN; -@property (nonatomic, strong) NSRegularExpression *VALID_ALPHA_PHONE_PATTERN; +@property(nonatomic, strong) NSRegularExpression *CAPTURING_DIGIT_PATTERN; +@property(nonatomic, strong) NSRegularExpression *VALID_ALPHA_PHONE_PATTERN; -@property (nonatomic, strong) NBMetadataHelper *helper; +@property(nonatomic, strong) NBMetadataHelper *helper; #if TARGET_OS_IOS -@property (nonatomic, readonly) CTTelephonyNetworkInfo *telephonyNetworkInfo; +@property(nonatomic, readonly) CTTelephonyNetworkInfo *telephonyNetworkInfo; #endif @end - @implementation NBPhoneNumberUtil #pragma mark - Static Int variables - @@ -57,7 +55,8 @@ const static NSUInteger MAX_LENGTH_COUNTRY_CODE_ = 3; const static NSUInteger MAX_INPUT_STRING_LENGTH_ = 250; #pragma mark - Static String variables - -static NSString *VALID_PUNCTUATION = @"-x‐-―−ー--/ ­​⁠ ()()[].\\[\\]/~⁓∼~"; +static NSString *VALID_PUNCTUATION = + @"-x‐-―−ー--/ ­​⁠ ()()[].\\[\\]/~⁓∼~"; static NSString *COLOMBIA_MOBILE_TO_FIXED_LINE_PREFIX = @"3"; static NSString *PLUS_SIGN = @"+"; @@ -96,266 +95,266 @@ static NSDictionary *DIGIT_MAPPINGS; static NSArray *GEO_MOBILE_COUNTRIES; - #pragma mark - Deprecated methods -+ (NBPhoneNumberUtil *)sharedInstance -{ - static NBPhoneNumberUtil *sharedOnceInstance = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ sharedOnceInstance = [[self alloc] init]; }); - return sharedOnceInstance; ++ (NBPhoneNumberUtil *)sharedInstance { + static NBPhoneNumberUtil *sharedOnceInstance = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sharedOnceInstance = [[self alloc] init]; + }); + return sharedOnceInstance; } - #pragma mark - NSError -- (NSError*)errorWithObject:(id)obj withDomain:(NSString *)domain -{ - NSDictionary *userInfo = [NSDictionary dictionaryWithObject:obj forKey:NSLocalizedDescriptionKey]; - NSError *error = [NSError errorWithDomain:domain code:0 userInfo:userInfo]; - return error; +- (NSError *)errorWithObject:(id)obj withDomain:(NSString *)domain { + NSDictionary *userInfo = [NSDictionary dictionaryWithObject:obj forKey:NSLocalizedDescriptionKey]; + NSError *error = [NSError errorWithDomain:domain code:0 userInfo:userInfo]; + return error; } - - (NSRegularExpression *)entireRegularExpressionWithPattern:(NSString *)regexPattern options:(NSRegularExpressionOptions)options - error:(NSError **)error -{ - [_entireStringCacheLock lock]; - - @try { - if (!_entireStringRegexCache) { - _entireStringRegexCache = [[NSMutableDictionary alloc] init]; - } - - NSRegularExpression *regex = [_entireStringRegexCache objectForKey:regexPattern]; - if (! regex) - { - NSString *finalRegexString = regexPattern; - if ([regexPattern rangeOfString:@"^"].location == NSNotFound) { - finalRegexString = [NSString stringWithFormat:@"^(?:%@)$", regexPattern]; - } - - regex = [self regularExpressionWithPattern:finalRegexString options:0 error:error]; - [_entireStringRegexCache setObject:regex forKey:regexPattern]; - } - - return regex; + error:(NSError **)error { + [_entireStringCacheLock lock]; + + @try { + if (!_entireStringRegexCache) { + _entireStringRegexCache = [[NSMutableDictionary alloc] init]; } - @finally { - [_entireStringCacheLock unlock]; + + NSRegularExpression *regex = [_entireStringRegexCache objectForKey:regexPattern]; + if (!regex) { + NSString *finalRegexString = regexPattern; + if ([regexPattern rangeOfString:@"^"].location == NSNotFound) { + finalRegexString = [NSString stringWithFormat:@"^(?:%@)$", regexPattern]; + } + + regex = [self regularExpressionWithPattern:finalRegexString options:0 error:error]; + [_entireStringRegexCache setObject:regex forKey:regexPattern]; } + + return regex; + } @finally { + [_entireStringCacheLock unlock]; + } } +- (NSRegularExpression *)regularExpressionWithPattern:(NSString *)pattern + options:(NSRegularExpressionOptions)options + error:(NSError **)error { + [_lockPatternCache lock]; -- (NSRegularExpression *)regularExpressionWithPattern:(NSString *)pattern options:(NSRegularExpressionOptions)options error:(NSError **)error -{ - [_lockPatternCache lock]; - - @try { - if (!_regexPatternCache) { - _regexPatternCache = [[NSMutableDictionary alloc] init]; - } - - NSRegularExpression *regex = [_regexPatternCache objectForKey:pattern]; - if (!regex) { - regex = [NSRegularExpression regularExpressionWithPattern:pattern options:options error:error]; - [_regexPatternCache setObject:regex forKey:pattern]; - } - return regex; + @try { + if (!_regexPatternCache) { + _regexPatternCache = [[NSMutableDictionary alloc] init]; } - @finally { - [_lockPatternCache unlock]; + + NSRegularExpression *regex = [_regexPatternCache objectForKey:pattern]; + if (!regex) { + regex = + [NSRegularExpression regularExpressionWithPattern:pattern options:options error:error]; + [_regexPatternCache setObject:regex forKey:pattern]; } + return regex; + } @finally { + [_lockPatternCache unlock]; + } } - -- (NSMutableArray*)componentsSeparatedByRegex:(NSString *)sourceString regex:(NSString *)pattern -{ - NSString *replacedString = [self replaceStringByRegex:sourceString regex:pattern withTemplate:@""]; - NSMutableArray *resArray = [[replacedString componentsSeparatedByString:@""] mutableCopy]; - [resArray removeObject:@""]; - return resArray; +- (NSMutableArray *)componentsSeparatedByRegex:(NSString *)sourceString regex:(NSString *)pattern { + NSString *replacedString = + [self replaceStringByRegex:sourceString regex:pattern withTemplate:@""]; + NSMutableArray *resArray = [[replacedString componentsSeparatedByString:@""] mutableCopy]; + [resArray removeObject:@""]; + return resArray; } - -- (int)stringPositionByRegex:(NSString *)sourceString regex:(NSString *)pattern -{ - if (sourceString == nil || sourceString.length <= 0 || pattern == nil || pattern.length <= 0) { - return -1; - } - - NSError *error = nil; - NSRegularExpression *currentPattern = [self regularExpressionWithPattern:pattern options:0 error:&error]; - NSArray *matches = [currentPattern matchesInString:sourceString options:0 range:NSMakeRange(0, sourceString.length)]; - - int foundPosition = -1; - - if (matches.count > 0) { - NSTextCheckingResult *match = [matches objectAtIndex:0]; - return (int)match.range.location; - } - - return foundPosition; -} - - -- (int)indexOfStringByString:(NSString *)sourceString target:(NSString *)targetString -{ - NSRange finded = [sourceString rangeOfString:targetString]; - if (finded.location != NSNotFound) { - return (int)finded.location; - } - +- (int)stringPositionByRegex:(NSString *)sourceString regex:(NSString *)pattern { + if (sourceString == nil || sourceString.length <= 0 || pattern == nil || pattern.length <= 0) { return -1; + } + + NSError *error = nil; + NSRegularExpression *currentPattern = + [self regularExpressionWithPattern:pattern options:0 error:&error]; + NSArray *matches = [currentPattern matchesInString:sourceString + options:0 + range:NSMakeRange(0, sourceString.length)]; + + int foundPosition = -1; + + if (matches.count > 0) { + NSTextCheckingResult *match = [matches objectAtIndex:0]; + return (int)match.range.location; + } + + return foundPosition; } +- (int)indexOfStringByString:(NSString *)sourceString target:(NSString *)targetString { + NSRange finded = [sourceString rangeOfString:targetString]; + if (finded.location != NSNotFound) { + return (int)finded.location; + } + + return -1; +} + +- (NSString *)replaceFirstStringByRegex:(NSString *)sourceString + regex:(NSString *)pattern + withTemplate:(NSString *)templateString { + NSString *replacementResult = [sourceString copy]; + NSError *error = nil; + + NSRegularExpression *currentPattern = + [self regularExpressionWithPattern:pattern options:0 error:&error]; + NSRange replaceRange = + [currentPattern rangeOfFirstMatchInString:sourceString + options:0 + range:NSMakeRange(0, sourceString.length)]; + + if (replaceRange.location != NSNotFound) { + replacementResult = [currentPattern stringByReplacingMatchesInString:[sourceString mutableCopy] + options:0 + range:replaceRange + withTemplate:templateString]; + } + + return replacementResult; +} + +- (NSString *)replaceStringByRegex:(NSString *)sourceString + regex:(NSString *)pattern + withTemplate:(NSString *)templateString { + NSString *replacementResult = [sourceString copy]; + NSError *error = nil; + + NSRegularExpression *currentPattern = + [self regularExpressionWithPattern:pattern options:0 error:&error]; + NSArray *matches = [currentPattern matchesInString:sourceString + options:0 + range:NSMakeRange(0, sourceString.length)]; + + if ([matches count] == 1) { + NSRange replaceRange = + [currentPattern rangeOfFirstMatchInString:sourceString + options:0 + range:NSMakeRange(0, sourceString.length)]; -- (NSString *)replaceFirstStringByRegex:(NSString *)sourceString regex:(NSString *)pattern withTemplate:(NSString *)templateString -{ - NSString *replacementResult = [sourceString copy]; - NSError *error = nil; - - NSRegularExpression *currentPattern = [self regularExpressionWithPattern:pattern options:0 error:&error]; - NSRange replaceRange = [currentPattern rangeOfFirstMatchInString:sourceString options:0 range:NSMakeRange(0, sourceString.length)]; - if (replaceRange.location != NSNotFound) { - replacementResult = [currentPattern stringByReplacingMatchesInString:[sourceString mutableCopy] options:0 - range:replaceRange - withTemplate:templateString]; + replacementResult = + [currentPattern stringByReplacingMatchesInString:[sourceString mutableCopy] + options:0 + range:replaceRange + withTemplate:templateString]; } - return replacementResult; -} + } - -- (NSString *)replaceStringByRegex:(NSString *)sourceString regex:(NSString *)pattern withTemplate:(NSString *)templateString -{ - NSString *replacementResult = [sourceString copy]; - NSError *error = nil; - - NSRegularExpression *currentPattern = [self regularExpressionWithPattern:pattern options:0 error:&error]; - NSArray *matches = [currentPattern matchesInString:sourceString options:0 range:NSMakeRange(0, sourceString.length)]; - - if ([matches count] == 1) { - NSRange replaceRange = [currentPattern rangeOfFirstMatchInString:sourceString options:0 range:NSMakeRange(0, sourceString.length)]; - - if (replaceRange.location != NSNotFound) { - replacementResult = [currentPattern stringByReplacingMatchesInString:[sourceString mutableCopy] options:0 - range:replaceRange - withTemplate:templateString]; - } - return replacementResult; - } - - if ([matches count] > 1) { - replacementResult = [currentPattern stringByReplacingMatchesInString:[replacementResult mutableCopy] options:0 - range:NSMakeRange(0, sourceString.length) withTemplate:templateString]; - return replacementResult; - } - + if ([matches count] > 1) { + replacementResult = + [currentPattern stringByReplacingMatchesInString:[replacementResult mutableCopy] + options:0 + range:NSMakeRange(0, sourceString.length) + withTemplate:templateString]; return replacementResult; + } + + return replacementResult; } - -- (NSTextCheckingResult*)matchFirstByRegex:(NSString *)sourceString regex:(NSString *)pattern -{ - NSError *error = nil; - NSRegularExpression *currentPattern = [self regularExpressionWithPattern:pattern options:0 error:&error]; - NSArray *matches = [currentPattern matchesInString:sourceString options:0 range:NSMakeRange(0, sourceString.length)]; - if ([matches count] > 0) - return [matches objectAtIndex:0]; - return nil; +- (NSTextCheckingResult *)matchFirstByRegex:(NSString *)sourceString regex:(NSString *)pattern { + NSError *error = nil; + NSRegularExpression *currentPattern = + [self regularExpressionWithPattern:pattern options:0 error:&error]; + NSArray *matches = [currentPattern matchesInString:sourceString + options:0 + range:NSMakeRange(0, sourceString.length)]; + if ([matches count] > 0) return [matches objectAtIndex:0]; + return nil; } - -- (NSArray*)matchesByRegex:(NSString *)sourceString regex:(NSString *)pattern -{ - NSError *error = nil; - NSRegularExpression *currentPattern = [self regularExpressionWithPattern:pattern options:0 error:&error]; - NSArray *matches = [currentPattern matchesInString:sourceString options:0 range:NSMakeRange(0, sourceString.length)]; - return matches; +- (NSArray *)matchesByRegex:(NSString *)sourceString regex:(NSString *)pattern { + NSError *error = nil; + NSRegularExpression *currentPattern = + [self regularExpressionWithPattern:pattern options:0 error:&error]; + NSArray *matches = [currentPattern matchesInString:sourceString + options:0 + range:NSMakeRange(0, sourceString.length)]; + return matches; } +- (NSArray *)matchedStringByRegex:(NSString *)sourceString regex:(NSString *)pattern { + NSArray *matches = [self matchesByRegex:sourceString regex:pattern]; + NSMutableArray *matchString = [[NSMutableArray alloc] init]; -- (NSArray*)matchedStringByRegex:(NSString *)sourceString regex:(NSString *)pattern -{ - NSArray *matches = [self matchesByRegex:sourceString regex:pattern]; - NSMutableArray *matchString = [[NSMutableArray alloc] init]; - - for (NSTextCheckingResult *match in matches) { - NSString *curString = [sourceString substringWithRange:match.range]; - [matchString addObject:curString]; + for (NSTextCheckingResult *match in matches) { + NSString *curString = [sourceString substringWithRange:match.range]; + [matchString addObject:curString]; + } + + return matchString; +} + +- (BOOL)isStartingStringByRegex:(NSString *)sourceString regex:(NSString *)pattern { + NSError *error = nil; + NSRegularExpression *currentPattern = + [self regularExpressionWithPattern:pattern options:0 error:&error]; + NSArray *matches = [currentPattern matchesInString:sourceString + options:0 + range:NSMakeRange(0, sourceString.length)]; + + for (NSTextCheckingResult *match in matches) { + if (match.range.location == 0) { + return YES; } - - return matchString; + } + + return NO; } - -- (BOOL)isStartingStringByRegex:(NSString *)sourceString regex:(NSString *)pattern -{ - NSError *error = nil; - NSRegularExpression *currentPattern = [self regularExpressionWithPattern:pattern options:0 error:&error]; - NSArray *matches = [currentPattern matchesInString:sourceString options:0 range:NSMakeRange(0, sourceString.length)]; - - for (NSTextCheckingResult *match in matches) { - if (match.range.location == 0) { - return YES; - } +- (NSString *)stringByReplacingOccurrencesString:(NSString *)sourceString + withMap:(NSDictionary *)dicMap + removeNonMatches:(BOOL)bRemove { + NSMutableString *targetString = [[NSMutableString alloc] init]; + NSUInteger length = sourceString.length; + for (NSUInteger i = 0; i < length; i++) { + unichar oneChar = [sourceString characterAtIndex:i]; + NSString *keyString = [NSString stringWithCharacters:&oneChar length:1]; + NSString *mappedValue = [dicMap objectForKey:keyString]; + if (mappedValue != nil) { + [targetString appendString:mappedValue]; + } else { + if (bRemove == NO) { + [targetString appendString:keyString]; + } } - - return NO; + } + + return targetString; } - -- (NSString *)stringByReplacingOccurrencesString:(NSString *)sourceString withMap:(NSDictionary *)dicMap removeNonMatches:(BOOL)bRemove -{ - NSMutableString *targetString = [[NSMutableString alloc] init]; - NSUInteger length = sourceString.length; - for(NSUInteger i = 0; i < length; i++) - { - unichar oneChar = [sourceString characterAtIndex:i]; - NSString *keyString = [NSString stringWithCharacters:&oneChar length:1]; - NSString *mappedValue = [dicMap objectForKey:keyString]; - if (mappedValue != nil) { - [targetString appendString:mappedValue]; - } else { - if (bRemove == NO) { - [targetString appendString:keyString]; - } - } - } - - return targetString; +- (BOOL)isAllDigits:(NSString *)sourceString { + NSCharacterSet *nonNumbers = [[NSCharacterSet decimalDigitCharacterSet] invertedSet]; + NSRange r = [sourceString rangeOfCharacterFromSet:nonNumbers]; + return r.location == NSNotFound; } - -- (BOOL)isAllDigits:(NSString *)sourceString -{ - NSCharacterSet *nonNumbers = [[NSCharacterSet decimalDigitCharacterSet] invertedSet]; - NSRange r = [sourceString rangeOfCharacterFromSet:nonNumbers]; - return r.location == NSNotFound; +- (BOOL)isNumeric:(NSString *)sourceString { + NSScanner *sc = [NSScanner scannerWithString:sourceString]; + if ([sc scanFloat:NULL]) { + return [sc isAtEnd]; + } + return NO; } - -- (BOOL)isNumeric:(NSString *)sourceString -{ - NSScanner *sc = [NSScanner scannerWithString:sourceString]; - if ([sc scanFloat:NULL]) { - return [sc isAtEnd]; - } - return NO; +- (BOOL)isNaN:(NSString *)sourceString { + if ([self isNumeric:sourceString]) return NO; + return YES; } - -- (BOOL)isNaN:(NSString *)sourceString -{ - if ([self isNumeric:sourceString]) return NO; - return YES; -} - - /** * Gets the national significant number of the a phone number. Note a national * significant number doesn't contain a national prefix or any formatting. @@ -365,144 +364,181 @@ static NSArray *GEO_MOBILE_COUNTRIES; * @return {string} the national significant number of the PhoneNumber object * passed in. */ -- (NSString *)getNationalSignificantNumber:(NBPhoneNumber *)phoneNumber -{ - // If leading zero(s) have been set, we prefix this now. Note this is not a - // national prefix. - NSString *nationalNumber = [phoneNumber.nationalNumber stringValue]; - if (phoneNumber.italianLeadingZero) { - NSString *zeroNumbers = [@"" stringByPaddingToLength:phoneNumber.numberOfLeadingZeros.integerValue withString:@"0" startingAtIndex:0]; - return [NSString stringWithFormat:@"%@%@", zeroNumbers, nationalNumber]; - } - - return [phoneNumber.nationalNumber stringValue]; +- (NSString *)getNationalSignificantNumber:(NBPhoneNumber *)phoneNumber { + // If leading zero(s) have been set, we prefix this now. Note this is not a + // national prefix. + NSString *nationalNumber = [phoneNumber.nationalNumber stringValue]; + if (phoneNumber.italianLeadingZero) { + NSString *zeroNumbers = + [@"" stringByPaddingToLength:phoneNumber.numberOfLeadingZeros.integerValue + withString:@"0" + startingAtIndex:0]; + return [NSString stringWithFormat:@"%@%@", zeroNumbers, nationalNumber]; + } + + return [phoneNumber.nationalNumber stringValue]; } #pragma mark - Initializations - + (void)initialize { - [super initialize]; - - /** - * Set of country calling codes that have geographically assigned mobile - * numbers. This may not be complete; we add calling codes case by case, as we - * find geographical mobile numbers or hear from user reports. - * - * @const - * @type {!Array.} - * @private - */ - // @[ Mexico, Argentina, Brazil ] - GEO_MOBILE_COUNTRIES = @[ @52, @54, @55 ]; + [super initialize]; + + /** + * Set of country calling codes that have geographically assigned mobile + * numbers. This may not be complete; we add calling codes case by case, as we + * find geographical mobile numbers or hear from user reports. + * + * @const + * @type {!Array.} + * @private + */ + // @[ Mexico, Argentina, Brazil ] + GEO_MOBILE_COUNTRIES = @[ @52, @54, @55 ]; } +- (instancetype)init { + self = [super init]; + if (self) { + _lockPatternCache = [[NSLock alloc] init]; + _entireStringCacheLock = [[NSLock alloc] init]; + _helper = [[NBMetadataHelper alloc] init]; + [self initRegularExpressionSet]; + [self initNormalizationMappings]; + } -- (instancetype)init -{ - self = [super init]; - if (self) - { - _lockPatternCache = [[NSLock alloc] init]; - _entireStringCacheLock = [[NSLock alloc] init]; - _helper = [[NBMetadataHelper alloc] init]; - [self initRegularExpressionSet]; - [self initNormalizationMappings]; - } - - return self; + return self; } +- (void)initRegularExpressionSet { + NSError *error = nil; -- (void)initRegularExpressionSet -{ - NSError *error = nil; - - if (!_CAPTURING_DIGIT_PATTERN) { - _CAPTURING_DIGIT_PATTERN = [self regularExpressionWithPattern:[NSString stringWithFormat:@"([%@])", NB_VALID_DIGITS_STRING] options:0 error:&error]; - } + if (!_CAPTURING_DIGIT_PATTERN) { + _CAPTURING_DIGIT_PATTERN = [self + regularExpressionWithPattern:[NSString stringWithFormat:@"([%@])", NB_VALID_DIGITS_STRING] + options:0 + error:&error]; + } - if (!_VALID_ALPHA_PHONE_PATTERN) { - _VALID_ALPHA_PHONE_PATTERN = [self regularExpressionWithPattern:VALID_ALPHA_PHONE_PATTERN_STRING options:0 error:&error]; - } + if (!_VALID_ALPHA_PHONE_PATTERN) { + _VALID_ALPHA_PHONE_PATTERN = + [self regularExpressionWithPattern:VALID_ALPHA_PHONE_PATTERN_STRING options:0 error:&error]; + } - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - NSString *EXTN_PATTERNS_FOR_PARSING = @"(?:;ext=([0-90-9٠-٩۰-۹]{1,7})|[ \\t,]*(?:e?xt(?:ensi(?:ó?|ó))?n?|e?xtn?|[,xxX##~~]|int|anexo|int)[:\\..]?[ \\t,-]*([0-90-9٠-٩۰-۹]{1,7})#?|[- ]+([0-90-9٠-٩۰-۹]{1,5})#)$"; + static dispatch_once_t onceToken; + dispatch_once( + &onceToken, ^{ + NSString *EXTN_PATTERNS_FOR_PARSING = + @"(?:;ext=([0-90-9٠-٩۰-۹]{1,7})|[ " + @"\\t,]*(?:e?xt(?:ensi(?:ó?|ó))?n?|e?xtn?|[,xxX##~~]|int|anexo|int)[:\\..]?[" + @" \\t,-]*([0-90-9٠-٩۰-۹]{1,7})#?|[- ]+([0-90-9٠-٩۰-۹]{1,5})#)$"; LEADING_PLUS_CHARS_PATTERN = [NSString stringWithFormat:@"^[%@]+", NB_PLUS_CHARS]; - VALID_START_CHAR_PATTERN = [NSString stringWithFormat:@"[%@%@]", NB_PLUS_CHARS, NB_VALID_DIGITS_STRING]; + VALID_START_CHAR_PATTERN = + [NSString stringWithFormat:@"[%@%@]", NB_PLUS_CHARS, NB_VALID_DIGITS_STRING]; SECOND_NUMBER_START_PATTERN = @"[\\\\\\/] *x"; - UNWANTED_END_CHAR_PATTERN = [NSString stringWithFormat:@"[^%@%@#]+$", NB_VALID_DIGITS_STRING, VALID_ALPHA]; + UNWANTED_END_CHAR_PATTERN = + [NSString stringWithFormat:@"[^%@%@#]+$", NB_VALID_DIGITS_STRING, VALID_ALPHA]; EXTN_PATTERN = [NSString stringWithFormat:@"(?:%@)$", EXTN_PATTERNS_FOR_PARSING]; SEPARATOR_PATTERN = [NSString stringWithFormat:@"[%@]+", VALID_PUNCTUATION]; - VALID_PHONE_NUMBER_PATTERN = @"^[0-90-9٠-٩۰-۹]{2}$|^[++]*(?:[-x‐-―−ー--/ ­​⁠ ()()[].\\[\\]/~⁓∼~*]*[0-90-9٠-٩۰-۹]){3,}[-x‐-―−ー--/ ­​⁠ ()()[].\\[\\]/~⁓∼~*A-Za-z0-90-9٠-٩۰-۹]*(?:;ext=([0-90-9٠-٩۰-۹]{1,7})|[ \\t,]*(?:e?xt(?:ensi(?:ó?|ó))?n?|e?xtn?|[,xx##~~]|int|anexo|int)[:\\..]?[ \\t,-]*([0-90-9٠-٩۰-۹]{1,7})#?|[- ]+([0-90-9٠-٩۰-۹]{1,5})#)?$"; - }); + VALID_PHONE_NUMBER_PATTERN = + @"^[0-90-9٠-٩۰-۹]{2}$|^[++]*(?:[-x‐-―−ー--/ " + @"­​⁠ ()()[].\\[\\]/~⁓∼~*]*[0-90-9٠-٩۰-۹]){3,}[-x‐-―−ー--/ " + @"­​⁠ ()()[].\\[\\]/" + @"~⁓∼~*A-Za-z0-90-9٠-٩۰-۹]*(?:;ext=([0-90-9٠-٩۰-۹]{1,7})|[ " + @"\\t,]*(?:e?xt(?:ensi(?:ó?|ó))?n?|e?xtn?|[,xx##~~]|int|anexo|int)[:\\..]?[ " + @" \\t,-]*([0-90-9٠-٩۰-۹]{1,7})#?|[- ]+([0-90-9٠-٩۰-۹]{1,5})#)?$"; + }); } -- (NSDictionary *)DIGIT_MAPPINGS -{ - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - DIGIT_MAPPINGS = [NSDictionary dictionaryWithObjectsAndKeys: - @"0", @"0", @"1", @"1", @"2", @"2", @"3", @"3", @"4", @"4", @"5", @"5", @"6", @"6", @"7", @"7", @"8", @"8", @"9", @"9", - // Fullwidth digit 0 to 9 - @"0", @"\uFF10", @"1", @"\uFF11", @"2", @"\uFF12", @"3", @"\uFF13", @"4", @"\uFF14", @"5", @"\uFF15", @"6", @"\uFF16", @"7", @"\uFF17", @"8", @"\uFF18", @"9", @"\uFF19", - // Arabic-indic digit 0 to 9 - @"0", @"\u0660", @"1", @"\u0661", @"2", @"\u0662", @"3", @"\u0663", @"4", @"\u0664", @"5", @"\u0665", @"6", @"\u0666", @"7", @"\u0667", @"8", @"\u0668", @"9", @"\u0669", - // Eastern-Arabic digit 0 to 9 - @"0", @"\u06F0", @"1", @"\u06F1", @"2", @"\u06F2", @"3", @"\u06F3", @"4", @"\u06F4", @"5", @"\u06F5", @"6", @"\u06F6", @"7", @"\u06F7", @"8", @"\u06F8", @"9", @"\u06F9", - // BENGALI digit 0 to 9 - @"0", @"\u09E6", @"1", @"\u09E7", @"2", @"\u09E8", @"3", @"\u09E9", @"4", @"\u09EA", @"5", @"\u09EB", @"6", @"\u09EC", @"7", @"\u09ED", @"8", @"\u09EE", @"9", @"\u09EF", - // DEVANAGARI digit 0 to 9 - @"0", @"\u0966", @"1", @"\u0967", @"2", @"\u0968", @"3", @"\u0969", @"4", @"\u096A", @"5", @"\u096B", @"6", @"\u096C", @"7", @"\u096D", @"8", @"\u096E", @"9", @"\u096F", nil]; - }); +- (NSDictionary *)DIGIT_MAPPINGS { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + DIGIT_MAPPINGS = [NSDictionary + dictionaryWithObjectsAndKeys:@"0", @"0", @"1", @"1", @"2", @"2", @"3", @"3", @"4", @"4", + @"5", @"5", @"6", @"6", @"7", @"7", @"8", @"8", @"9", @"9", + // Fullwidth digit 0 to 9 + @"0", @"\uFF10", @"1", @"\uFF11", @"2", @"\uFF12", @"3", + @"\uFF13", @"4", @"\uFF14", @"5", @"\uFF15", @"6", @"\uFF16", + @"7", @"\uFF17", @"8", @"\uFF18", @"9", @"\uFF19", + // Arabic-indic digit 0 to 9 + @"0", @"\u0660", @"1", @"\u0661", @"2", @"\u0662", @"3", + @"\u0663", @"4", @"\u0664", @"5", @"\u0665", @"6", @"\u0666", + @"7", @"\u0667", @"8", @"\u0668", @"9", @"\u0669", + // Eastern-Arabic digit 0 to 9 + @"0", @"\u06F0", @"1", @"\u06F1", @"2", @"\u06F2", @"3", + @"\u06F3", @"4", @"\u06F4", @"5", @"\u06F5", @"6", @"\u06F6", + @"7", @"\u06F7", @"8", @"\u06F8", @"9", @"\u06F9", + // BENGALI digit 0 to 9 + @"0", @"\u09E6", @"1", @"\u09E7", @"2", @"\u09E8", @"3", + @"\u09E9", @"4", @"\u09EA", @"5", @"\u09EB", @"6", @"\u09EC", + @"7", @"\u09ED", @"8", @"\u09EE", @"9", @"\u09EF", + // DEVANAGARI digit 0 to 9 + @"0", @"\u0966", @"1", @"\u0967", @"2", @"\u0968", @"3", + @"\u0969", @"4", @"\u096A", @"5", @"\u096B", @"6", @"\u096C", + @"7", @"\u096D", @"8", @"\u096E", @"9", @"\u096F", nil]; + }); - return DIGIT_MAPPINGS; + return DIGIT_MAPPINGS; } +- (void)initNormalizationMappings { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + DIALLABLE_CHAR_MAPPINGS = [NSDictionary + dictionaryWithObjectsAndKeys:@"0", @"0", @"1", @"1", @"2", @"2", @"3", @"3", @"4", @"4", + @"5", @"5", @"6", @"6", @"7", @"7", @"8", @"8", @"9", @"9", + @"+", @"+", @"*", @"*", @"#", @"#", nil]; -- (void)initNormalizationMappings -{ - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - DIALLABLE_CHAR_MAPPINGS = [NSDictionary dictionaryWithObjectsAndKeys: - @"0", @"0", @"1", @"1", @"2", @"2", @"3", @"3", @"4", @"4", @"5", @"5", @"6", @"6", @"7", @"7", @"8", @"8", @"9", @"9", - @"+", @"+", @"*", @"*", @"#", @"#", nil]; + ALL_NORMALIZATION_MAPPINGS = [NSDictionary + dictionaryWithObjectsAndKeys:@"0", @"0", @"1", @"1", @"2", @"2", @"3", @"3", @"4", @"4", + @"5", @"5", @"6", @"6", @"7", @"7", @"8", @"8", @"9", @"9", + // Fullwidth digit 0 to 9 + @"0", @"\uFF10", @"1", @"\uFF11", @"2", @"\uFF12", @"3", + @"\uFF13", @"4", @"\uFF14", @"5", @"\uFF15", @"6", @"\uFF16", + @"7", @"\uFF17", @"8", @"\uFF18", @"9", @"\uFF19", + // Arabic-indic digit 0 to 9 + @"0", @"\u0660", @"1", @"\u0661", @"2", @"\u0662", @"3", + @"\u0663", @"4", @"\u0664", @"5", @"\u0665", @"6", @"\u0666", + @"7", @"\u0667", @"8", @"\u0668", @"9", @"\u0669", + // Eastern-Arabic digit 0 to 9 + @"0", @"\u06F0", @"1", @"\u06F1", @"2", @"\u06F2", @"3", + @"\u06F3", @"4", @"\u06F4", @"5", @"\u06F5", @"6", @"\u06F6", + @"7", @"\u06F7", @"8", @"\u06F8", @"9", @"\u06F9", @"2", @"A", + @"2", @"B", @"2", @"C", @"3", @"D", @"3", @"E", @"3", @"F", + @"4", @"G", @"4", @"H", @"4", @"I", @"5", @"J", @"5", @"K", + @"5", @"L", @"6", @"M", @"6", @"N", @"6", @"O", @"7", @"P", + @"7", @"Q", @"7", @"R", @"7", @"S", @"8", @"T", @"8", @"U", + @"8", @"V", @"9", @"W", @"9", @"X", @"9", @"Y", @"9", @"Z", + nil]; - ALL_NORMALIZATION_MAPPINGS = [NSDictionary dictionaryWithObjectsAndKeys: - @"0", @"0", @"1", @"1", @"2", @"2", @"3", @"3", @"4", @"4", @"5", @"5", @"6", @"6", @"7", @"7", @"8", @"8", @"9", @"9", - // Fullwidth digit 0 to 9 - @"0", @"\uFF10", @"1", @"\uFF11", @"2", @"\uFF12", @"3", @"\uFF13", @"4", @"\uFF14", @"5", @"\uFF15", @"6", @"\uFF16", @"7", @"\uFF17", @"8", @"\uFF18", @"9", @"\uFF19", - // Arabic-indic digit 0 to 9 - @"0", @"\u0660", @"1", @"\u0661", @"2", @"\u0662", @"3", @"\u0663", @"4", @"\u0664", @"5", @"\u0665", @"6", @"\u0666", @"7", @"\u0667", @"8", @"\u0668", @"9", @"\u0669", - // Eastern-Arabic digit 0 to 9 - @"0", @"\u06F0", @"1", @"\u06F1", @"2", @"\u06F2", @"3", @"\u06F3", @"4", @"\u06F4", @"5", @"\u06F5", @"6", @"\u06F6", @"7", @"\u06F7", @"8", @"\u06F8", @"9", @"\u06F9", - @"2", @"A", @"2", @"B", @"2", @"C", @"3", @"D", @"3", @"E", @"3", @"F", @"4", @"G", @"4", @"H", @"4", @"I", @"5", @"J", - @"5", @"K", @"5", @"L", @"6", @"M", @"6", @"N", @"6", @"O", @"7", @"P", @"7", @"Q", @"7", @"R", @"7", @"S", @"8", @"T", - @"8", @"U", @"8", @"V", @"9", @"W", @"9", @"X", @"9", @"Y", @"9", @"Z", nil]; - - ALL_PLUS_NUMBER_GROUPING_SYMBOLS = [NSDictionary dictionaryWithObjectsAndKeys: - @"0", @"0", @"1", @"1", @"2", @"2", @"3", @"3", @"4", @"4", @"5", @"5", @"6", @"6", @"7", @"7", @"8", @"8", @"9", @"9", - @"A", @"A", @"B", @"B", @"C", @"C", @"D", @"D", @"E", @"E", @"F", @"F", @"G", @"G", @"H", @"H", @"I", @"I", @"J", @"J", - @"K", @"K", @"L", @"L", @"M", @"M", @"N", @"N", @"O", @"O", @"P", @"P", @"Q", @"Q", @"R", @"R", @"S", @"S", @"T", @"T", - @"U", @"U", @"V", @"V", @"W", @"W", @"X", @"X", @"Y", @"Y", @"Z", @"Z", @"A", @"a", @"B", @"b", @"C", @"c", @"D", @"d", - @"E", @"e", @"F", @"f", @"G", @"g", @"H", @"h", @"I", @"i", @"J", @"j", @"K", @"k", @"L", @"l", @"M", @"m", @"N", @"n", - @"O", @"o", @"P", @"p", @"Q", @"q", @"R", @"r", @"S", @"s", @"T", @"t", @"U", @"u", @"V", @"v", @"W", @"w", @"X", @"x", - @"Y", @"y", @"Z", @"z", @"-", @"-", @"-", @"\uFF0D", @"-", @"\u2010", @"-", @"\u2011", @"-", @"\u2012", @"-", @"\u2013", @"-", @"\u2014", @"-", @"\u2015", - @"-", @"\u2212", @"/", @"/", @"/", @"\uFF0F", @" ", @" ", @" ", @"\u3000", @" ", @"\u2060", @".", @".", @".", @"\uFF0E", nil]; - }); + ALL_PLUS_NUMBER_GROUPING_SYMBOLS = [NSDictionary + dictionaryWithObjectsAndKeys:@"0", @"0", @"1", @"1", @"2", @"2", @"3", @"3", @"4", @"4", + @"5", @"5", @"6", @"6", @"7", @"7", @"8", @"8", @"9", @"9", + @"A", @"A", @"B", @"B", @"C", @"C", @"D", @"D", @"E", @"E", + @"F", @"F", @"G", @"G", @"H", @"H", @"I", @"I", @"J", @"J", + @"K", @"K", @"L", @"L", @"M", @"M", @"N", @"N", @"O", @"O", + @"P", @"P", @"Q", @"Q", @"R", @"R", @"S", @"S", @"T", @"T", + @"U", @"U", @"V", @"V", @"W", @"W", @"X", @"X", @"Y", @"Y", + @"Z", @"Z", @"A", @"a", @"B", @"b", @"C", @"c", @"D", @"d", + @"E", @"e", @"F", @"f", @"G", @"g", @"H", @"h", @"I", @"i", + @"J", @"j", @"K", @"k", @"L", @"l", @"M", @"m", @"N", @"n", + @"O", @"o", @"P", @"p", @"Q", @"q", @"R", @"r", @"S", @"s", + @"T", @"t", @"U", @"u", @"V", @"v", @"W", @"w", @"X", @"x", + @"Y", @"y", @"Z", @"z", @"-", @"-", @"-", @"\uFF0D", @"-", + @"\u2010", @"-", @"\u2011", @"-", @"\u2012", @"-", @"\u2013", + @"-", @"\u2014", @"-", @"\u2015", @"-", @"\u2212", @"/", @"/", + @"/", @"\uFF0F", @" ", @" ", @" ", @"\u3000", @" ", @"\u2060", + @".", @".", @".", @"\uFF0E", nil]; + }); } - - - - #pragma mark - Metadata manager (phonenumberutil.js) functions - /** * Attempts to extract a possible number from the string passed in. This @@ -521,35 +557,30 @@ static NSArray *GEO_MOBILE_COUNTRIES; * 'Tel:') or an empty string if no character used to start phone numbers * (such as + or any digit) is found in the number. */ -- (NSString *)extractPossibleNumber:(NSString *)number -{ - - number = NormalizeNonBreakingSpace(number); - - NSString *possibleNumber = @""; - int start = [self stringPositionByRegex:number regex:VALID_START_CHAR_PATTERN]; - - if (start >= 0) - { - possibleNumber = [number substringFromIndex:start]; - // Remove trailing non-alpha non-numerical characters. - possibleNumber = [self replaceStringByRegex:possibleNumber regex:UNWANTED_END_CHAR_PATTERN withTemplate:@""]; - - // Check for extra numbers at the end. - int secondNumberStart = [self stringPositionByRegex:possibleNumber regex:SECOND_NUMBER_START_PATTERN]; - if (secondNumberStart > 0) - { - possibleNumber = [possibleNumber substringWithRange:NSMakeRange(0, secondNumberStart)]; - } - } - else - { - possibleNumber = @""; - } - - return possibleNumber; -} +- (NSString *)extractPossibleNumber:(NSString *)number { + number = NormalizeNonBreakingSpace(number); + NSString *possibleNumber = @""; + int start = [self stringPositionByRegex:number regex:VALID_START_CHAR_PATTERN]; + + if (start >= 0) { + possibleNumber = [number substringFromIndex:start]; + // Remove trailing non-alpha non-numerical characters. + possibleNumber = + [self replaceStringByRegex:possibleNumber regex:UNWANTED_END_CHAR_PATTERN withTemplate:@""]; + + // Check for extra numbers at the end. + int secondNumberStart = + [self stringPositionByRegex:possibleNumber regex:SECOND_NUMBER_START_PATTERN]; + if (secondNumberStart > 0) { + possibleNumber = [possibleNumber substringWithRange:NSMakeRange(0, secondNumberStart)]; + } + } else { + possibleNumber = @""; + } + + return possibleNumber; +} /** * Checks to see if the string of characters could possibly be a phone number at @@ -563,18 +594,15 @@ static NSArray *GEO_MOBILE_COUNTRIES; * @return {boolean} NO if the number could be a phone number of some sort, * otherwise NO. */ -- (BOOL)isViablePhoneNumber:(NSString *)phoneNumber -{ - phoneNumber = NormalizeNonBreakingSpace(phoneNumber); - - if (phoneNumber.length < MIN_LENGTH_FOR_NSN_) - { - return NO; - } - - return [self matchesEntirely:VALID_PHONE_NUMBER_PATTERN string:phoneNumber]; -} +- (BOOL)isViablePhoneNumber:(NSString *)phoneNumber { + phoneNumber = NormalizeNonBreakingSpace(phoneNumber); + if (phoneNumber.length < MIN_LENGTH_FOR_NSN_) { + return NO; + } + + return [self matchesEntirely:VALID_PHONE_NUMBER_PATTERN string:phoneNumber]; +} /** * Normalizes a string of characters representing a phone number. This performs @@ -593,18 +621,17 @@ static NSArray *GEO_MOBILE_COUNTRIES; * - param {string} number a string of characters representing a phone number. * @return {string} the normalized string version of the phone number. */ -- (NSString *)normalize:(NSString *)number -{ - if ([self matchesEntirely:VALID_ALPHA_PHONE_PATTERN_STRING string:number]) { - return [self normalizeHelper:number normalizationReplacements:ALL_NORMALIZATION_MAPPINGS removeNonMatches:true]; - } - else { - return [self normalizeDigitsOnly:number]; - } - - return nil; -} +- (NSString *)normalize:(NSString *)number { + if ([self matchesEntirely:VALID_ALPHA_PHONE_PATTERN_STRING string:number]) { + return [self normalizeHelper:number + normalizationReplacements:ALL_NORMALIZATION_MAPPINGS + removeNonMatches:true]; + } else { + return [self normalizeDigitsOnly:number]; + } + return nil; +} /** * Normalizes a string of characters representing a phone number. This is a @@ -616,15 +643,13 @@ static NSArray *GEO_MOBILE_COUNTRIES; * @private */ -- (void)normalizeSB:(NSString **)number -{ - if (number == NULL) { - return; - } - - (*number) = [self normalize:(*number)]; -} +- (void)normalizeSB:(NSString **)number { + if (number == NULL) { + return; + } + (*number) = [self normalize:(*number)]; +} /** * Normalizes a string of characters representing a phone number. This converts @@ -634,29 +659,29 @@ static NSArray *GEO_MOBILE_COUNTRIES; * - param {string} number a string of characters representing a phone number. * @return {string} the normalized string version of the phone number. */ -- (NSString *)normalizeDigitsOnly:(NSString *)number -{ - number = NormalizeNonBreakingSpace(number); - - return [self stringByReplacingOccurrencesString:number withMap:self.DIGIT_MAPPINGS removeNonMatches:YES]; -} - - -/** - * Normalizes a string of characters representing a phone number. This strips - * all characters which are not diallable on a mobile phone keypad (including - * all non-ASCII digits). - * - * - param {string} number a string of characters representing a phone number. - * @return {string} the normalized string version of the phone number. - */ -- (NSString*)normalizeDiallableCharsOnly:(NSString*)number -{ +- (NSString *)normalizeDigitsOnly:(NSString *)number { number = NormalizeNonBreakingSpace(number); - return [self stringByReplacingOccurrencesString:number withMap:DIALLABLE_CHAR_MAPPINGS removeNonMatches:YES]; + return [self stringByReplacingOccurrencesString:number + withMap:self.DIGIT_MAPPINGS + removeNonMatches:YES]; } +/** + * Normalizes a string of characters representing a phone number. This strips + * all characters which are not diallable on a mobile phone keypad (including + * all non-ASCII digits). + * + * - param {string} number a string of characters representing a phone number. + * @return {string} the normalized string version of the phone number. + */ +- (NSString *)normalizeDiallableCharsOnly:(NSString *)number { + number = NormalizeNonBreakingSpace(number); + + return [self stringByReplacingOccurrencesString:number + withMap:DIALLABLE_CHAR_MAPPINGS + removeNonMatches:YES]; +} /** * Converts all alpha characters in a number to their respective digits on a @@ -666,13 +691,13 @@ static NSArray *GEO_MOBILE_COUNTRIES; * - param {string} number a string of characters representing a phone number. * @return {string} the normalized string version of the phone number. */ -- (NSString *)convertAlphaCharactersInNumber:(NSString *)number -{ - number = NormalizeNonBreakingSpace(number); - return [self stringByReplacingOccurrencesString:number withMap:ALL_NORMALIZATION_MAPPINGS removeNonMatches:NO]; +- (NSString *)convertAlphaCharactersInNumber:(NSString *)number { + number = NormalizeNonBreakingSpace(number); + return [self stringByReplacingOccurrencesString:number + withMap:ALL_NORMALIZATION_MAPPINGS + removeNonMatches:NO]; } - /** * Gets the length of the geographical area code from the * {@code national_number} field of the PhoneNumber object passed in, so that @@ -719,47 +744,42 @@ static NSArray *GEO_MOBILE_COUNTRIES; * which clients want to know the length of the area code. * @return {number} the length of area code of the PhoneNumber object passed in. */ -- (int)getLengthOfGeographicalAreaCode:(NBPhoneNumber*)phoneNumber error:(NSError **)error -{ - int res = 0; - @try { - res = [self getLengthOfGeographicalAreaCode:phoneNumber]; +- (int)getLengthOfGeographicalAreaCode:(NBPhoneNumber *)phoneNumber error:(NSError **)error { + int res = 0; + @try { + res = [self getLengthOfGeographicalAreaCode:phoneNumber]; + } @catch (NSException *exception) { + NSDictionary *userInfo = + [NSDictionary dictionaryWithObject:exception.reason forKey:NSLocalizedDescriptionKey]; + if (error != NULL) { + (*error) = [NSError errorWithDomain:exception.name code:0 userInfo:userInfo]; } - @catch (NSException *exception) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObject:exception.reason - forKey:NSLocalizedDescriptionKey]; - if (error != NULL) { - (*error) = [NSError errorWithDomain:exception.name code:0 userInfo:userInfo]; - } - } - return res; + } + return res; } +- (int)getLengthOfGeographicalAreaCode:(NBPhoneNumber *)phoneNumber { + NSString *regionCode = [self getRegionCodeForNumber:phoneNumber]; -- (int)getLengthOfGeographicalAreaCode:(NBPhoneNumber*)phoneNumber -{ - NSString *regionCode = [self getRegionCodeForNumber:phoneNumber]; - - NBPhoneMetaData *metadata = [self.helper getMetadataForRegion:regionCode]; - - if (metadata == nil) { - return 0; - } - // If a country doesn't use a national prefix, and this number doesn't have - // an Italian leading zero, we assume it is a closed dialling plan with no - // area codes. - if (metadata.nationalPrefix == nil && phoneNumber.italianLeadingZero == NO) { - return 0; - } - - if ([self isNumberGeographical:phoneNumber] == NO) { - return 0; - } - - return [self getLengthOfNationalDestinationCode:phoneNumber]; + NBPhoneMetaData *metadata = [self.helper getMetadataForRegion:regionCode]; + + if (metadata == nil) { + return 0; + } + // If a country doesn't use a national prefix, and this number doesn't have + // an Italian leading zero, we assume it is a closed dialling plan with no + // area codes. + if (metadata.nationalPrefix == nil && phoneNumber.italianLeadingZero == NO) { + return 0; + } + + if ([self isNumberGeographical:phoneNumber] == NO) { + return 0; + } + + return [self getLengthOfNationalDestinationCode:phoneNumber]; } - /** * Gets the length of the national destination code (NDC) from the PhoneNumber * object passed in, so that clients could use it to split a national @@ -796,82 +816,76 @@ static NSArray *GEO_MOBILE_COUNTRIES; * which clients want to know the length of the NDC. * @return {number} the length of NDC of the PhoneNumber object passed in. */ -- (int)getLengthOfNationalDestinationCode:(NBPhoneNumber*)phoneNumber error:(NSError **)error -{ - int res = 0; - - @try { - res = [self getLengthOfNationalDestinationCode:phoneNumber]; +- (int)getLengthOfNationalDestinationCode:(NBPhoneNumber *)phoneNumber error:(NSError **)error { + int res = 0; + + @try { + res = [self getLengthOfNationalDestinationCode:phoneNumber]; + } @catch (NSException *exception) { + NSDictionary *userInfo = + [NSDictionary dictionaryWithObject:exception.reason forKey:NSLocalizedDescriptionKey]; + if (error != NULL) { + (*error) = [NSError errorWithDomain:exception.name code:0 userInfo:userInfo]; } - @catch (NSException *exception) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObject:exception.reason - forKey:NSLocalizedDescriptionKey]; - if (error != NULL) { - (*error) = [NSError errorWithDomain:exception.name code:0 userInfo:userInfo]; - } - } - - return res; + } + + return res; } +- (int)getLengthOfNationalDestinationCode:(NBPhoneNumber *)phoneNumber { + NBPhoneNumber *copiedProto = nil; -- (int)getLengthOfNationalDestinationCode:(NBPhoneNumber*)phoneNumber -{ - NBPhoneNumber *copiedProto = nil; - - if ([NBMetadataHelper hasValue:phoneNumber.extension]) { - copiedProto = [phoneNumber copy]; - copiedProto.extension = nil; - } else { - copiedProto = phoneNumber; + if ([NBMetadataHelper hasValue:phoneNumber.extension]) { + copiedProto = [phoneNumber copy]; + copiedProto.extension = nil; + } else { + copiedProto = phoneNumber; + } + + NSString *nationalSignificantNumber = + [self format:copiedProto numberFormat:NBEPhoneNumberFormatINTERNATIONAL]; + NSMutableArray *numberGroups = [[self componentsSeparatedByRegex:nationalSignificantNumber + regex:NON_DIGITS_PATTERN] mutableCopy]; + + // The pattern will start with '+COUNTRY_CODE ' so the first group will always + // be the empty string (before the + symbol) and the second group will be the + // country calling code. The third group will be area code if it is not the + // last group. + // NOTE: On IE the first group that is supposed to be the empty string does + // not appear in the array of number groups... so make the result on non-IE + // browsers to be that of IE. + if ([numberGroups count] > 0 && ((NSString *)[numberGroups objectAtIndex:0]).length <= 0) { + [numberGroups removeObjectAtIndex:0]; + } + + if ([numberGroups count] <= 2) { + return 0; + } + + NSArray *regionCodes = [NBMetadataHelper regionCodeFromCountryCode:phoneNumber.countryCode]; + BOOL isExists = NO; + + for (NSString *regCode in regionCodes) { + if ([regCode isEqualToString:@"AR"]) { + isExists = YES; + break; } - - NSString *nationalSignificantNumber = [self format:copiedProto numberFormat:NBEPhoneNumberFormatINTERNATIONAL]; - NSMutableArray *numberGroups = [[self componentsSeparatedByRegex:nationalSignificantNumber regex:NON_DIGITS_PATTERN] mutableCopy]; - - // The pattern will start with '+COUNTRY_CODE ' so the first group will always - // be the empty string (before the + symbol) and the second group will be the - // country calling code. The third group will be area code if it is not the - // last group. - // NOTE: On IE the first group that is supposed to be the empty string does - // not appear in the array of number groups... so make the result on non-IE - // browsers to be that of IE. - if ([numberGroups count] > 0 && ((NSString *)[numberGroups objectAtIndex:0]).length <= 0) { - [numberGroups removeObjectAtIndex:0]; - } - - if ([numberGroups count] <= 2) { - return 0; - } - - NSArray *regionCodes = [NBMetadataHelper regionCodeFromCountryCode:phoneNumber.countryCode]; - BOOL isExists = NO; - - for (NSString *regCode in regionCodes) - { - if ([regCode isEqualToString:@"AR"]) - { - isExists = YES; - break; - } - } - - if (isExists && [self getNumberType:phoneNumber] == NBEPhoneNumberTypeMOBILE) - { - // Argentinian mobile numbers, when formatted in the international format, - // are in the form of +54 9 NDC XXXX.... As a result, we take the length of - // the third group (NDC) and add 1 for the digit 9, which also forms part of - // the national significant number. - // - // TODO: Investigate the possibility of better modeling the metadata to make - // it easier to obtain the NDC. - return (int)((NSString *)[numberGroups objectAtIndex:2]).length + 1; - } - - return (int)((NSString *)[numberGroups objectAtIndex:1]).length; + } + + if (isExists && [self getNumberType:phoneNumber] == NBEPhoneNumberTypeMOBILE) { + // Argentinian mobile numbers, when formatted in the international format, + // are in the form of +54 9 NDC XXXX.... As a result, we take the length of + // the third group (NDC) and add 1 for the digit 9, which also forms part of + // the national significant number. + // + // TODO: Investigate the possibility of better modeling the metadata to make + // it easier to obtain the NDC. + return (int)((NSString *)[numberGroups objectAtIndex:2]).length + 1; + } + + return (int)((NSString *)[numberGroups objectAtIndex:1]).length; } - /** * Normalizes a string of characters representing a phone number by replacing * all characters found in the accompanying map with the values therein, and @@ -887,32 +901,28 @@ static NSArray *GEO_MOBILE_COUNTRIES; * @return {string} the normalized string version of the phone number. * @private */ -- (NSString *)normalizeHelper:(NSString *)sourceString normalizationReplacements:(NSDictionary*)normalizationReplacements - removeNonMatches:(BOOL)removeNonMatches -{ - NSUInteger numberLength = sourceString.length; - NSMutableString *normalizedNumber = [[NSMutableString alloc] init]; - - for (NSUInteger i = 0; i < numberLength; ++i) - { - unichar character = [sourceString characterAtIndex:i]; - NSString *newDigit = [normalizationReplacements objectForKey:[[NSString stringWithFormat: @"%C", character] uppercaseString]]; - if (newDigit != nil) - { - [normalizedNumber appendString:newDigit]; - } - else if (removeNonMatches == NO) - { - [normalizedNumber appendString:[NSString stringWithFormat: @"%C", character]]; - } - // If neither of the above are NO, we remove this character. - - //NSLog(@"[%@]", normalizedNumber); - } - - return normalizedNumber; -} +- (NSString *)normalizeHelper:(NSString *)sourceString + normalizationReplacements:(NSDictionary *)normalizationReplacements + removeNonMatches:(BOOL)removeNonMatches { + NSUInteger numberLength = sourceString.length; + NSMutableString *normalizedNumber = [[NSMutableString alloc] init]; + for (NSUInteger i = 0; i < numberLength; ++i) { + unichar character = [sourceString characterAtIndex:i]; + NSString *newDigit = [normalizationReplacements + objectForKey:[[NSString stringWithFormat:@"%C", character] uppercaseString]]; + if (newDigit != nil) { + [normalizedNumber appendString:newDigit]; + } else if (removeNonMatches == NO) { + [normalizedNumber appendString:[NSString stringWithFormat:@"%C", character]]; + } + // If neither of the above are NO, we remove this character. + + // NSLog(@"[%@]", normalizedNumber); + } + + return normalizedNumber; +} /** * Helper function to check if the national prefix formatting rule has the first @@ -923,14 +933,12 @@ static NSArray *GEO_MOBILE_COUNTRIES; * @return {boolean} NO if the national prefix formatting rule has the first * group only. */ -- (BOOL)formattingRuleHasFirstGroupOnly:(NSString *)nationalPrefixFormattingRule -{ - BOOL hasFound = [self stringPositionByRegex:nationalPrefixFormattingRule - regex:FIRST_GROUP_ONLY_PREFIX_PATTERN] >= 0; - return (([nationalPrefixFormattingRule length] == 0) || hasFound); +- (BOOL)formattingRuleHasFirstGroupOnly:(NSString *)nationalPrefixFormattingRule { + BOOL hasFound = [self stringPositionByRegex:nationalPrefixFormattingRule + regex:FIRST_GROUP_ONLY_PREFIX_PATTERN] >= 0; + return (([nationalPrefixFormattingRule length] == 0) || hasFound); } - /** * Tests whether a phone number has a geographical association. It checks if * the number is associated to a certain region in the country where it belongs @@ -940,19 +948,17 @@ static NSArray *GEO_MOBILE_COUNTRIES; * @return {boolean} NO if the phone number has a geographical association. * @private */ -- (BOOL)isNumberGeographical:(NBPhoneNumber*)phoneNumber -{ - NBEPhoneNumberType numberType = [self getNumberType:phoneNumber]; - // TODO: Include mobile phone numbers from countries like Indonesia, which - // has some mobile numbers that are geographical. - - BOOL containGeoMobileContries = - [GEO_MOBILE_COUNTRIES containsObject:phoneNumber.countryCode] && numberType == NBEPhoneNumberTypeMOBILE; - BOOL isFixedLine = (numberType == NBEPhoneNumberTypeFIXED_LINE); - BOOL isFixedLineOrMobile = (numberType == NBEPhoneNumberTypeFIXED_LINE_OR_MOBILE); - return isFixedLine || isFixedLineOrMobile || containGeoMobileContries; -} +- (BOOL)isNumberGeographical:(NBPhoneNumber *)phoneNumber { + NBEPhoneNumberType numberType = [self getNumberType:phoneNumber]; + // TODO: Include mobile phone numbers from countries like Indonesia, which + // has some mobile numbers that are geographical. + BOOL containGeoMobileContries = [GEO_MOBILE_COUNTRIES containsObject:phoneNumber.countryCode] && + numberType == NBEPhoneNumberTypeMOBILE; + BOOL isFixedLine = (numberType == NBEPhoneNumberTypeFIXED_LINE); + BOOL isFixedLineOrMobile = (numberType == NBEPhoneNumberTypeFIXED_LINE_OR_MOBILE); + return isFixedLine || isFixedLineOrMobile || containGeoMobileContries; +} /** * Helper function to check region code is not unknown or nil. @@ -961,20 +967,19 @@ static NSArray *GEO_MOBILE_COUNTRIES; * @return {boolean} NO if region code is valid. * @private */ -- (BOOL)isValidRegionCode:(NSString *)regionCode -{ - // In Java we check whether the regionCode is contained in supportedRegions - // that is built out of all the values of countryCallingCodeToRegionCodeMap - // (countryCodeToRegionCodeMap in JS) minus REGION_CODE_FOR_NON_GEO_ENTITY. - // In JS we check whether the regionCode is contained in the keys of - // countryToMetadata but since for non-geographical country calling codes - // (e.g. +800) we use the country calling codes instead of the region code as - // key in the map we have to make sure regionCode is not a number to prevent - // returning NO for non-geographical country calling codes. - return [NBMetadataHelper hasValue:regionCode] && [self isNaN:regionCode] && [self.helper getMetadataForRegion:regionCode.uppercaseString] != nil; +- (BOOL)isValidRegionCode:(NSString *)regionCode { + // In Java we check whether the regionCode is contained in supportedRegions + // that is built out of all the values of countryCallingCodeToRegionCodeMap + // (countryCodeToRegionCodeMap in JS) minus REGION_CODE_FOR_NON_GEO_ENTITY. + // In JS we check whether the regionCode is contained in the keys of + // countryToMetadata but since for non-geographical country calling codes + // (e.g. +800) we use the country calling codes instead of the region code as + // key in the map we have to make sure regionCode is not a number to prevent + // returning NO for non-geographical country calling codes. + return [NBMetadataHelper hasValue:regionCode] && [self isNaN:regionCode] && + [self.helper getMetadataForRegion:regionCode.uppercaseString] != nil; } - /** * Helper function to check the country calling code is valid. * @@ -982,16 +987,14 @@ static NSArray *GEO_MOBILE_COUNTRIES; * @return {boolean} NO if country calling code code is valid. * @private */ -- (BOOL)hasValidCountryCallingCode:(NSNumber*)countryCallingCode -{ - id res = [NBMetadataHelper regionCodeFromCountryCode:countryCallingCode]; - if (res != nil) { - return YES; - } - - return NO; -} +- (BOOL)hasValidCountryCallingCode:(NSNumber *)countryCallingCode { + id res = [NBMetadataHelper regionCodeFromCountryCode:countryCallingCode]; + if (res != nil) { + return YES; + } + return NO; +} /** * Formats a phone number in the specified format using default rules. Note that @@ -1010,71 +1013,76 @@ static NSArray *GEO_MOBILE_COUNTRIES; * phone number should be formatted into. * @return {string} the formatted phone number. */ -- (NSString *)format:(NBPhoneNumber*)phoneNumber numberFormat:(NBEPhoneNumberFormat)numberFormat error:(NSError**)error -{ - NSString *res = nil; - @try { - res = [self format:phoneNumber numberFormat:numberFormat]; - } - @catch (NSException *exception) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObject:exception.reason - forKey:NSLocalizedDescriptionKey]; - if (error != NULL) - (*error) = [NSError errorWithDomain:exception.name code:0 userInfo:userInfo]; - } - return res; +- (NSString *)format:(NBPhoneNumber *)phoneNumber + numberFormat:(NBEPhoneNumberFormat)numberFormat + error:(NSError **)error { + NSString *res = nil; + @try { + res = [self format:phoneNumber numberFormat:numberFormat]; + } @catch (NSException *exception) { + NSDictionary *userInfo = + [NSDictionary dictionaryWithObject:exception.reason forKey:NSLocalizedDescriptionKey]; + if (error != NULL) (*error) = [NSError errorWithDomain:exception.name code:0 userInfo:userInfo]; + } + return res; } -- (NSString *)format:(NBPhoneNumber*)phoneNumber numberFormat:(NBEPhoneNumberFormat)numberFormat -{ - if ([phoneNumber.nationalNumber isEqualToNumber:@0] && [NBMetadataHelper hasValue:phoneNumber.rawInput]) { - // Unparseable numbers that kept their raw input just use that. - // This is the only case where a number can be formatted as E164 without a - // leading '+' symbol (but the original number wasn't parseable anyway). - // TODO: Consider removing the 'if' above so that unparseable strings - // without raw input format to the empty string instead of "+00" - /** @type {string} */ - NSString *rawInput = phoneNumber.rawInput; - if ([NBMetadataHelper hasValue:rawInput]) { - return rawInput; - } +- (NSString *)format:(NBPhoneNumber *)phoneNumber numberFormat:(NBEPhoneNumberFormat)numberFormat { + if ([phoneNumber.nationalNumber isEqualToNumber:@0] && + [NBMetadataHelper hasValue:phoneNumber.rawInput]) { + // Unparseable numbers that kept their raw input just use that. + // This is the only case where a number can be formatted as E164 without a + // leading '+' symbol (but the original number wasn't parseable anyway). + // TODO: Consider removing the 'if' above so that unparseable strings + // without raw input format to the empty string instead of "+00" + /** @type {string} */ + NSString *rawInput = phoneNumber.rawInput; + if ([NBMetadataHelper hasValue:rawInput]) { + return rawInput; } - - NSNumber *countryCallingCode = phoneNumber.countryCode; - NSString *nationalSignificantNumber = [self getNationalSignificantNumber:phoneNumber]; - - if (numberFormat == NBEPhoneNumberFormatE164) - { - // Early exit for E164 case (even if the country calling code is invalid) - // since no formatting of the national number needs to be applied. - // Extensions are not formatted. - return [self prefixNumberWithCountryCallingCode:countryCallingCode phoneNumberFormat:NBEPhoneNumberFormatE164 - formattedNationalNumber:nationalSignificantNumber formattedExtension:@""]; - } - - if ([self hasValidCountryCallingCode:countryCallingCode] == NO) - { - return nationalSignificantNumber; - } - - // Note getRegionCodeForCountryCode() is used because formatting information - // for regions which share a country calling code is contained by only one - // region for performance reasons. For example, for NANPA regions it will be - // contained in the metadata for US. - NSArray *regionCodeArray = [NBMetadataHelper regionCodeFromCountryCode:countryCallingCode]; - NSString *regionCode = [regionCodeArray objectAtIndex:0]; - - // Metadata cannot be nil because the country calling code is valid (which - // means that the region code cannot be ZZ and must be one of our supported - // region codes). - NBPhoneMetaData *metadata = [self getMetadataForRegionOrCallingCode:countryCallingCode regionCode:regionCode]; - NSString *formattedExtension = [self maybeGetFormattedExtension:phoneNumber metadata:metadata numberFormat:numberFormat]; - NSString *formattedNationalNumber = [self formatNsn:nationalSignificantNumber metadata:metadata phoneNumberFormat:numberFormat carrierCode:nil]; - - return [self prefixNumberWithCountryCallingCode:countryCallingCode phoneNumberFormat:numberFormat - formattedNationalNumber:formattedNationalNumber formattedExtension:formattedExtension]; -} + } + NSNumber *countryCallingCode = phoneNumber.countryCode; + NSString *nationalSignificantNumber = [self getNationalSignificantNumber:phoneNumber]; + + if (numberFormat == NBEPhoneNumberFormatE164) { + // Early exit for E164 case (even if the country calling code is invalid) + // since no formatting of the national number needs to be applied. + // Extensions are not formatted. + return [self prefixNumberWithCountryCallingCode:countryCallingCode + phoneNumberFormat:NBEPhoneNumberFormatE164 + formattedNationalNumber:nationalSignificantNumber + formattedExtension:@""]; + } + + if ([self hasValidCountryCallingCode:countryCallingCode] == NO) { + return nationalSignificantNumber; + } + + // Note getRegionCodeForCountryCode() is used because formatting information + // for regions which share a country calling code is contained by only one + // region for performance reasons. For example, for NANPA regions it will be + // contained in the metadata for US. + NSArray *regionCodeArray = [NBMetadataHelper regionCodeFromCountryCode:countryCallingCode]; + NSString *regionCode = [regionCodeArray objectAtIndex:0]; + + // Metadata cannot be nil because the country calling code is valid (which + // means that the region code cannot be ZZ and must be one of our supported + // region codes). + NBPhoneMetaData *metadata = + [self getMetadataForRegionOrCallingCode:countryCallingCode regionCode:regionCode]; + NSString *formattedExtension = + [self maybeGetFormattedExtension:phoneNumber metadata:metadata numberFormat:numberFormat]; + NSString *formattedNationalNumber = [self formatNsn:nationalSignificantNumber + metadata:metadata + phoneNumberFormat:numberFormat + carrierCode:nil]; + + return [self prefixNumberWithCountryCallingCode:countryCallingCode + phoneNumberFormat:numberFormat + formattedNationalNumber:formattedNationalNumber + formattedExtension:formattedExtension]; +} /** * Formats a phone number in the specified format using client-defined @@ -1092,87 +1100,97 @@ static NSArray *GEO_MOBILE_COUNTRIES; * rules specified by clients. * @return {string} the formatted phone number. */ -- (NSString *)formatByPattern:(NBPhoneNumber*)number numberFormat:(NBEPhoneNumberFormat)numberFormat userDefinedFormats:(NSArray*)userDefinedFormats error:(NSError**)error -{ - NSString *res = nil; - @try { - res = [self formatByPattern:number numberFormat:numberFormat userDefinedFormats:userDefinedFormats]; - } - @catch (NSException *exception) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObject:exception.reason - forKey:NSLocalizedDescriptionKey]; - if (error != NULL) - (*error) = [NSError errorWithDomain:exception.name code:0 userInfo:userInfo]; - } - return res; +- (NSString *)formatByPattern:(NBPhoneNumber *)number + numberFormat:(NBEPhoneNumberFormat)numberFormat + userDefinedFormats:(NSArray *)userDefinedFormats + error:(NSError **)error { + NSString *res = nil; + @try { + res = [self formatByPattern:number + numberFormat:numberFormat + userDefinedFormats:userDefinedFormats]; + } @catch (NSException *exception) { + NSDictionary *userInfo = + [NSDictionary dictionaryWithObject:exception.reason forKey:NSLocalizedDescriptionKey]; + if (error != NULL) (*error) = [NSError errorWithDomain:exception.name code:0 userInfo:userInfo]; + } + return res; } +- (NSString *)formatByPattern:(NBPhoneNumber *)number + numberFormat:(NBEPhoneNumberFormat)numberFormat + userDefinedFormats:(NSArray *)userDefinedFormats { + NSNumber *countryCallingCode = number.countryCode; + NSString *nationalSignificantNumber = [self getNationalSignificantNumber:number]; -- (NSString *)formatByPattern:(NBPhoneNumber*)number numberFormat:(NBEPhoneNumberFormat)numberFormat userDefinedFormats:(NSArray*)userDefinedFormats -{ - NSNumber *countryCallingCode = number.countryCode; - NSString *nationalSignificantNumber = [self getNationalSignificantNumber:number]; - - if ([self hasValidCountryCallingCode:countryCallingCode] == NO) { - return nationalSignificantNumber; + if ([self hasValidCountryCallingCode:countryCallingCode] == NO) { + return nationalSignificantNumber; + } + + // Note getRegionCodeForCountryCode() is used because formatting information + // for regions which share a country calling code is contained by only one + // region for performance reasons. For example, for NANPA regions it will be + // contained in the metadata for US. + NSArray *regionCodes = [NBMetadataHelper regionCodeFromCountryCode:countryCallingCode]; + NSString *regionCode = nil; + if (regionCodes != nil && regionCodes.count > 0) { + regionCode = [regionCodes objectAtIndex:0]; + } + + // Metadata cannot be nil because the country calling code is valid + /** @type {i18n.phonenumbers.PhoneMetadata} */ + NBPhoneMetaData *metadata = + [self getMetadataForRegionOrCallingCode:countryCallingCode regionCode:regionCode]; + + NSString *formattedNumber = @""; + NBNumberFormat *formattingPattern = + [self chooseFormattingPatternForNumber:userDefinedFormats + nationalNumber:nationalSignificantNumber]; + + if (formattingPattern == nil) { + // If no pattern above is matched, we format the number as a whole. + formattedNumber = nationalSignificantNumber; + } else { + // Before we do a replacement of the national prefix pattern $NP with the + // national prefix, we need to copy the rule so that subsequent replacements + // for different numbers have the appropriate national prefix. + NBNumberFormat *numFormatCopy = [formattingPattern copy]; + NSString *nationalPrefixFormattingRule = formattingPattern.nationalPrefixFormattingRule; + + if (nationalPrefixFormattingRule.length > 0) { + NSString *nationalPrefix = metadata.nationalPrefix; + if (nationalPrefix.length > 0) { + // Replace $NP with national prefix and $FG with the first group ($1). + nationalPrefixFormattingRule = [self replaceStringByRegex:nationalPrefixFormattingRule + regex:NP_PATTERN + withTemplate:nationalPrefix]; + nationalPrefixFormattingRule = [self replaceStringByRegex:nationalPrefixFormattingRule + regex:FG_PATTERN + withTemplate:@"\\$1"]; + numFormatCopy.nationalPrefixFormattingRule = nationalPrefixFormattingRule; + } else { + // We don't want to have a rule for how to format the national prefix if + // there isn't one. + numFormatCopy.nationalPrefixFormattingRule = @""; + } } - - // Note getRegionCodeForCountryCode() is used because formatting information - // for regions which share a country calling code is contained by only one - // region for performance reasons. For example, for NANPA regions it will be - // contained in the metadata for US. - NSArray *regionCodes = [NBMetadataHelper regionCodeFromCountryCode:countryCallingCode]; - NSString *regionCode = nil; - if (regionCodes != nil && regionCodes.count > 0) { - regionCode = [regionCodes objectAtIndex:0]; - } - - // Metadata cannot be nil because the country calling code is valid - /** @type {i18n.phonenumbers.PhoneMetadata} */ - NBPhoneMetaData *metadata = [self getMetadataForRegionOrCallingCode:countryCallingCode regionCode:regionCode]; - - NSString *formattedNumber = @""; - NBNumberFormat *formattingPattern = [self chooseFormattingPatternForNumber:userDefinedFormats - nationalNumber:nationalSignificantNumber]; - - if (formattingPattern == nil) { - // If no pattern above is matched, we format the number as a whole. - formattedNumber = nationalSignificantNumber; - } else { - // Before we do a replacement of the national prefix pattern $NP with the - // national prefix, we need to copy the rule so that subsequent replacements - // for different numbers have the appropriate national prefix. - NBNumberFormat *numFormatCopy = [formattingPattern copy]; - NSString *nationalPrefixFormattingRule = formattingPattern.nationalPrefixFormattingRule; - - if (nationalPrefixFormattingRule.length > 0) { - NSString *nationalPrefix = metadata.nationalPrefix; - if (nationalPrefix.length > 0) { - // Replace $NP with national prefix and $FG with the first group ($1). - nationalPrefixFormattingRule = [self replaceStringByRegex:nationalPrefixFormattingRule - regex:NP_PATTERN withTemplate:nationalPrefix]; - nationalPrefixFormattingRule = [self replaceStringByRegex:nationalPrefixFormattingRule - regex:FG_PATTERN withTemplate:@"\\$1"]; - numFormatCopy.nationalPrefixFormattingRule = nationalPrefixFormattingRule; - } else { - // We don't want to have a rule for how to format the national prefix if - // there isn't one. - numFormatCopy.nationalPrefixFormattingRule = @""; - } - } - - formattedNumber = [self formatNsnUsingPattern:nationalSignificantNumber - formattingPattern:numFormatCopy numberFormat:numberFormat carrierCode:nil]; - } - - NSString *formattedExtension = [self maybeGetFormattedExtension:number metadata:metadata numberFormat:numberFormat]; - - //NSLog(@"!@# prefixNumberWithCountryCallingCode called [%@]", formattedExtension); - return [self prefixNumberWithCountryCallingCode:countryCallingCode phoneNumberFormat:numberFormat - formattedNationalNumber:formattedNumber formattedExtension:formattedExtension]; + + formattedNumber = [self formatNsnUsingPattern:nationalSignificantNumber + formattingPattern:numFormatCopy + numberFormat:numberFormat + carrierCode:nil]; + } + + NSString *formattedExtension = + [self maybeGetFormattedExtension:number metadata:metadata numberFormat:numberFormat]; + + // NSLog(@"!@# prefixNumberWithCountryCallingCode called [%@]", formattedExtension); + return [self prefixNumberWithCountryCallingCode:countryCallingCode + phoneNumberFormat:numberFormat + formattedNationalNumber:formattedNumber + formattedExtension:formattedExtension]; } - /** * Formats a phone number in national format for dialing using the carrier as * specified in the {@code carrierCode}. The {@code carrierCode} will always be @@ -1186,61 +1204,66 @@ static NSArray *GEO_MOBILE_COUNTRIES; * @return {string} the formatted phone number in national format for dialing * using the carrier as specified in the {@code carrierCode}. */ -- (NSString *)formatNationalNumberWithCarrierCode:(NBPhoneNumber*)number carrierCode:(NSString *)carrierCode error:(NSError **)error -{ - NSString *res = nil; - @try { - res = [self formatNationalNumberWithCarrierCode:number carrierCode:carrierCode]; +- (NSString *)formatNationalNumberWithCarrierCode:(NBPhoneNumber *)number + carrierCode:(NSString *)carrierCode + error:(NSError **)error { + NSString *res = nil; + @try { + res = [self formatNationalNumberWithCarrierCode:number carrierCode:carrierCode]; + } @catch (NSException *exception) { + NSDictionary *userInfo = + [NSDictionary dictionaryWithObject:exception.reason forKey:NSLocalizedDescriptionKey]; + if (error != NULL) { + (*error) = [NSError errorWithDomain:exception.name code:0 userInfo:userInfo]; } - @catch (NSException *exception) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObject:exception.reason - forKey:NSLocalizedDescriptionKey]; - if (error != NULL) { - (*error) = [NSError errorWithDomain:exception.name code:0 userInfo:userInfo]; - } - } - return res; + } + return res; } +- (NSString *)formatNationalNumberWithCarrierCode:(NBPhoneNumber *)number + carrierCode:(NSString *)carrierCode { + NSNumber *countryCallingCode = number.countryCode; + NSString *nationalSignificantNumber = [self getNationalSignificantNumber:number]; -- (NSString *)formatNationalNumberWithCarrierCode:(NBPhoneNumber*)number carrierCode:(NSString *)carrierCode -{ - NSNumber *countryCallingCode = number.countryCode; - NSString *nationalSignificantNumber = [self getNationalSignificantNumber:number]; - - if ([self hasValidCountryCallingCode:countryCallingCode] == NO) { - return nationalSignificantNumber; - } - - // Note getRegionCodeForCountryCode() is used because formatting information - // for regions which share a country calling code is contained by only one - // region for performance reasons. For example, for NANPA regions it will be - // contained in the metadata for US. - NSString *regionCode = [self getRegionCodeForCountryCode:countryCallingCode]; - // Metadata cannot be nil because the country calling code is valid. - NBPhoneMetaData *metadata = [self getMetadataForRegionOrCallingCode:countryCallingCode regionCode:regionCode]; - NSString *formattedExtension = [self maybeGetFormattedExtension:number metadata:metadata numberFormat:NBEPhoneNumberFormatNATIONAL]; - NSString *formattedNationalNumber = [self formatNsn:nationalSignificantNumber metadata:metadata - phoneNumberFormat:NBEPhoneNumberFormatNATIONAL carrierCode:carrierCode]; - return [self prefixNumberWithCountryCallingCode:countryCallingCode phoneNumberFormat:NBEPhoneNumberFormatNATIONAL - formattedNationalNumber:formattedNationalNumber formattedExtension:formattedExtension]; + if ([self hasValidCountryCallingCode:countryCallingCode] == NO) { + return nationalSignificantNumber; + } + + // Note getRegionCodeForCountryCode() is used because formatting information + // for regions which share a country calling code is contained by only one + // region for performance reasons. For example, for NANPA regions it will be + // contained in the metadata for US. + NSString *regionCode = [self getRegionCodeForCountryCode:countryCallingCode]; + // Metadata cannot be nil because the country calling code is valid. + NBPhoneMetaData *metadata = + [self getMetadataForRegionOrCallingCode:countryCallingCode regionCode:regionCode]; + NSString *formattedExtension = [self maybeGetFormattedExtension:number + metadata:metadata + numberFormat:NBEPhoneNumberFormatNATIONAL]; + NSString *formattedNationalNumber = [self formatNsn:nationalSignificantNumber + metadata:metadata + phoneNumberFormat:NBEPhoneNumberFormatNATIONAL + carrierCode:carrierCode]; + return [self prefixNumberWithCountryCallingCode:countryCallingCode + phoneNumberFormat:NBEPhoneNumberFormatNATIONAL + formattedNationalNumber:formattedNationalNumber + formattedExtension:formattedExtension]; } - /** * - param {number} countryCallingCode * - param {?string} regionCode * @return {i18n.phonenumbers.PhoneMetadata} * @private */ -- (NBPhoneMetaData*)getMetadataForRegionOrCallingCode:(NSNumber*)countryCallingCode regionCode:(NSString *)regionCode -{ - NBMetadataHelper *helper = self.helper; - - return [regionCode isEqualToString:NB_REGION_CODE_FOR_NON_GEO_ENTITY] ? - [helper getMetadataForNonGeographicalRegion:countryCallingCode] : [helper getMetadataForRegion:regionCode]; -} +- (NBPhoneMetaData *)getMetadataForRegionOrCallingCode:(NSNumber *)countryCallingCode + regionCode:(NSString *)regionCode { + NBMetadataHelper *helper = self.helper; + return [regionCode isEqualToString:NB_REGION_CODE_FOR_NON_GEO_ENTITY] + ? [helper getMetadataForNonGeographicalRegion:countryCallingCode] + : [helper getMetadataForRegion:regionCode]; +} /** * Formats a phone number in national format for dialing using the carrier as @@ -1262,32 +1285,31 @@ static NSArray *GEO_MOBILE_COUNTRIES; * using the number's preferred_domestic_carrier_code, or the * {@code fallbackCarrierCode} passed in if none is found. */ -- (NSString *)formatNationalNumberWithPreferredCarrierCode:(NBPhoneNumber*)number - fallbackCarrierCode:(NSString *)fallbackCarrierCode error:(NSError **)error -{ - NSString *res = nil; - @try { - res = [self formatNationalNumberWithCarrierCode:number carrierCode:fallbackCarrierCode]; +- (NSString *)formatNationalNumberWithPreferredCarrierCode:(NBPhoneNumber *)number + fallbackCarrierCode:(NSString *)fallbackCarrierCode + error:(NSError **)error { + NSString *res = nil; + @try { + res = [self formatNationalNumberWithCarrierCode:number carrierCode:fallbackCarrierCode]; + } @catch (NSException *exception) { + NSDictionary *userInfo = + [NSDictionary dictionaryWithObject:exception.reason forKey:NSLocalizedDescriptionKey]; + if (error != NULL) { + (*error) = [NSError errorWithDomain:exception.name code:0 userInfo:userInfo]; } - @catch (NSException *exception) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObject:exception.reason - forKey:NSLocalizedDescriptionKey]; - if (error != NULL) { - (*error) = [NSError errorWithDomain:exception.name code:0 userInfo:userInfo]; - } - } - - return res; + } + + return res; } - -- (NSString *)formatNationalNumberWithPreferredCarrierCode:(NBPhoneNumber*)number fallbackCarrierCode:(NSString *)fallbackCarrierCode -{ - NSString *domesticCarrierCode = number.preferredDomesticCarrierCode != nil ? number.preferredDomesticCarrierCode : fallbackCarrierCode; - return [self formatNationalNumberWithCarrierCode:number carrierCode:domesticCarrierCode]; +- (NSString *)formatNationalNumberWithPreferredCarrierCode:(NBPhoneNumber *)number + fallbackCarrierCode:(NSString *)fallbackCarrierCode { + NSString *domesticCarrierCode = number.preferredDomesticCarrierCode != nil + ? number.preferredDomesticCarrierCode + : fallbackCarrierCode; + return [self formatNationalNumberWithCarrierCode:number carrierCode:domesticCarrierCode]; } - /** * Returns a number formatted in such a way that it can be dialed from a mobile * phone in a specific region. If the number cannot be reached from the region @@ -1301,82 +1323,89 @@ static NSArray *GEO_MOBILE_COUNTRIES; * formatting symbols, such as spaces and dashes. * @return {string} the formatted phone number. */ -- (NSString *)formatNumberForMobileDialing:(NBPhoneNumber*)number regionCallingFrom:(NSString *)regionCallingFrom withFormatting:(BOOL)withFormatting - error:(NSError**)error -{ - NSString *res = nil; - @try { - res = [self formatNumberForMobileDialing:number regionCallingFrom:regionCallingFrom withFormatting:withFormatting]; - } - @catch (NSException *exception) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObject:exception.reason - forKey:NSLocalizedDescriptionKey]; - if (error != NULL) - (*error) = [NSError errorWithDomain:exception.name code:0 userInfo:userInfo]; - } - return res; +- (NSString *)formatNumberForMobileDialing:(NBPhoneNumber *)number + regionCallingFrom:(NSString *)regionCallingFrom + withFormatting:(BOOL)withFormatting + error:(NSError **)error { + NSString *res = nil; + @try { + res = [self formatNumberForMobileDialing:number + regionCallingFrom:regionCallingFrom + withFormatting:withFormatting]; + } @catch (NSException *exception) { + NSDictionary *userInfo = + [NSDictionary dictionaryWithObject:exception.reason forKey:NSLocalizedDescriptionKey]; + if (error != NULL) (*error) = [NSError errorWithDomain:exception.name code:0 userInfo:userInfo]; + } + return res; } +- (NSString *)formatNumberForMobileDialing:(NBPhoneNumber *)number + regionCallingFrom:(NSString *)regionCallingFrom + withFormatting:(BOOL)withFormatting { + NSNumber *countryCallingCode = number.countryCode; -- (NSString *)formatNumberForMobileDialing:(NBPhoneNumber*)number regionCallingFrom:(NSString *)regionCallingFrom withFormatting:(BOOL)withFormatting -{ - NSNumber *countryCallingCode = number.countryCode; - - if ([self hasValidCountryCallingCode:countryCallingCode] == NO) { - return [NBMetadataHelper hasValue:number.rawInput] ? number.rawInput : @""; + if ([self hasValidCountryCallingCode:countryCallingCode] == NO) { + return [NBMetadataHelper hasValue:number.rawInput] ? number.rawInput : @""; + } + + NSString *formattedNumber = @""; + // Clear the extension, as that part cannot normally be dialed together with + // the main number. + NBPhoneNumber *numberNoExt = [number copy]; + numberNoExt.extension = @""; + + NSString *regionCode = [self getRegionCodeForCountryCode:countryCallingCode]; + if ([regionCallingFrom isEqualToString:regionCode]) { + NBEPhoneNumberType numberType = [self getNumberType:numberNoExt]; + BOOL isFixedLineOrMobile = (numberType == NBEPhoneNumberTypeFIXED_LINE) || + (numberType == NBEPhoneNumberTypeMOBILE) || + (numberType == NBEPhoneNumberTypeFIXED_LINE_OR_MOBILE); + // Carrier codes may be needed in some countries. We handle this here. + if ([regionCode isEqualToString:@"CO"] && numberType == NBEPhoneNumberTypeFIXED_LINE) { + formattedNumber = + [self formatNationalNumberWithCarrierCode:numberNoExt + carrierCode:COLOMBIA_MOBILE_TO_FIXED_LINE_PREFIX]; + } else if ([regionCode isEqualToString:@"BR"] && isFixedLineOrMobile) { + formattedNumber = [NBMetadataHelper hasValue:numberNoExt.preferredDomesticCarrierCode] + ? [self formatNationalNumberWithPreferredCarrierCode:numberNoExt + fallbackCarrierCode:@""] + : @""; + // Brazilian fixed line and mobile numbers need to be dialed with a + // carrier code when called within Brazil. Without that, most of the + // carriers won't connect the call. Because of that, we return an + // empty string here. + } else { + // For NANPA countries, non-geographical countries, and Mexican fixed + // line and mobile numbers, we output international format for numbersi + // that can be dialed internationally as that always works. + if ((countryCallingCode.unsignedIntegerValue == NANPA_COUNTRY_CODE_ || + [regionCode isEqualToString:NB_REGION_CODE_FOR_NON_GEO_ENTITY] || + // MX fixed line and mobile numbers should always be formatted in + // international format, even when dialed within MX. For national + // format to work, a carrier code needs to be used, and the correct + // carrier code depends on if the caller and callee are from the + // same local area. It is trickier to get that to work correctly than + // using international format, which is tested to work fine on all + // carriers. + ([regionCode isEqualToString:@"MX"] && isFixedLineOrMobile)) && + [self canBeInternationallyDialled:numberNoExt]) { + formattedNumber = [self format:numberNoExt numberFormat:NBEPhoneNumberFormatINTERNATIONAL]; + } else { + formattedNumber = [self format:numberNoExt numberFormat:NBEPhoneNumberFormatNATIONAL]; + } } - - NSString *formattedNumber = @""; - // Clear the extension, as that part cannot normally be dialed together with - // the main number. - NBPhoneNumber *numberNoExt = [number copy]; - numberNoExt.extension = @""; - - NSString *regionCode = [self getRegionCodeForCountryCode:countryCallingCode]; - if ([regionCallingFrom isEqualToString:regionCode]) { - NBEPhoneNumberType numberType = [self getNumberType:numberNoExt]; - BOOL isFixedLineOrMobile = (numberType == NBEPhoneNumberTypeFIXED_LINE) || (numberType == NBEPhoneNumberTypeMOBILE) || - (numberType == NBEPhoneNumberTypeFIXED_LINE_OR_MOBILE); - // Carrier codes may be needed in some countries. We handle this here. - if ([regionCode isEqualToString:@"CO"] && numberType == NBEPhoneNumberTypeFIXED_LINE) { - formattedNumber = [self formatNationalNumberWithCarrierCode:numberNoExt - carrierCode:COLOMBIA_MOBILE_TO_FIXED_LINE_PREFIX]; - } else if ([regionCode isEqualToString:@"BR"] && isFixedLineOrMobile) { - formattedNumber = [NBMetadataHelper hasValue:numberNoExt.preferredDomesticCarrierCode] ? - [self formatNationalNumberWithPreferredCarrierCode:numberNoExt fallbackCarrierCode:@""] : @""; - // Brazilian fixed line and mobile numbers need to be dialed with a - // carrier code when called within Brazil. Without that, most of the - // carriers won't connect the call. Because of that, we return an - // empty string here. - } else { - // For NANPA countries, non-geographical countries, and Mexican fixed - // line and mobile numbers, we output international format for numbersi - // that can be dialed internationally as that always works. - if ((countryCallingCode.unsignedIntegerValue == NANPA_COUNTRY_CODE_ || - [regionCode isEqualToString:NB_REGION_CODE_FOR_NON_GEO_ENTITY] || - // MX fixed line and mobile numbers should always be formatted in - // international format, even when dialed within MX. For national - // format to work, a carrier code needs to be used, and the correct - // carrier code depends on if the caller and callee are from the - // same local area. It is trickier to get that to work correctly than - // using international format, which is tested to work fine on all - // carriers. - ([regionCode isEqualToString:@"MX"] && isFixedLineOrMobile)) && [self canBeInternationallyDialled:numberNoExt]) { - formattedNumber = [self format:numberNoExt numberFormat:NBEPhoneNumberFormatINTERNATIONAL]; - } else { - formattedNumber = [self format:numberNoExt numberFormat:NBEPhoneNumberFormatNATIONAL]; - } - } - } else if ([self canBeInternationallyDialled:numberNoExt]) { - return withFormatting ? [self format:numberNoExt numberFormat:NBEPhoneNumberFormatINTERNATIONAL] : - [self format:numberNoExt numberFormat:NBEPhoneNumberFormatE164]; - } - - return withFormatting ? - formattedNumber : [self normalizeHelper:formattedNumber normalizationReplacements:DIALLABLE_CHAR_MAPPINGS removeNonMatches:YES]; + } else if ([self canBeInternationallyDialled:numberNoExt]) { + return withFormatting ? [self format:numberNoExt numberFormat:NBEPhoneNumberFormatINTERNATIONAL] + : [self format:numberNoExt numberFormat:NBEPhoneNumberFormatE164]; + } + + return withFormatting ? formattedNumber + : [self normalizeHelper:formattedNumber + normalizationReplacements:DIALLABLE_CHAR_MAPPINGS + removeNonMatches:YES]; } - /** * Formats a phone number for out-of-country dialing purposes. If no * regionCallingFrom is supplied, we format the number in its INTERNATIONAL @@ -1398,82 +1427,96 @@ static NSArray *GEO_MOBILE_COUNTRIES; * - param {string} regionCallingFrom the region where the call is being placed. * @return {string} the formatted phone number. */ -- (NSString *)formatOutOfCountryCallingNumber:(NBPhoneNumber*)number regionCallingFrom:(NSString *)regionCallingFrom error:(NSError**)error -{ - NSString *res = nil; - @try { - res = [self formatOutOfCountryCallingNumber:number regionCallingFrom:regionCallingFrom]; - } - @catch (NSException *exception) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObject:exception.reason - forKey:NSLocalizedDescriptionKey]; - if (error != NULL) - (*error) = [NSError errorWithDomain:exception.name code:0 userInfo:userInfo]; - } - - return res; +- (NSString *)formatOutOfCountryCallingNumber:(NBPhoneNumber *)number + regionCallingFrom:(NSString *)regionCallingFrom + error:(NSError **)error { + NSString *res = nil; + @try { + res = [self formatOutOfCountryCallingNumber:number regionCallingFrom:regionCallingFrom]; + } @catch (NSException *exception) { + NSDictionary *userInfo = + [NSDictionary dictionaryWithObject:exception.reason forKey:NSLocalizedDescriptionKey]; + if (error != NULL) (*error) = [NSError errorWithDomain:exception.name code:0 userInfo:userInfo]; + } + + return res; } -- (NSString *)formatOutOfCountryCallingNumber:(NBPhoneNumber*)number regionCallingFrom:(NSString *)regionCallingFrom -{ - if ([self isValidRegionCode:regionCallingFrom] == NO) { - return [self format:number numberFormat:NBEPhoneNumberFormatINTERNATIONAL]; - } - - NSNumber *countryCallingCode = [number.countryCode copy]; - NSString *nationalSignificantNumber = [self getNationalSignificantNumber:number]; - - if ([self hasValidCountryCallingCode:countryCallingCode] == NO) { - return nationalSignificantNumber; - } - - if (countryCallingCode.unsignedIntegerValue == NANPA_COUNTRY_CODE_) { - if ([self isNANPACountry:regionCallingFrom]) { - // For NANPA regions, return the national format for these regions but - // prefix it with the country calling code. - return [NSString stringWithFormat:@"%@ %@", countryCallingCode, [self format:number numberFormat:NBEPhoneNumberFormatNATIONAL]]; - } - } else if ([countryCallingCode isEqualToNumber:[self getCountryCodeForValidRegion:regionCallingFrom error:nil]]) { - // If regions share a country calling code, the country calling code need - // not be dialled. This also applies when dialling within a region, so this - // if clause covers both these cases. Technically this is the case for - // dialling from La Reunion to other overseas departments of France (French - // Guiana, Martinique, Guadeloupe), but not vice versa - so we don't cover - // this edge case for now and for those cases return the version including - // country calling code. Details here: - // http://www.petitfute.com/voyage/225-info-pratiques-reunion - return [self format:number numberFormat:NBEPhoneNumberFormatNATIONAL]; - } - - // Metadata cannot be nil because we checked 'isValidRegionCode()' above. - NBPhoneMetaData *metadataForRegionCallingFrom = [self.helper getMetadataForRegion:regionCallingFrom]; - NSString *internationalPrefix = metadataForRegionCallingFrom.internationalPrefix; - - // For regions that have multiple international prefixes, the international - // format of the number is returned, unless there is a preferred international - // prefix. - NSString *internationalPrefixForFormatting = @""; - - if ([self matchesEntirely:UNIQUE_INTERNATIONAL_PREFIX string:internationalPrefix]) { - internationalPrefixForFormatting = internationalPrefix; - } else if ([NBMetadataHelper hasValue:metadataForRegionCallingFrom.preferredInternationalPrefix]) { - internationalPrefixForFormatting = metadataForRegionCallingFrom.preferredInternationalPrefix; - } - - NSString *regionCode = [self getRegionCodeForCountryCode:countryCallingCode]; - // Metadata cannot be nil because the country calling code is valid. - NBPhoneMetaData *metadataForRegion = [self getMetadataForRegionOrCallingCode:countryCallingCode regionCode:regionCode]; - NSString *formattedNationalNumber = [self formatNsn:nationalSignificantNumber metadata:metadataForRegion - phoneNumberFormat:NBEPhoneNumberFormatINTERNATIONAL carrierCode:nil]; - NSString *formattedExtension = [self maybeGetFormattedExtension:number metadata:metadataForRegion numberFormat:NBEPhoneNumberFormatINTERNATIONAL]; - - NSString *hasLenth = [NSString stringWithFormat:@"%@ %@ %@%@", internationalPrefixForFormatting, countryCallingCode, formattedNationalNumber, formattedExtension]; - NSString *hasNotLength = [self prefixNumberWithCountryCallingCode:countryCallingCode phoneNumberFormat:NBEPhoneNumberFormatINTERNATIONAL - formattedNationalNumber:formattedNationalNumber formattedExtension:formattedExtension]; - - return internationalPrefixForFormatting.length > 0 ? hasLenth:hasNotLength; -} +- (NSString *)formatOutOfCountryCallingNumber:(NBPhoneNumber *)number + regionCallingFrom:(NSString *)regionCallingFrom { + if ([self isValidRegionCode:regionCallingFrom] == NO) { + return [self format:number numberFormat:NBEPhoneNumberFormatINTERNATIONAL]; + } + NSNumber *countryCallingCode = [number.countryCode copy]; + NSString *nationalSignificantNumber = [self getNationalSignificantNumber:number]; + + if ([self hasValidCountryCallingCode:countryCallingCode] == NO) { + return nationalSignificantNumber; + } + + if (countryCallingCode.unsignedIntegerValue == NANPA_COUNTRY_CODE_) { + if ([self isNANPACountry:regionCallingFrom]) { + // For NANPA regions, return the national format for these regions but + // prefix it with the country calling code. + return [NSString + stringWithFormat:@"%@ %@", countryCallingCode, + [self format:number numberFormat:NBEPhoneNumberFormatNATIONAL]]; + } + } else if ([countryCallingCode + isEqualToNumber:[self getCountryCodeForValidRegion:regionCallingFrom error:nil]]) { + // If regions share a country calling code, the country calling code need + // not be dialled. This also applies when dialling within a region, so this + // if clause covers both these cases. Technically this is the case for + // dialling from La Reunion to other overseas departments of France (French + // Guiana, Martinique, Guadeloupe), but not vice versa - so we don't cover + // this edge case for now and for those cases return the version including + // country calling code. Details here: + // http://www.petitfute.com/voyage/225-info-pratiques-reunion + return [self format:number numberFormat:NBEPhoneNumberFormatNATIONAL]; + } + + // Metadata cannot be nil because we checked 'isValidRegionCode()' above. + NBPhoneMetaData *metadataForRegionCallingFrom = + [self.helper getMetadataForRegion:regionCallingFrom]; + NSString *internationalPrefix = metadataForRegionCallingFrom.internationalPrefix; + + // For regions that have multiple international prefixes, the international + // format of the number is returned, unless there is a preferred international + // prefix. + NSString *internationalPrefixForFormatting = @""; + + if ([self matchesEntirely:UNIQUE_INTERNATIONAL_PREFIX string:internationalPrefix]) { + internationalPrefixForFormatting = internationalPrefix; + } else if ([NBMetadataHelper + hasValue:metadataForRegionCallingFrom.preferredInternationalPrefix]) { + internationalPrefixForFormatting = metadataForRegionCallingFrom.preferredInternationalPrefix; + } + + NSString *regionCode = [self getRegionCodeForCountryCode:countryCallingCode]; + // Metadata cannot be nil because the country calling code is valid. + NBPhoneMetaData *metadataForRegion = + [self getMetadataForRegionOrCallingCode:countryCallingCode regionCode:regionCode]; + NSString *formattedNationalNumber = [self formatNsn:nationalSignificantNumber + metadata:metadataForRegion + phoneNumberFormat:NBEPhoneNumberFormatINTERNATIONAL + carrierCode:nil]; + NSString *formattedExtension = + [self maybeGetFormattedExtension:number + metadata:metadataForRegion + numberFormat:NBEPhoneNumberFormatINTERNATIONAL]; + + NSString *hasLenth = + [NSString stringWithFormat:@"%@ %@ %@%@", internationalPrefixForFormatting, + countryCallingCode, formattedNationalNumber, formattedExtension]; + NSString *hasNotLength = + [self prefixNumberWithCountryCallingCode:countryCallingCode + phoneNumberFormat:NBEPhoneNumberFormatINTERNATIONAL + formattedNationalNumber:formattedNationalNumber + formattedExtension:formattedExtension]; + + return internationalPrefixForFormatting.length > 0 ? hasLenth : hasNotLength; +} /** * A helper function that is used by format and formatByPattern. @@ -1486,25 +1529,26 @@ static NSArray *GEO_MOBILE_COUNTRIES; * @return {string} the formatted phone number. * @private */ -- (NSString *)prefixNumberWithCountryCallingCode:(NSNumber*)countryCallingCode phoneNumberFormat:(NBEPhoneNumberFormat)numberFormat +- (NSString *)prefixNumberWithCountryCallingCode:(NSNumber *)countryCallingCode + phoneNumberFormat:(NBEPhoneNumberFormat)numberFormat formattedNationalNumber:(NSString *)formattedNationalNumber - formattedExtension:(NSString *)formattedExtension -{ - switch (numberFormat) - { - case NBEPhoneNumberFormatE164: - return [NSString stringWithFormat:@"+%@%@%@", countryCallingCode, formattedNationalNumber, formattedExtension]; - case NBEPhoneNumberFormatINTERNATIONAL: - return [NSString stringWithFormat:@"+%@ %@%@", countryCallingCode, formattedNationalNumber, formattedExtension]; - case NBEPhoneNumberFormatRFC3966: - return [NSString stringWithFormat:@"%@+%@-%@%@", RFC3966_PREFIX, countryCallingCode, formattedNationalNumber, formattedExtension]; - case NBEPhoneNumberFormatNATIONAL: - default: - return [NSString stringWithFormat:@"%@%@", formattedNationalNumber, formattedExtension]; - } + formattedExtension:(NSString *)formattedExtension { + switch (numberFormat) { + case NBEPhoneNumberFormatE164: + return [NSString stringWithFormat:@"+%@%@%@", countryCallingCode, formattedNationalNumber, + formattedExtension]; + case NBEPhoneNumberFormatINTERNATIONAL: + return [NSString stringWithFormat:@"+%@ %@%@", countryCallingCode, formattedNationalNumber, + formattedExtension]; + case NBEPhoneNumberFormatRFC3966: + return [NSString stringWithFormat:@"%@+%@-%@%@", RFC3966_PREFIX, countryCallingCode, + formattedNationalNumber, formattedExtension]; + case NBEPhoneNumberFormatNATIONAL: + default: + return [NSString stringWithFormat:@"%@%@", formattedNationalNumber, formattedExtension]; + } } - /** * Formats a phone number using the original phone number format that the number * is parsed from. The original format is embedded in the country_code_source @@ -1523,141 +1567,141 @@ static NSArray *GEO_MOBILE_COUNTRIES; * if the original number has one. * @return {string} the formatted phone number in its original number format. */ -- (NSString *)formatInOriginalFormat:(NBPhoneNumber*)number regionCallingFrom:(NSString *)regionCallingFrom error:(NSError **)error -{ - NSString *res = nil; - @try { - res = [self formatInOriginalFormat:number regionCallingFrom:regionCallingFrom]; - } - @catch (NSException *exception) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObject:exception.reason - forKey:NSLocalizedDescriptionKey]; - if (error != NULL) - (*error) = [NSError errorWithDomain:exception.name code:0 userInfo:userInfo]; - } - - return res; +- (NSString *)formatInOriginalFormat:(NBPhoneNumber *)number + regionCallingFrom:(NSString *)regionCallingFrom + error:(NSError **)error { + NSString *res = nil; + @try { + res = [self formatInOriginalFormat:number regionCallingFrom:regionCallingFrom]; + } @catch (NSException *exception) { + NSDictionary *userInfo = + [NSDictionary dictionaryWithObject:exception.reason forKey:NSLocalizedDescriptionKey]; + if (error != NULL) (*error) = [NSError errorWithDomain:exception.name code:0 userInfo:userInfo]; + } + + return res; } +- (NSString *)formatInOriginalFormat:(NBPhoneNumber *)number + regionCallingFrom:(NSString *)regionCallingFrom { + if ([NBMetadataHelper hasValue:number.rawInput] && + ([self hasFormattingPatternForNumber:number] == NO)) { + // We check if we have the formatting pattern because without that, we might + // format the number as a group without national prefix. + return number.rawInput; + } -- (NSString *)formatInOriginalFormat:(NBPhoneNumber*)number regionCallingFrom:(NSString *)regionCallingFrom -{ - if ([NBMetadataHelper hasValue:number.rawInput] && ([self hasFormattingPatternForNumber:number] == NO)) { - // We check if we have the formatting pattern because without that, we might - // format the number as a group without national prefix. - return number.rawInput; + if (number.countryCodeSource == nil) { + return [self format:number numberFormat:NBEPhoneNumberFormatNATIONAL]; + } + + NSString *formattedNumber = @""; + + switch ([number.countryCodeSource integerValue]) { + case NBECountryCodeSourceFROM_NUMBER_WITH_PLUS_SIGN: + formattedNumber = [self format:number numberFormat:NBEPhoneNumberFormatINTERNATIONAL]; + break; + case NBECountryCodeSourceFROM_NUMBER_WITH_IDD: + formattedNumber = + [self formatOutOfCountryCallingNumber:number regionCallingFrom:regionCallingFrom]; + break; + case NBECountryCodeSourceFROM_NUMBER_WITHOUT_PLUS_SIGN: + formattedNumber = [[self format:number numberFormat:NBEPhoneNumberFormatINTERNATIONAL] + substringFromIndex:1]; + break; + case NBECountryCodeSourceFROM_DEFAULT_COUNTRY: + // Fall-through to default case. + default: { + NSString *regionCode = [self getRegionCodeForCountryCode:number.countryCode]; + // We strip non-digits from the NDD here, and from the raw input later, + // so that we can compare them easily. + NSString *nationalPrefix = [self getNddPrefixForRegion:regionCode stripNonDigits:YES]; + NSString *nationalFormat = [self format:number numberFormat:NBEPhoneNumberFormatNATIONAL]; + if (nationalPrefix == nil || nationalPrefix.length == 0) { + // If the region doesn't have a national prefix at all, we can safely + // return the national format without worrying about a national prefix + // being added. + formattedNumber = nationalFormat; + break; + } + // Otherwise, we check if the original number was entered with a national + // prefix. + if ([self rawInputContainsNationalPrefix:number.rawInput + nationalPrefix:nationalPrefix + regionCode:regionCode]) { + // If so, we can safely return the national format. + formattedNumber = nationalFormat; + break; + } + // Metadata cannot be nil here because getNddPrefixForRegion() (above) + // returns nil if there is no metadata for the region. + NBPhoneMetaData *metadata = [self.helper getMetadataForRegion:regionCode]; + NSString *nationalNumber = [self getNationalSignificantNumber:number]; + NBNumberFormat *formatRule = [self chooseFormattingPatternForNumber:metadata.numberFormats + nationalNumber:nationalNumber]; + // The format rule could still be nil here if the national number was 0 + // and there was no raw input (this should not be possible for numbers + // generated by the phonenumber library as they would also not have a + // country calling code and we would have exited earlier). + if (formatRule == nil) { + formattedNumber = nationalFormat; + break; + } + // When the format we apply to this number doesn't contain national + // prefix, we can just return the national format. + // TODO: Refactor the code below with the code in + // isNationalPrefixPresentIfRequired. + NSString *candidateNationalPrefixRule = formatRule.nationalPrefixFormattingRule; + // We assume that the first-group symbol will never be _before_ the + // national prefix. + NSRange firstGroupRange = [candidateNationalPrefixRule rangeOfString:@"$1"]; + if (firstGroupRange.location == NSNotFound) { + formattedNumber = nationalFormat; + break; + } + + if (firstGroupRange.location <= 0) { + formattedNumber = nationalFormat; + break; + } + candidateNationalPrefixRule = + [candidateNationalPrefixRule substringWithRange:NSMakeRange(0, firstGroupRange.location)]; + candidateNationalPrefixRule = [self normalizeDigitsOnly:candidateNationalPrefixRule]; + if (candidateNationalPrefixRule.length == 0) { + // National prefix not used when formatting this number. + formattedNumber = nationalFormat; + break; + } + // Otherwise, we need to remove the national prefix from our output. + NBNumberFormat *numFormatCopy = [formatRule copy]; + numFormatCopy.nationalPrefixFormattingRule = nil; + formattedNumber = [self formatByPattern:number + numberFormat:NBEPhoneNumberFormatNATIONAL + userDefinedFormats:@[ numFormatCopy ]]; + break; } - - if (number.countryCodeSource == nil) { - return [self format:number numberFormat:NBEPhoneNumberFormatNATIONAL]; + } + + NSString *rawInput = number.rawInput; + // If no digit is inserted/removed/modified as a result of our formatting, we + // return the formatted phone number; otherwise we return the raw input the + // user entered. + if (formattedNumber != nil && rawInput.length > 0) { + NSString *normalizedFormattedNumber = [self normalizeHelper:formattedNumber + normalizationReplacements:DIALLABLE_CHAR_MAPPINGS + removeNonMatches:YES]; + /** @type {string} */ + NSString *normalizedRawInput = [self normalizeHelper:rawInput + normalizationReplacements:DIALLABLE_CHAR_MAPPINGS + removeNonMatches:YES]; + + if ([normalizedFormattedNumber isEqualToString:normalizedRawInput] == NO) { + formattedNumber = rawInput; } - - NSString *formattedNumber = @""; - - switch ([number.countryCodeSource integerValue]) - { - case NBECountryCodeSourceFROM_NUMBER_WITH_PLUS_SIGN: - formattedNumber = [self format:number numberFormat:NBEPhoneNumberFormatINTERNATIONAL]; - break; - case NBECountryCodeSourceFROM_NUMBER_WITH_IDD: - formattedNumber = [self formatOutOfCountryCallingNumber:number regionCallingFrom:regionCallingFrom]; - break; - case NBECountryCodeSourceFROM_NUMBER_WITHOUT_PLUS_SIGN: - formattedNumber = [[self format:number numberFormat:NBEPhoneNumberFormatINTERNATIONAL] substringFromIndex:1]; - break; - case NBECountryCodeSourceFROM_DEFAULT_COUNTRY: - // Fall-through to default case. - default: - { - NSString *regionCode = [self getRegionCodeForCountryCode:number.countryCode]; - // We strip non-digits from the NDD here, and from the raw input later, - // so that we can compare them easily. - NSString *nationalPrefix = [self getNddPrefixForRegion:regionCode stripNonDigits:YES]; - NSString *nationalFormat = [self format:number numberFormat:NBEPhoneNumberFormatNATIONAL]; - if (nationalPrefix == nil || nationalPrefix.length == 0) - { - // If the region doesn't have a national prefix at all, we can safely - // return the national format without worrying about a national prefix - // being added. - formattedNumber = nationalFormat; - break; - } - // Otherwise, we check if the original number was entered with a national - // prefix. - if ([self rawInputContainsNationalPrefix:number.rawInput nationalPrefix:nationalPrefix regionCode:regionCode]) - { - // If so, we can safely return the national format. - formattedNumber = nationalFormat; - break; - } - // Metadata cannot be nil here because getNddPrefixForRegion() (above) - // returns nil if there is no metadata for the region. - NBPhoneMetaData *metadata = [self.helper getMetadataForRegion:regionCode]; - NSString *nationalNumber = [self getNationalSignificantNumber:number]; - NBNumberFormat *formatRule = [self chooseFormattingPatternForNumber:metadata.numberFormats nationalNumber:nationalNumber]; - // The format rule could still be nil here if the national number was 0 - // and there was no raw input (this should not be possible for numbers - // generated by the phonenumber library as they would also not have a - // country calling code and we would have exited earlier). - if (formatRule == nil) - { - formattedNumber = nationalFormat; - break; - } - // When the format we apply to this number doesn't contain national - // prefix, we can just return the national format. - // TODO: Refactor the code below with the code in - // isNationalPrefixPresentIfRequired. - NSString *candidateNationalPrefixRule = formatRule.nationalPrefixFormattingRule; - // We assume that the first-group symbol will never be _before_ the - // national prefix. - NSRange firstGroupRange = [candidateNationalPrefixRule rangeOfString:@"$1"]; - if (firstGroupRange.location == NSNotFound) - { - formattedNumber = nationalFormat; - break; - } - - if (firstGroupRange.location <= 0) - { - formattedNumber = nationalFormat; - break; - } - candidateNationalPrefixRule = [candidateNationalPrefixRule substringWithRange:NSMakeRange(0, firstGroupRange.location)]; - candidateNationalPrefixRule = [self normalizeDigitsOnly:candidateNationalPrefixRule]; - if (candidateNationalPrefixRule.length == 0) - { - // National prefix not used when formatting this number. - formattedNumber = nationalFormat; - break; - } - // Otherwise, we need to remove the national prefix from our output. - NBNumberFormat *numFormatCopy = [formatRule copy]; - numFormatCopy.nationalPrefixFormattingRule = nil; - formattedNumber = [self formatByPattern:number numberFormat:NBEPhoneNumberFormatNATIONAL userDefinedFormats:@[numFormatCopy]]; - break; - } - } - - NSString *rawInput = number.rawInput; - // If no digit is inserted/removed/modified as a result of our formatting, we - // return the formatted phone number; otherwise we return the raw input the - // user entered. - if (formattedNumber != nil && rawInput.length > 0) - { - NSString *normalizedFormattedNumber = [self normalizeHelper:formattedNumber normalizationReplacements:DIALLABLE_CHAR_MAPPINGS removeNonMatches:YES]; - /** @type {string} */ - NSString *normalizedRawInput = [self normalizeHelper:rawInput normalizationReplacements:DIALLABLE_CHAR_MAPPINGS removeNonMatches:YES]; - - if ([normalizedFormattedNumber isEqualToString:normalizedRawInput] == NO) - { - formattedNumber = rawInput; - } - } - return formattedNumber; + } + return formattedNumber; } - /** * Check if rawInput, which is assumed to be in the national format, has a * national prefix. The national prefix is assumed to be in digits-only form. @@ -1667,27 +1711,25 @@ static NSArray *GEO_MOBILE_COUNTRIES; * @return {boolean} * @private */ -- (BOOL)rawInputContainsNationalPrefix:(NSString *)rawInput nationalPrefix:(NSString *)nationalPrefix regionCode:(NSString *)regionCode -{ - BOOL isValid = NO; - NSString *normalizedNationalNumber = [self normalizeDigitsOnly:rawInput]; - if ([self isStartingStringByRegex:normalizedNationalNumber regex:nationalPrefix]) - { - // Some Japanese numbers (e.g. 00777123) might be mistaken to contain the - // national prefix when written without it (e.g. 0777123) if we just do - // prefix matching. To tackle that, we check the validity of the number if - // the assumed national prefix is removed (777123 won't be valid in - // Japan). - NSString *subString = [normalizedNationalNumber substringFromIndex:nationalPrefix.length]; - NSError *anError = nil; - isValid = [self isValidNumber:[self parse:subString defaultRegion:regionCode error:&anError]]; - - if (anError != nil) - return NO; - } - return isValid; -} +- (BOOL)rawInputContainsNationalPrefix:(NSString *)rawInput + nationalPrefix:(NSString *)nationalPrefix + regionCode:(NSString *)regionCode { + BOOL isValid = NO; + NSString *normalizedNationalNumber = [self normalizeDigitsOnly:rawInput]; + if ([self isStartingStringByRegex:normalizedNationalNumber regex:nationalPrefix]) { + // Some Japanese numbers (e.g. 00777123) might be mistaken to contain the + // national prefix when written without it (e.g. 0777123) if we just do + // prefix matching. To tackle that, we check the validity of the number if + // the assumed national prefix is removed (777123 won't be valid in + // Japan). + NSString *subString = [normalizedNationalNumber substringFromIndex:nationalPrefix.length]; + NSError *anError = nil; + isValid = [self isValidNumber:[self parse:subString defaultRegion:regionCode error:&anError]]; + if (anError != nil) return NO; + } + return isValid; +} /** * Returns NO if a number is from a region whose national significant number @@ -1697,33 +1739,30 @@ static NSArray *GEO_MOBILE_COUNTRIES; * @return {boolean} * @private */ -- (BOOL)hasUnexpectedItalianLeadingZero:(NBPhoneNumber*)number -{ - return number.italianLeadingZero && [self isLeadingZeroPossible:number.countryCode] == NO; +- (BOOL)hasUnexpectedItalianLeadingZero:(NBPhoneNumber *)number { + return number.italianLeadingZero && [self isLeadingZeroPossible:number.countryCode] == NO; } - /** * - param {i18n.phonenumbers.PhoneNumber} number * @return {boolean} * @private */ -- (BOOL)hasFormattingPatternForNumber:(NBPhoneNumber*)number -{ - NSNumber *countryCallingCode = number.countryCode; - NSString *phoneNumberRegion = [self getRegionCodeForCountryCode:countryCallingCode]; - NBPhoneMetaData *metadata = [self getMetadataForRegionOrCallingCode:countryCallingCode regionCode:phoneNumberRegion]; - - if (metadata == nil) - { - return NO; - } - - NSString *nationalNumber = [self getNationalSignificantNumber:number]; - NBNumberFormat *formatRule = [self chooseFormattingPatternForNumber:metadata.numberFormats nationalNumber:nationalNumber]; - return formatRule != nil; -} +- (BOOL)hasFormattingPatternForNumber:(NBPhoneNumber *)number { + NSNumber *countryCallingCode = number.countryCode; + NSString *phoneNumberRegion = [self getRegionCodeForCountryCode:countryCallingCode]; + NBPhoneMetaData *metadata = + [self getMetadataForRegionOrCallingCode:countryCallingCode regionCode:phoneNumberRegion]; + if (metadata == nil) { + return NO; + } + + NSString *nationalNumber = [self getNationalSignificantNumber:number]; + NBNumberFormat *formatRule = + [self chooseFormattingPatternForNumber:metadata.numberFormats nationalNumber:nationalNumber]; + return formatRule != nil; +} /** * Formats a phone number for out-of-country dialing purposes. @@ -1751,114 +1790,128 @@ static NSArray *GEO_MOBILE_COUNTRIES; * - param {string} regionCallingFrom the region where the call is being placed. * @return {string} the formatted phone number. */ -- (NSString *)formatOutOfCountryKeepingAlphaChars:(NBPhoneNumber*)number regionCallingFrom:(NSString *)regionCallingFrom error:(NSError **)error -{ - NSString *res = nil; - @try { - res = [self formatOutOfCountryKeepingAlphaChars:number regionCallingFrom:regionCallingFrom]; - } - @catch (NSException *exception) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObject:exception.reason - forKey:NSLocalizedDescriptionKey]; - if (error != NULL) - (*error) = [NSError errorWithDomain:exception.name code:0 userInfo:userInfo]; - } - return res; +- (NSString *)formatOutOfCountryKeepingAlphaChars:(NBPhoneNumber *)number + regionCallingFrom:(NSString *)regionCallingFrom + error:(NSError **)error { + NSString *res = nil; + @try { + res = [self formatOutOfCountryKeepingAlphaChars:number regionCallingFrom:regionCallingFrom]; + } @catch (NSException *exception) { + NSDictionary *userInfo = + [NSDictionary dictionaryWithObject:exception.reason forKey:NSLocalizedDescriptionKey]; + if (error != NULL) (*error) = [NSError errorWithDomain:exception.name code:0 userInfo:userInfo]; + } + return res; } +- (NSString *)formatOutOfCountryKeepingAlphaChars:(NBPhoneNumber *)number + regionCallingFrom:(NSString *)regionCallingFrom { + NSString *rawInput = number.rawInput; + // If there is no raw input, then we can't keep alpha characters because there + // aren't any. In this case, we return formatOutOfCountryCallingNumber. + if (rawInput == nil || rawInput.length == 0) { + return [self formatOutOfCountryCallingNumber:number regionCallingFrom:regionCallingFrom]; + } -- (NSString *)formatOutOfCountryKeepingAlphaChars:(NBPhoneNumber*)number regionCallingFrom:(NSString *)regionCallingFrom -{ - NSString *rawInput = number.rawInput; - // If there is no raw input, then we can't keep alpha characters because there - // aren't any. In this case, we return formatOutOfCountryCallingNumber. - if (rawInput == nil || rawInput.length == 0) - { - return [self formatOutOfCountryCallingNumber:number regionCallingFrom:regionCallingFrom]; + NSNumber *countryCode = number.countryCode; + if ([self hasValidCountryCallingCode:countryCode] == NO) { + return rawInput; + } + // Strip any prefix such as country calling code, IDD, that was present. We do + // this by comparing the number in raw_input with the parsed number. To do + // this, first we normalize punctuation. We retain number grouping symbols + // such as ' ' only. + rawInput = [self normalizeHelper:rawInput + normalizationReplacements:ALL_PLUS_NUMBER_GROUPING_SYMBOLS + removeNonMatches:NO]; + // NSLog(@"---- formatOutOfCountryKeepingAlphaChars normalizeHelper rawInput [%@]", rawInput); + // Now we trim everything before the first three digits in the parsed number. + // We choose three because all valid alpha numbers have 3 digits at the start + // - if it does not, then we don't trim anything at all. Similarly, if the + // national number was less than three digits, we don't trim anything at all. + NSString *nationalNumber = [self getNationalSignificantNumber:number]; + if (nationalNumber.length > 3) { + int firstNationalNumberDigit = + [self indexOfStringByString:rawInput + target:[nationalNumber substringWithRange:NSMakeRange(0, 3)]]; + if (firstNationalNumberDigit != -1) { + rawInput = [rawInput substringFromIndex:firstNationalNumberDigit]; } - - NSNumber *countryCode = number.countryCode; - if ([self hasValidCountryCallingCode:countryCode] == NO) - { - return rawInput; + } + + NBPhoneMetaData *metadataForRegionCallingFrom = + [self.helper getMetadataForRegion:regionCallingFrom]; + + if (countryCode.unsignedIntegerValue == NANPA_COUNTRY_CODE_) { + if ([self isNANPACountry:regionCallingFrom]) { + return [NSString stringWithFormat:@"%@ %@", countryCode, rawInput]; } - // Strip any prefix such as country calling code, IDD, that was present. We do - // this by comparing the number in raw_input with the parsed number. To do - // this, first we normalize punctuation. We retain number grouping symbols - // such as ' ' only. - rawInput = [self normalizeHelper:rawInput normalizationReplacements:ALL_PLUS_NUMBER_GROUPING_SYMBOLS removeNonMatches:NO]; - //NSLog(@"---- formatOutOfCountryKeepingAlphaChars normalizeHelper rawInput [%@]", rawInput); - // Now we trim everything before the first three digits in the parsed number. - // We choose three because all valid alpha numbers have 3 digits at the start - // - if it does not, then we don't trim anything at all. Similarly, if the - // national number was less than three digits, we don't trim anything at all. - NSString *nationalNumber = [self getNationalSignificantNumber:number]; - if (nationalNumber.length > 3) - { - int firstNationalNumberDigit = [self indexOfStringByString:rawInput target:[nationalNumber substringWithRange:NSMakeRange(0, 3)]]; - if (firstNationalNumberDigit != -1) - { - rawInput = [rawInput substringFromIndex:firstNationalNumberDigit]; - } - } - - NBPhoneMetaData *metadataForRegionCallingFrom = [self.helper getMetadataForRegion:regionCallingFrom]; - - if (countryCode.unsignedIntegerValue == NANPA_COUNTRY_CODE_) { - if ([self isNANPACountry:regionCallingFrom]) { - return [NSString stringWithFormat:@"%@ %@", countryCode, rawInput]; - } - } else if (metadataForRegionCallingFrom != nil && [countryCode isEqualToNumber:[self getCountryCodeForValidRegion:regionCallingFrom error:nil]]) { - NBNumberFormat *formattingPattern = [self chooseFormattingPatternForNumber:metadataForRegionCallingFrom.numberFormats - nationalNumber:nationalNumber]; - if (formattingPattern == nil) { - // If no pattern above is matched, we format the original input. - return rawInput; - } - - NBNumberFormat *newFormat = [formattingPattern copy]; - // The first group is the first group of digits that the user wrote - // together. - newFormat.pattern = @"(\\d+)(.*)"; - // Here we just concatenate them back together after the national prefix - // has been fixed. - newFormat.format = @"$1$2"; - // Now we format using this pattern instead of the default pattern, but - // with the national prefix prefixed if necessary. - // This will not work in the cases where the pattern (and not the leading - // digits) decide whether a national prefix needs to be used, since we have - // overridden the pattern to match anything, but that is not the case in the - // metadata to date. - - return [self formatNsnUsingPattern:rawInput formattingPattern:newFormat numberFormat:NBEPhoneNumberFormatNATIONAL carrierCode:nil]; - } - - NSString *internationalPrefixForFormatting = @""; - // If an unsupported region-calling-from is entered, or a country with - // multiple international prefixes, the international format of the number is - // returned, unless there is a preferred international prefix. - if (metadataForRegionCallingFrom != nil) { - NSString *internationalPrefix = metadataForRegionCallingFrom.internationalPrefix; - internationalPrefixForFormatting = - [self matchesEntirely:UNIQUE_INTERNATIONAL_PREFIX string:internationalPrefix] ? internationalPrefix : metadataForRegionCallingFrom.preferredInternationalPrefix; - } - - NSString *regionCode = [self getRegionCodeForCountryCode:countryCode]; - // Metadata cannot be nil because the country calling code is valid. - NBPhoneMetaData *metadataForRegion = [self getMetadataForRegionOrCallingCode:countryCode regionCode:regionCode]; - NSString *formattedExtension = [self maybeGetFormattedExtension:number metadata:metadataForRegion numberFormat:NBEPhoneNumberFormatINTERNATIONAL]; - - if (internationalPrefixForFormatting.length > 0) { - return [NSString stringWithFormat:@"%@ %@ %@%@", internationalPrefixForFormatting, countryCode, rawInput, formattedExtension]; - } else { - // Invalid region entered as country-calling-from (so no metadata was found - // for it) or the region chosen has multiple international dialling - // prefixes. - return [self prefixNumberWithCountryCallingCode:countryCode phoneNumberFormat:NBEPhoneNumberFormatINTERNATIONAL formattedNationalNumber:rawInput formattedExtension:formattedExtension]; + } else if (metadataForRegionCallingFrom != nil && + [countryCode + isEqualToNumber:[self getCountryCodeForValidRegion:regionCallingFrom error:nil]]) { + NBNumberFormat *formattingPattern = + [self chooseFormattingPatternForNumber:metadataForRegionCallingFrom.numberFormats + nationalNumber:nationalNumber]; + if (formattingPattern == nil) { + // If no pattern above is matched, we format the original input. + return rawInput; } + + NBNumberFormat *newFormat = [formattingPattern copy]; + // The first group is the first group of digits that the user wrote + // together. + newFormat.pattern = @"(\\d+)(.*)"; + // Here we just concatenate them back together after the national prefix + // has been fixed. + newFormat.format = @"$1$2"; + // Now we format using this pattern instead of the default pattern, but + // with the national prefix prefixed if necessary. + // This will not work in the cases where the pattern (and not the leading + // digits) decide whether a national prefix needs to be used, since we have + // overridden the pattern to match anything, but that is not the case in the + // metadata to date. + + return [self formatNsnUsingPattern:rawInput + formattingPattern:newFormat + numberFormat:NBEPhoneNumberFormatNATIONAL + carrierCode:nil]; + } + + NSString *internationalPrefixForFormatting = @""; + // If an unsupported region-calling-from is entered, or a country with + // multiple international prefixes, the international format of the number is + // returned, unless there is a preferred international prefix. + if (metadataForRegionCallingFrom != nil) { + NSString *internationalPrefix = metadataForRegionCallingFrom.internationalPrefix; + internationalPrefixForFormatting = + [self matchesEntirely:UNIQUE_INTERNATIONAL_PREFIX string:internationalPrefix] + ? internationalPrefix + : metadataForRegionCallingFrom.preferredInternationalPrefix; + } + + NSString *regionCode = [self getRegionCodeForCountryCode:countryCode]; + // Metadata cannot be nil because the country calling code is valid. + NBPhoneMetaData *metadataForRegion = + [self getMetadataForRegionOrCallingCode:countryCode regionCode:regionCode]; + NSString *formattedExtension = + [self maybeGetFormattedExtension:number + metadata:metadataForRegion + numberFormat:NBEPhoneNumberFormatINTERNATIONAL]; + + if (internationalPrefixForFormatting.length > 0) { + return [NSString stringWithFormat:@"%@ %@ %@%@", internationalPrefixForFormatting, countryCode, + rawInput, formattedExtension]; + } else { + // Invalid region entered as country-calling-from (so no metadata was found + // for it) or the region chosen has multiple international dialling + // prefixes. + return [self prefixNumberWithCountryCallingCode:countryCode + phoneNumberFormat:NBEPhoneNumberFormatINTERNATIONAL + formattedNationalNumber:rawInput + formattedExtension:formattedExtension]; + } } - /** * Note in some regions, the national number can be written in two completely * different ways depending on whether it forms part of the NATIONAL format or @@ -1875,21 +1928,29 @@ static NSArray *GEO_MOBILE_COUNTRIES; * @return {string} the formatted phone number. * @private */ -- (NSString *)formatNsn:(NSString *)phoneNumber metadata:(NBPhoneMetaData*)metadata phoneNumberFormat:(NBEPhoneNumberFormat)numberFormat carrierCode:(NSString *)opt_carrierCode -{ - NSArray *intlNumberFormats = metadata.intlNumberFormats; - // When the intlNumberFormats exists, we use that to format national number - // for the INTERNATIONAL format instead of using the numberDesc.numberFormats. - NSArray *availableFormats = ([intlNumberFormats count] <= 0 || numberFormat == NBEPhoneNumberFormatNATIONAL) ? metadata.numberFormats : intlNumberFormats; - NBNumberFormat *formattingPattern = [self chooseFormattingPatternForNumber:availableFormats nationalNumber:phoneNumber]; - - if (formattingPattern == nil) { - return phoneNumber; - } - - return [self formatNsnUsingPattern:phoneNumber formattingPattern:formattingPattern numberFormat:numberFormat carrierCode:opt_carrierCode]; -} +- (NSString *)formatNsn:(NSString *)phoneNumber + metadata:(NBPhoneMetaData *)metadata + phoneNumberFormat:(NBEPhoneNumberFormat)numberFormat + carrierCode:(NSString *)opt_carrierCode { + NSArray *intlNumberFormats = metadata.intlNumberFormats; + // When the intlNumberFormats exists, we use that to format national number + // for the INTERNATIONAL format instead of using the numberDesc.numberFormats. + NSArray *availableFormats = + ([intlNumberFormats count] <= 0 || numberFormat == NBEPhoneNumberFormatNATIONAL) + ? metadata.numberFormats + : intlNumberFormats; + NBNumberFormat *formattingPattern = + [self chooseFormattingPatternForNumber:availableFormats nationalNumber:phoneNumber]; + if (formattingPattern == nil) { + return phoneNumber; + } + + return [self formatNsnUsingPattern:phoneNumber + formattingPattern:formattingPattern + numberFormat:numberFormat + carrierCode:opt_carrierCode]; +} /** * - param {Array.} availableFormats the @@ -1899,21 +1960,22 @@ static NSArray *GEO_MOBILE_COUNTRIES; * @return {i18n.phonenumbers.NumberFormat} * @private */ -- (NBNumberFormat*)chooseFormattingPatternForNumber:(NSArray*)availableFormats nationalNumber:(NSString *)nationalNumber -{ - for (NBNumberFormat *numFormat in availableFormats) { - NSUInteger size = [numFormat.leadingDigitsPatterns count]; - // We always use the last leading_digits_pattern, as it is the most detailed. - if (size == 0 || [self stringPositionByRegex:nationalNumber regex:[numFormat.leadingDigitsPatterns lastObject]] == 0) { - if ([self matchesEntirely:numFormat.pattern string:nationalNumber]) { - return numFormat; - } - } +- (NBNumberFormat *)chooseFormattingPatternForNumber:(NSArray *)availableFormats + nationalNumber:(NSString *)nationalNumber { + for (NBNumberFormat *numFormat in availableFormats) { + NSUInteger size = [numFormat.leadingDigitsPatterns count]; + // We always use the last leading_digits_pattern, as it is the most detailed. + if (size == 0 || + [self stringPositionByRegex:nationalNumber + regex:[numFormat.leadingDigitsPatterns lastObject]] == 0) { + if ([self matchesEntirely:numFormat.pattern string:nationalNumber]) { + return numFormat; + } } - - return nil; -} + } + return nil; +} /** * Note that carrierCode is optional - if nil or an empty string, no carrier @@ -1929,41 +1991,61 @@ static NSArray *GEO_MOBILE_COUNTRIES; * @return {string} the formatted phone number. * @private */ -- (NSString *)formatNsnUsingPattern:(NSString *)nationalNumber formattingPattern:(NBNumberFormat*)formattingPattern numberFormat:(NBEPhoneNumberFormat)numberFormat carrierCode:(NSString *)opt_carrierCode -{ - NSString *numberFormatRule = formattingPattern.format; - NSString *domesticCarrierCodeFormattingRule = formattingPattern.domesticCarrierCodeFormattingRule; - NSString *formattedNationalNumber = @""; - - if (numberFormat == NBEPhoneNumberFormatNATIONAL && [NBMetadataHelper hasValue:opt_carrierCode] && domesticCarrierCodeFormattingRule.length > 0) { - // Replace the $CC in the formatting rule with the desired carrier code. - NSString *carrierCodeFormattingRule = [self replaceStringByRegex:domesticCarrierCodeFormattingRule regex:CC_PATTERN withTemplate:opt_carrierCode]; - // Now replace the $FG in the formatting rule with the first group and - // the carrier code combined in the appropriate way. - numberFormatRule = [self replaceFirstStringByRegex:numberFormatRule regex:FIRST_GROUP_PATTERN - withTemplate:carrierCodeFormattingRule]; - formattedNationalNumber = [self replaceStringByRegex:nationalNumber regex:formattingPattern.pattern withTemplate:numberFormatRule]; - } else { - // Use the national prefix formatting rule instead. - NSString *nationalPrefixFormattingRule = formattingPattern.nationalPrefixFormattingRule; - if (numberFormat == NBEPhoneNumberFormatNATIONAL && [NBMetadataHelper hasValue:nationalPrefixFormattingRule]) { - NSString *replacePattern = [self replaceFirstStringByRegex:numberFormatRule regex:FIRST_GROUP_PATTERN withTemplate:nationalPrefixFormattingRule]; - formattedNationalNumber = [self replaceStringByRegex:nationalNumber regex:formattingPattern.pattern withTemplate:replacePattern]; - } else { - formattedNationalNumber = [self replaceStringByRegex:nationalNumber regex:formattingPattern.pattern withTemplate:numberFormatRule]; - } - } - - if (numberFormat == NBEPhoneNumberFormatRFC3966) { - // Strip any leading punctuation. - formattedNationalNumber = [self replaceStringByRegex:formattedNationalNumber regex:[NSString stringWithFormat:@"^%@", SEPARATOR_PATTERN] withTemplate:@""]; - - // Replace the rest with a dash between each number group. - formattedNationalNumber = [self replaceStringByRegex:formattedNationalNumber regex:SEPARATOR_PATTERN withTemplate:@"-"]; - } - return formattedNationalNumber; -} +- (NSString *)formatNsnUsingPattern:(NSString *)nationalNumber + formattingPattern:(NBNumberFormat *)formattingPattern + numberFormat:(NBEPhoneNumberFormat)numberFormat + carrierCode:(NSString *)opt_carrierCode { + NSString *numberFormatRule = formattingPattern.format; + NSString *domesticCarrierCodeFormattingRule = formattingPattern.domesticCarrierCodeFormattingRule; + NSString *formattedNationalNumber = @""; + if (numberFormat == NBEPhoneNumberFormatNATIONAL && [NBMetadataHelper hasValue:opt_carrierCode] && + domesticCarrierCodeFormattingRule.length > 0) { + // Replace the $CC in the formatting rule with the desired carrier code. + NSString *carrierCodeFormattingRule = + [self replaceStringByRegex:domesticCarrierCodeFormattingRule + regex:CC_PATTERN + withTemplate:opt_carrierCode]; + // Now replace the $FG in the formatting rule with the first group and + // the carrier code combined in the appropriate way. + numberFormatRule = [self replaceFirstStringByRegex:numberFormatRule + regex:FIRST_GROUP_PATTERN + withTemplate:carrierCodeFormattingRule]; + formattedNationalNumber = [self replaceStringByRegex:nationalNumber + regex:formattingPattern.pattern + withTemplate:numberFormatRule]; + } else { + // Use the national prefix formatting rule instead. + NSString *nationalPrefixFormattingRule = formattingPattern.nationalPrefixFormattingRule; + if (numberFormat == NBEPhoneNumberFormatNATIONAL && + [NBMetadataHelper hasValue:nationalPrefixFormattingRule]) { + NSString *replacePattern = [self replaceFirstStringByRegex:numberFormatRule + regex:FIRST_GROUP_PATTERN + withTemplate:nationalPrefixFormattingRule]; + formattedNationalNumber = [self replaceStringByRegex:nationalNumber + regex:formattingPattern.pattern + withTemplate:replacePattern]; + } else { + formattedNationalNumber = [self replaceStringByRegex:nationalNumber + regex:formattingPattern.pattern + withTemplate:numberFormatRule]; + } + } + + if (numberFormat == NBEPhoneNumberFormatRFC3966) { + // Strip any leading punctuation. + formattedNationalNumber = + [self replaceStringByRegex:formattedNationalNumber + regex:[NSString stringWithFormat:@"^%@", SEPARATOR_PATTERN] + withTemplate:@""]; + + // Replace the rest with a dash between each number group. + formattedNationalNumber = [self replaceStringByRegex:formattedNationalNumber + regex:SEPARATOR_PATTERN + withTemplate:@"-"]; + } + return formattedNationalNumber; +} /** * Gets a valid number for the specified region. @@ -1975,13 +2057,12 @@ static NSArray *GEO_MOBILE_COUNTRIES; * geographical numbers), call {@link #getExampleNumberForNonGeoEntity} * instead. */ -- (NBPhoneNumber*)getExampleNumber:(NSString *)regionCode error:(NSError *__autoreleasing *)error -{ - NBPhoneNumber *res = [self getExampleNumberForType:regionCode type:NBEPhoneNumberTypeFIXED_LINE error:error]; - return res; +- (NBPhoneNumber *)getExampleNumber:(NSString *)regionCode error:(NSError *__autoreleasing *)error { + NBPhoneNumber *res = + [self getExampleNumberForType:regionCode type:NBEPhoneNumberTypeFIXED_LINE error:error]; + return res; } - /** * Gets a valid number for the specified region and number type. * @@ -1994,23 +2075,24 @@ static NSArray *GEO_MOBILE_COUNTRIES; * For 001 (representing non-geographical numbers), call * {@link #getExampleNumberForNonGeoEntity} instead. */ -- (NBPhoneNumber*)getExampleNumberForType:(NSString *)regionCode type:(NBEPhoneNumberType)type error:(NSError *__autoreleasing *)error -{ - NBPhoneNumber *res = nil; - - if ([self isValidRegionCode:regionCode] == NO) { - return nil; - } - - NBPhoneNumberDesc *desc = [self getNumberDescByType:[self.helper getMetadataForRegion:regionCode] type:type]; - - if ([NBMetadataHelper hasValue:desc.exampleNumber ]) { - return [self parse:desc.exampleNumber defaultRegion:regionCode error:error]; - } - - return res; -} +- (NBPhoneNumber *)getExampleNumberForType:(NSString *)regionCode + type:(NBEPhoneNumberType)type + error:(NSError *__autoreleasing *)error { + NBPhoneNumber *res = nil; + if ([self isValidRegionCode:regionCode] == NO) { + return nil; + } + + NBPhoneNumberDesc *desc = + [self getNumberDescByType:[self.helper getMetadataForRegion:regionCode] type:type]; + + if ([NBMetadataHelper hasValue:desc.exampleNumber]) { + return [self parse:desc.exampleNumber defaultRegion:regionCode error:error]; + } + + return res; +} /** * Gets a valid number for the specified country calling code for a @@ -2023,45 +2105,39 @@ static NSArray *GEO_MOBILE_COUNTRIES; * such information, or the country calling code passed in does not belong * to a non-geographical entity. */ -- (NBPhoneNumber *)getExampleNumberForNonGeoEntity:(NSNumber *)countryCallingCode error:(NSError *__autoreleasing *)error -{ - NBPhoneNumber *res = nil; - - NBPhoneMetaData *metadata = [self.helper getMetadataForNonGeographicalRegion:countryCallingCode]; - - if (metadata != nil) { - NSString *fetchedExampleNumber = nil; - if ([NBMetadataHelper hasValue:metadata.mobile.exampleNumber]) { - fetchedExampleNumber = metadata.mobile.exampleNumber; - } - else if ([NBMetadataHelper hasValue:metadata.tollFree.exampleNumber]) { - fetchedExampleNumber = metadata.tollFree.exampleNumber; - } - else if ([NBMetadataHelper hasValue:metadata.sharedCost.exampleNumber]) { - fetchedExampleNumber = metadata.sharedCost.exampleNumber; - } - else if ([NBMetadataHelper hasValue:metadata.voip.exampleNumber]) { - fetchedExampleNumber = metadata.voip.exampleNumber; - } - else if ([NBMetadataHelper hasValue:metadata.voicemail.exampleNumber]) { - fetchedExampleNumber = metadata.voicemail.exampleNumber; - } - else if ([NBMetadataHelper hasValue:metadata.uan.exampleNumber]) { - fetchedExampleNumber = metadata.uan.exampleNumber; - } - else if ([NBMetadataHelper hasValue:metadata.premiumRate.exampleNumber]) { - fetchedExampleNumber = metadata.premiumRate.exampleNumber; - } +- (NBPhoneNumber *)getExampleNumberForNonGeoEntity:(NSNumber *)countryCallingCode + error:(NSError *__autoreleasing *)error { + NBPhoneNumber *res = nil; - if (fetchedExampleNumber != nil) { - NSString *callCode = [NSString stringWithFormat:@"+%@%@", countryCallingCode, fetchedExampleNumber]; - res = [self parse:callCode defaultRegion:NB_UNKNOWN_REGION error:error]; - } + NBPhoneMetaData *metadata = [self.helper getMetadataForNonGeographicalRegion:countryCallingCode]; + + if (metadata != nil) { + NSString *fetchedExampleNumber = nil; + if ([NBMetadataHelper hasValue:metadata.mobile.exampleNumber]) { + fetchedExampleNumber = metadata.mobile.exampleNumber; + } else if ([NBMetadataHelper hasValue:metadata.tollFree.exampleNumber]) { + fetchedExampleNumber = metadata.tollFree.exampleNumber; + } else if ([NBMetadataHelper hasValue:metadata.sharedCost.exampleNumber]) { + fetchedExampleNumber = metadata.sharedCost.exampleNumber; + } else if ([NBMetadataHelper hasValue:metadata.voip.exampleNumber]) { + fetchedExampleNumber = metadata.voip.exampleNumber; + } else if ([NBMetadataHelper hasValue:metadata.voicemail.exampleNumber]) { + fetchedExampleNumber = metadata.voicemail.exampleNumber; + } else if ([NBMetadataHelper hasValue:metadata.uan.exampleNumber]) { + fetchedExampleNumber = metadata.uan.exampleNumber; + } else if ([NBMetadataHelper hasValue:metadata.premiumRate.exampleNumber]) { + fetchedExampleNumber = metadata.premiumRate.exampleNumber; } - - return res; -} + if (fetchedExampleNumber != nil) { + NSString *callCode = + [NSString stringWithFormat:@"+%@%@", countryCallingCode, fetchedExampleNumber]; + res = [self parse:callCode defaultRegion:NB_UNKNOWN_REGION error:error]; + } + } + + return res; +} /** * Gets the formatted extension of a phone number, if the phone number had an @@ -2076,60 +2152,59 @@ static NSArray *GEO_MOBILE_COUNTRIES; * @return {string} the formatted extension if any. * @private */ -- (NSString *)maybeGetFormattedExtension:(NBPhoneNumber*)number metadata:(NBPhoneMetaData*)metadata numberFormat:(NBEPhoneNumberFormat)numberFormat -{ - if ([NBMetadataHelper hasValue:number.extension] == NO) { - return @""; +- (NSString *)maybeGetFormattedExtension:(NBPhoneNumber *)number + metadata:(NBPhoneMetaData *)metadata + numberFormat:(NBEPhoneNumberFormat)numberFormat { + if ([NBMetadataHelper hasValue:number.extension] == NO) { + return @""; + } else { + if (numberFormat == NBEPhoneNumberFormatRFC3966) { + return [NSString stringWithFormat:@"%@%@", RFC3966_EXTN_PREFIX, number.extension]; } else { - if (numberFormat == NBEPhoneNumberFormatRFC3966) { - return [NSString stringWithFormat:@"%@%@", RFC3966_EXTN_PREFIX, number.extension]; - } else { - if ([NBMetadataHelper hasValue:metadata.preferredExtnPrefix]) { - return [NSString stringWithFormat:@"%@%@", metadata.preferredExtnPrefix, number.extension]; - } else { - return [NSString stringWithFormat:@"%@%@", DEFAULT_EXTN_PREFIX, number.extension]; - } - } + if ([NBMetadataHelper hasValue:metadata.preferredExtnPrefix]) { + return [NSString stringWithFormat:@"%@%@", metadata.preferredExtnPrefix, number.extension]; + } else { + return [NSString stringWithFormat:@"%@%@", DEFAULT_EXTN_PREFIX, number.extension]; + } } + } } - /** * - param {i18n.phonenumbers.PhoneMetadata} metadata * - param {i18n.phonenumbers.PhoneNumberType} type * @return {i18n.phonenumbers.PhoneNumberDesc} * @private */ -- (NBPhoneNumberDesc*)getNumberDescByType:(NBPhoneMetaData*)metadata type:(NBEPhoneNumberType)type -{ - switch (type) - { - case NBEPhoneNumberTypePREMIUM_RATE: - return metadata.premiumRate; - case NBEPhoneNumberTypeTOLL_FREE: - return metadata.tollFree; - case NBEPhoneNumberTypeMOBILE: - if (metadata.mobile == nil) return metadata.generalDesc; - return metadata.mobile; - case NBEPhoneNumberTypeFIXED_LINE: - case NBEPhoneNumberTypeFIXED_LINE_OR_MOBILE: - if (metadata.fixedLine == nil) return metadata.generalDesc; - return metadata.fixedLine; - case NBEPhoneNumberTypeSHARED_COST: - return metadata.sharedCost; - case NBEPhoneNumberTypeVOIP: - return metadata.voip; - case NBEPhoneNumberTypePERSONAL_NUMBER: - return metadata.personalNumber; - case NBEPhoneNumberTypePAGER: - return metadata.pager; - case NBEPhoneNumberTypeUAN: - return metadata.uan; - case NBEPhoneNumberTypeVOICEMAIL: - return metadata.voicemail; - default: - return metadata.generalDesc; - } +- (NBPhoneNumberDesc *)getNumberDescByType:(NBPhoneMetaData *)metadata + type:(NBEPhoneNumberType)type { + switch (type) { + case NBEPhoneNumberTypePREMIUM_RATE: + return metadata.premiumRate; + case NBEPhoneNumberTypeTOLL_FREE: + return metadata.tollFree; + case NBEPhoneNumberTypeMOBILE: + if (metadata.mobile == nil) return metadata.generalDesc; + return metadata.mobile; + case NBEPhoneNumberTypeFIXED_LINE: + case NBEPhoneNumberTypeFIXED_LINE_OR_MOBILE: + if (metadata.fixedLine == nil) return metadata.generalDesc; + return metadata.fixedLine; + case NBEPhoneNumberTypeSHARED_COST: + return metadata.sharedCost; + case NBEPhoneNumberTypeVOIP: + return metadata.voip; + case NBEPhoneNumberTypePERSONAL_NUMBER: + return metadata.personalNumber; + case NBEPhoneNumberTypePAGER: + return metadata.pager; + case NBEPhoneNumberTypeUAN: + return metadata.uan; + case NBEPhoneNumberTypeVOICEMAIL: + return metadata.voicemail; + default: + return metadata.generalDesc; + } } /** @@ -2139,19 +2214,17 @@ static NSArray *GEO_MOBILE_COUNTRIES; * to know the type. * @return {i18n.phonenumbers.PhoneNumberType} the type of the phone number. */ -- (NBEPhoneNumberType)getNumberType:(NBPhoneNumber*)phoneNumber -{ - NSString *regionCode = [self getRegionCodeForNumber:phoneNumber]; - NBPhoneMetaData *metadata = [self getMetadataForRegionOrCallingCode:phoneNumber.countryCode regionCode:regionCode]; - if (metadata == nil) - { - return NBEPhoneNumberTypeUNKNOWN; - } - - NSString *nationalSignificantNumber = [self getNationalSignificantNumber:phoneNumber]; - return [self getNumberTypeHelper:nationalSignificantNumber metadata:metadata]; -} +- (NBEPhoneNumberType)getNumberType:(NBPhoneNumber *)phoneNumber { + NSString *regionCode = [self getRegionCodeForNumber:phoneNumber]; + NBPhoneMetaData *metadata = + [self getMetadataForRegionOrCallingCode:phoneNumber.countryCode regionCode:regionCode]; + if (metadata == nil) { + return NBEPhoneNumberTypeUNKNOWN; + } + NSString *nationalSignificantNumber = [self getNationalSignificantNumber:phoneNumber]; + return [self getNumberTypeHelper:nationalSignificantNumber metadata:metadata]; +} /** * - param {string} nationalNumber @@ -2159,66 +2232,65 @@ static NSArray *GEO_MOBILE_COUNTRIES; * @return {i18n.phonenumbers.PhoneNumberType} * @private */ -- (NBEPhoneNumberType)getNumberTypeHelper:(NSString *)nationalNumber metadata:(NBPhoneMetaData*)metadata -{ - NBPhoneNumberDesc *generalNumberDesc = metadata.generalDesc; +- (NBEPhoneNumberType)getNumberTypeHelper:(NSString *)nationalNumber + metadata:(NBPhoneMetaData *)metadata { + NBPhoneNumberDesc *generalNumberDesc = metadata.generalDesc; - if ([self isNumberMatchingDesc:nationalNumber numberDesc:generalNumberDesc] == NO) { - return NBEPhoneNumberTypeUNKNOWN; - } - - if ([self isNumberMatchingDesc:nationalNumber numberDesc:metadata.premiumRate]) { - return NBEPhoneNumberTypePREMIUM_RATE; - } - - if ([self isNumberMatchingDesc:nationalNumber numberDesc:metadata.tollFree]) { - return NBEPhoneNumberTypeTOLL_FREE; - } - - if ([self isNumberMatchingDesc:nationalNumber numberDesc:metadata.sharedCost]) { - return NBEPhoneNumberTypeSHARED_COST; - } - - if ([self isNumberMatchingDesc:nationalNumber numberDesc:metadata.voip]) { - return NBEPhoneNumberTypeVOIP; - } - - if ([self isNumberMatchingDesc:nationalNumber numberDesc:metadata.personalNumber]) { - return NBEPhoneNumberTypePERSONAL_NUMBER; - } - - if ([self isNumberMatchingDesc:nationalNumber numberDesc:metadata.pager]) { - return NBEPhoneNumberTypePAGER; - } - - if ([self isNumberMatchingDesc:nationalNumber numberDesc:metadata.uan]) { - return NBEPhoneNumberTypeUAN; - } - - if ([self isNumberMatchingDesc:nationalNumber numberDesc:metadata.voicemail]) { - return NBEPhoneNumberTypeVOICEMAIL; - } - - BOOL isFixedLine = [self isNumberMatchingDesc:nationalNumber numberDesc:metadata.fixedLine]; - if (isFixedLine) { - if (metadata.sameMobileAndFixedLinePattern) { - return NBEPhoneNumberTypeFIXED_LINE_OR_MOBILE; - } - else if ([self isNumberMatchingDesc:nationalNumber numberDesc:metadata.mobile]) { - return NBEPhoneNumberTypeFIXED_LINE_OR_MOBILE; - } - return NBEPhoneNumberTypeFIXED_LINE; - } - - // Otherwise, test to see if the number is mobile. Only do this if certain - // that the patterns for mobile and fixed line aren't the same. - if ([metadata sameMobileAndFixedLinePattern] == NO && [self isNumberMatchingDesc:nationalNumber numberDesc:metadata.mobile]) { - return NBEPhoneNumberTypeMOBILE; - } - + if ([self isNumberMatchingDesc:nationalNumber numberDesc:generalNumberDesc] == NO) { return NBEPhoneNumberTypeUNKNOWN; -} + } + if ([self isNumberMatchingDesc:nationalNumber numberDesc:metadata.premiumRate]) { + return NBEPhoneNumberTypePREMIUM_RATE; + } + + if ([self isNumberMatchingDesc:nationalNumber numberDesc:metadata.tollFree]) { + return NBEPhoneNumberTypeTOLL_FREE; + } + + if ([self isNumberMatchingDesc:nationalNumber numberDesc:metadata.sharedCost]) { + return NBEPhoneNumberTypeSHARED_COST; + } + + if ([self isNumberMatchingDesc:nationalNumber numberDesc:metadata.voip]) { + return NBEPhoneNumberTypeVOIP; + } + + if ([self isNumberMatchingDesc:nationalNumber numberDesc:metadata.personalNumber]) { + return NBEPhoneNumberTypePERSONAL_NUMBER; + } + + if ([self isNumberMatchingDesc:nationalNumber numberDesc:metadata.pager]) { + return NBEPhoneNumberTypePAGER; + } + + if ([self isNumberMatchingDesc:nationalNumber numberDesc:metadata.uan]) { + return NBEPhoneNumberTypeUAN; + } + + if ([self isNumberMatchingDesc:nationalNumber numberDesc:metadata.voicemail]) { + return NBEPhoneNumberTypeVOICEMAIL; + } + + BOOL isFixedLine = [self isNumberMatchingDesc:nationalNumber numberDesc:metadata.fixedLine]; + if (isFixedLine) { + if (metadata.sameMobileAndFixedLinePattern) { + return NBEPhoneNumberTypeFIXED_LINE_OR_MOBILE; + } else if ([self isNumberMatchingDesc:nationalNumber numberDesc:metadata.mobile]) { + return NBEPhoneNumberTypeFIXED_LINE_OR_MOBILE; + } + return NBEPhoneNumberTypeFIXED_LINE; + } + + // Otherwise, test to see if the number is mobile. Only do this if certain + // that the patterns for mobile and fixed line aren't the same. + if ([metadata sameMobileAndFixedLinePattern] == NO && + [self isNumberMatchingDesc:nationalNumber numberDesc:metadata.mobile]) { + return NBEPhoneNumberTypeMOBILE; + } + + return NBEPhoneNumberTypeUNKNOWN; +} /** * - param {string} nationalNumber @@ -2226,18 +2298,17 @@ static NSArray *GEO_MOBILE_COUNTRIES; * @return {boolean} * @private */ -- (BOOL)isNumberMatchingDesc:(NSString *)nationalNumber numberDesc:(NBPhoneNumberDesc *)numberDesc -{ - NSNumber *actualLength = [NSNumber numberWithUnsignedInteger:nationalNumber.length]; +- (BOOL)isNumberMatchingDesc:(NSString *)nationalNumber numberDesc:(NBPhoneNumberDesc *)numberDesc { + NSNumber *actualLength = [NSNumber numberWithUnsignedInteger:nationalNumber.length]; - if (numberDesc.possibleLength.count > 0 && [numberDesc.possibleLength indexOfObject:actualLength] == NSNotFound) { - return NO; - } + if (numberDesc.possibleLength.count > 0 && + [numberDesc.possibleLength indexOfObject:actualLength] == NSNotFound) { + return NO; + } - return [self matchesEntirely:numberDesc.nationalNumberPattern string:nationalNumber]; + return [self matchesEntirely:numberDesc.nationalNumberPattern string:nationalNumber]; } - /** * Tests whether a phone number matches a valid pattern. Note this doesn't * verify the number is actually in use, which is impossible to tell by just @@ -2248,13 +2319,11 @@ static NSArray *GEO_MOBILE_COUNTRIES; * @return {boolean} a boolean that indicates whether the number is of a valid * pattern. */ -- (BOOL)isValidNumber:(NBPhoneNumber*)number -{ - NSString *regionCode = [self getRegionCodeForNumber:number]; - return [self isValidNumberForRegion:number regionCode:regionCode]; +- (BOOL)isValidNumber:(NBPhoneNumber *)number { + NSString *regionCode = [self getRegionCodeForNumber:number]; + return [self isValidNumberForRegion:number regionCode:regionCode]; } - /** * Tests whether a phone number is valid for a certain region. Note this doesn't * verify the number is actually in use, which is impossible to tell by just @@ -2275,34 +2344,34 @@ static NSArray *GEO_MOBILE_COUNTRIES; * @return {boolean} a boolean that indicates whether the number is of a valid * pattern. */ -- (BOOL)isValidNumberForRegion:(NBPhoneNumber*)number regionCode:(NSString *)regionCode -{ - NSNumber *countryCode = [number.countryCode copy]; - NBPhoneMetaData *metadata = [self getMetadataForRegionOrCallingCode:countryCode regionCode:regionCode]; - if (metadata == nil || - ([NB_REGION_CODE_FOR_NON_GEO_ENTITY isEqualToString:regionCode] == NO && - ![countryCode isEqualToNumber:[self getCountryCodeForValidRegion:regionCode error:nil]])) { - // Either the region code was invalid, or the country calling code for this - // number does not match that of the region code. - return NO; - } - - NBPhoneNumberDesc *generalNumDesc = metadata.generalDesc; - NSString *nationalSignificantNumber = [self getNationalSignificantNumber:number]; - - // For regions where we don't have metadata for PhoneNumberDesc, we treat any - // number passed in as a valid number if its national significant number is - // between the minimum and maximum lengths defined by ITU for a national - // significant number. - - if ([NBMetadataHelper hasValue:generalNumDesc.nationalNumberPattern] == NO) { - NSUInteger numberLength = nationalSignificantNumber.length; - return numberLength > MIN_LENGTH_FOR_NSN_ && numberLength <= MAX_LENGTH_FOR_NSN_; - } - - return [self getNumberTypeHelper:nationalSignificantNumber metadata:metadata] != NBEPhoneNumberTypeUNKNOWN; -} +- (BOOL)isValidNumberForRegion:(NBPhoneNumber *)number regionCode:(NSString *)regionCode { + NSNumber *countryCode = [number.countryCode copy]; + NBPhoneMetaData *metadata = + [self getMetadataForRegionOrCallingCode:countryCode regionCode:regionCode]; + if (metadata == nil || + ([NB_REGION_CODE_FOR_NON_GEO_ENTITY isEqualToString:regionCode] == NO && + ![countryCode isEqualToNumber:[self getCountryCodeForValidRegion:regionCode error:nil]])) { + // Either the region code was invalid, or the country calling code for this + // number does not match that of the region code. + return NO; + } + NBPhoneNumberDesc *generalNumDesc = metadata.generalDesc; + NSString *nationalSignificantNumber = [self getNationalSignificantNumber:number]; + + // For regions where we don't have metadata for PhoneNumberDesc, we treat any + // number passed in as a valid number if its national significant number is + // between the minimum and maximum lengths defined by ITU for a national + // significant number. + + if ([NBMetadataHelper hasValue:generalNumDesc.nationalNumberPattern] == NO) { + NSUInteger numberLength = nationalSignificantNumber.length; + return numberLength > MIN_LENGTH_FOR_NSN_ && numberLength <= MAX_LENGTH_FOR_NSN_; + } + + return [self getNumberTypeHelper:nationalSignificantNumber metadata:metadata] != + NBEPhoneNumberTypeUNKNOWN; +} /** * Returns the region where a phone number is from. This could be used for @@ -2313,55 +2382,53 @@ static NSArray *GEO_MOBILE_COUNTRIES; * @return {?string} the region where the phone number is from, or nil * if no region matches this calling code. */ -- (NSString *)getRegionCodeForNumber:(NBPhoneNumber*)phoneNumber -{ - if (phoneNumber == nil) { - return nil; - } - - NSArray *regionCodes = [NBMetadataHelper regionCodeFromCountryCode:phoneNumber.countryCode]; - if (regionCodes == nil || [regionCodes count] <= 0) { - return nil; - } - - if ([regionCodes count] == 1) { - return [regionCodes objectAtIndex:0]; - } else { - return [self getRegionCodeForNumberFromRegionList:phoneNumber regionCodes:regionCodes]; - } -} +- (NSString *)getRegionCodeForNumber:(NBPhoneNumber *)phoneNumber { + if (phoneNumber == nil) { + return nil; + } + NSArray *regionCodes = [NBMetadataHelper regionCodeFromCountryCode:phoneNumber.countryCode]; + if (regionCodes == nil || [regionCodes count] <= 0) { + return nil; + } + + if ([regionCodes count] == 1) { + return [regionCodes objectAtIndex:0]; + } else { + return [self getRegionCodeForNumberFromRegionList:phoneNumber regionCodes:regionCodes]; + } +} /** * - param {i18n.phonenumbers.PhoneNumber} number * - param {Array.} regionCodes * @return {?string} * @private - - */ -- (NSString *)getRegionCodeForNumberFromRegionList:(NBPhoneNumber*)phoneNumber regionCodes:(NSArray*)regionCodes -{ - NSString *nationalNumber = [self getNationalSignificantNumber:phoneNumber]; - NSUInteger regionCodesCount = [regionCodes count]; - - NBMetadataHelper *helper = self.helper; - - for (NSUInteger i = 0; i < regionCodesCount; i++) { - NSString *regionCode = [regionCodes objectAtIndex:i]; - NBPhoneMetaData *metadata = [helper getMetadataForRegion:regionCode]; - - if ([NBMetadataHelper hasValue:metadata.leadingDigits]) { - if ([self stringPositionByRegex:nationalNumber regex:metadata.leadingDigits] == 0) { - return regionCode; - } - } else if ([self getNumberTypeHelper:nationalNumber metadata:metadata] != NBEPhoneNumberTypeUNKNOWN) { - return regionCode; - } - } - - return nil; -} + */ +- (NSString *)getRegionCodeForNumberFromRegionList:(NBPhoneNumber *)phoneNumber + regionCodes:(NSArray *)regionCodes { + NSString *nationalNumber = [self getNationalSignificantNumber:phoneNumber]; + NSUInteger regionCodesCount = [regionCodes count]; + + NBMetadataHelper *helper = self.helper; + + for (NSUInteger i = 0; i < regionCodesCount; i++) { + NSString *regionCode = [regionCodes objectAtIndex:i]; + NBPhoneMetaData *metadata = [helper getMetadataForRegion:regionCode]; + + if ([NBMetadataHelper hasValue:metadata.leadingDigits]) { + if ([self stringPositionByRegex:nationalNumber regex:metadata.leadingDigits] == 0) { + return regionCode; + } + } else if ([self getNumberTypeHelper:nationalNumber metadata:metadata] != + NBEPhoneNumberTypeUNKNOWN) { + return regionCode; + } + } + + return nil; +} /** * Returns the region code that matches the specific country calling code. In @@ -2372,13 +2439,11 @@ static NSArray *GEO_MOBILE_COUNTRIES; * - param {number} countryCallingCode the country calling code. * @return {string} */ -- (NSString *)getRegionCodeForCountryCode:(NSNumber *)countryCallingCode -{ - NSArray *regionCodes = [NBMetadataHelper regionCodeFromCountryCode:countryCallingCode]; - return regionCodes == nil ? NB_UNKNOWN_REGION : [regionCodes objectAtIndex:0]; +- (NSString *)getRegionCodeForCountryCode:(NSNumber *)countryCallingCode { + NSArray *regionCodes = [NBMetadataHelper regionCodeFromCountryCode:countryCallingCode]; + return regionCodes == nil ? NB_UNKNOWN_REGION : [regionCodes objectAtIndex:0]; } - /** * Returns a list with the region codes that match the specific country calling * code. For non-geographical country calling codes, the region code 001 is @@ -2388,13 +2453,11 @@ static NSArray *GEO_MOBILE_COUNTRIES; * - param {number} countryCallingCode the country calling code. * @return {Array.} */ -- (NSArray*)getRegionCodesForCountryCode:(NSNumber *)countryCallingCode -{ - NSArray *regionCodes = [NBMetadataHelper regionCodeFromCountryCode:countryCallingCode]; - return regionCodes == nil ? nil : regionCodes; +- (NSArray *)getRegionCodesForCountryCode:(NSNumber *)countryCallingCode { + NSArray *regionCodes = [NBMetadataHelper regionCodeFromCountryCode:countryCallingCode]; + return regionCodes == nil ? nil : regionCodes; } - /** * Returns the country calling code for a specific region. For example, this * would be 1 for the United States, and 64 for New Zealand. @@ -2404,21 +2467,19 @@ static NSArray *GEO_MOBILE_COUNTRIES; * @return {number} the country calling code for the region denoted by * regionCode. */ -- (NSNumber*)getCountryCodeForRegion:(NSString *)regionCode -{ - if ([self isValidRegionCode:regionCode] == NO) { - return @0; - } - - NSError *error = nil; - NSNumber *res = [self getCountryCodeForValidRegion:regionCode error:&error]; - if (error != nil) { - return @0; - } - - return res; -} +- (NSNumber *)getCountryCodeForRegion:(NSString *)regionCode { + if ([self isValidRegionCode:regionCode] == NO) { + return @0; + } + NSError *error = nil; + NSNumber *res = [self getCountryCodeForValidRegion:regionCode error:&error]; + if (error != nil) { + return @0; + } + + return res; +} /** * Returns the country calling code for a specific region. For example, this @@ -2432,23 +2493,22 @@ static NSArray *GEO_MOBILE_COUNTRIES; * @throws {string} if the region is invalid * @private */ -- (NSNumber*)getCountryCodeForValidRegion:(NSString *)regionCode error:(NSError**)error -{ - NBPhoneMetaData *metadata = [self.helper getMetadataForRegion:regionCode]; - - if (metadata == nil) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObject:[NSString stringWithFormat:@"Invalid region code:%@", regionCode] - forKey:NSLocalizedDescriptionKey]; - if (error != NULL) { - (*error) = [NSError errorWithDomain:@"INVALID_REGION_CODE" code:0 userInfo:userInfo]; - } - - return @-1; - } - - return metadata.countryCode; -} +- (NSNumber *)getCountryCodeForValidRegion:(NSString *)regionCode error:(NSError **)error { + NBPhoneMetaData *metadata = [self.helper getMetadataForRegion:regionCode]; + if (metadata == nil) { + NSDictionary *userInfo = [NSDictionary + dictionaryWithObject:[NSString stringWithFormat:@"Invalid region code:%@", regionCode] + forKey:NSLocalizedDescriptionKey]; + if (error != NULL) { + (*error) = [NSError errorWithDomain:@"INVALID_REGION_CODE" code:0 userInfo:userInfo]; + } + + return @-1; + } + + return metadata.countryCode; +} /** * Returns the national dialling prefix for a specific region. For example, this @@ -2469,27 +2529,25 @@ static NSArray *GEO_MOBILE_COUNTRIES; * @return {?string} the dialling prefix for the region denoted by * regionCode. */ -- (NSString *)getNddPrefixForRegion:(NSString *)regionCode stripNonDigits:(BOOL)stripNonDigits -{ - NBPhoneMetaData *metadata = [self.helper getMetadataForRegion:regionCode]; - if (metadata == nil) { - return nil; - } - - NSString *nationalPrefix = metadata.nationalPrefix; - // If no national prefix was found, we return nil. - if (nationalPrefix.length == 0) { - return nil; - } - - if (stripNonDigits) { - // Note: if any other non-numeric symbols are ever used in national - // prefixes, these would have to be removed here as well. - nationalPrefix = [nationalPrefix stringByReplacingOccurrencesOfString:@"~" withString:@""]; - } - return nationalPrefix; -} +- (NSString *)getNddPrefixForRegion:(NSString *)regionCode stripNonDigits:(BOOL)stripNonDigits { + NBPhoneMetaData *metadata = [self.helper getMetadataForRegion:regionCode]; + if (metadata == nil) { + return nil; + } + NSString *nationalPrefix = metadata.nationalPrefix; + // If no national prefix was found, we return nil. + if (nationalPrefix.length == 0) { + return nil; + } + + if (stripNonDigits) { + // Note: if any other non-numeric symbols are ever used in national + // prefixes, these would have to be removed here as well. + nationalPrefix = [nationalPrefix stringByReplacingOccurrencesOfString:@"~" withString:@""]; + } + return nationalPrefix; +} /** * Checks if this is a region under the North American Numbering Plan @@ -2498,20 +2556,19 @@ static NSArray *GEO_MOBILE_COUNTRIES; * - param {?string} regionCode the ISO 3166-1 two-letter region code. * @return {boolean} NO if regionCode is one of the regions under NANPA. */ -- (BOOL)isNANPACountry:(NSString *)regionCode -{ - BOOL isExists = NO; - NSArray *res = [NBMetadataHelper regionCodeFromCountryCode:[NSNumber numberWithUnsignedInteger:NANPA_COUNTRY_CODE_]]; - - for (NSString *inRegionCode in res) { - if ([inRegionCode isEqualToString:regionCode.uppercaseString]) { - isExists = YES; - } - } - - return regionCode != nil && isExists; -} +- (BOOL)isNANPACountry:(NSString *)regionCode { + BOOL isExists = NO; + NSArray *res = [NBMetadataHelper + regionCodeFromCountryCode:[NSNumber numberWithUnsignedInteger:NANPA_COUNTRY_CODE_]]; + for (NSString *inRegionCode in res) { + if ([inRegionCode isEqualToString:regionCode.uppercaseString]) { + isExists = YES; + } + } + + return regionCode != nil && isExists; +} /** * Checks whether countryCode represents the country calling code from a region @@ -2522,14 +2579,13 @@ static NSArray *GEO_MOBILE_COUNTRIES; * - param {number} countryCallingCode the country calling code. * @return {boolean} */ -- (BOOL)isLeadingZeroPossible:(NSNumber *)countryCallingCode -{ - NBPhoneMetaData *mainMetadataForCallingCode = [self getMetadataForRegionOrCallingCode:countryCallingCode - regionCode:[self getRegionCodeForCountryCode:countryCallingCode]]; - - return mainMetadataForCallingCode != nil && mainMetadataForCallingCode.leadingZeroPossible; -} +- (BOOL)isLeadingZeroPossible:(NSNumber *)countryCallingCode { + NBPhoneMetaData *mainMetadataForCallingCode = [self + getMetadataForRegionOrCallingCode:countryCallingCode + regionCode:[self getRegionCodeForCountryCode:countryCallingCode]]; + return mainMetadataForCallingCode != nil && mainMetadataForCallingCode.leadingZeroPossible; +} /** * Checks if the number is a valid vanity (alpha) number such as 800 MICROSOFT. @@ -2542,22 +2598,20 @@ static NSArray *GEO_MOBILE_COUNTRIES; * - param {string} number the number that needs to be checked. * @return {boolean} NO if the number is a valid vanity number. */ -- (BOOL)isAlphaNumber:(NSString *)number -{ - if ([self isViablePhoneNumber:number] == NO) { - // Number is too short, or doesn't match the basic phone number pattern. - return NO; - } - - number = NormalizeNonBreakingSpace(number); - - /** @type {!goog.string.StringBuffer} */ - NSString *strippedNumber = [number copy]; - [self maybeStripExtension:&strippedNumber]; - - return [self matchesEntirely:VALID_ALPHA_PHONE_PATTERN_STRING string:strippedNumber]; -} +- (BOOL)isAlphaNumber:(NSString *)number { + if ([self isViablePhoneNumber:number] == NO) { + // Number is too short, or doesn't match the basic phone number pattern. + return NO; + } + number = NormalizeNonBreakingSpace(number); + + /** @type {!goog.string.StringBuffer} */ + NSString *strippedNumber = [number copy]; + [self maybeStripExtension:&strippedNumber]; + + return [self matchesEntirely:VALID_ALPHA_PHONE_PATTERN_STRING string:strippedNumber]; +} /** * Convenience wrapper around {@link #isPossibleNumberWithReason}. Instead of @@ -2567,104 +2621,112 @@ static NSArray *GEO_MOBILE_COUNTRIES; * checked. * @return {boolean} NO if the number is possible. */ -- (BOOL)isPossibleNumber:(NBPhoneNumber*)number error:(NSError**)error -{ - BOOL res = NO; - @try { - res = [self isPossibleNumber:number]; - } - @catch (NSException *exception) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObject:exception.reason - forKey:NSLocalizedDescriptionKey]; - if (error != NULL) - (*error) = [NSError errorWithDomain:exception.name code:0 userInfo:userInfo]; - } - return res; +- (BOOL)isPossibleNumber:(NBPhoneNumber *)number error:(NSError **)error { + BOOL res = NO; + @try { + res = [self isPossibleNumber:number]; + } @catch (NSException *exception) { + NSDictionary *userInfo = + [NSDictionary dictionaryWithObject:exception.reason forKey:NSLocalizedDescriptionKey]; + if (error != NULL) (*error) = [NSError errorWithDomain:exception.name code:0 userInfo:userInfo]; + } + return res; } - -- (BOOL)isPossibleNumber:(NBPhoneNumber*)number -{ - return [self isPossibleNumberWithReason:number] == NBEValidationResultIS_POSSIBLE; +- (BOOL)isPossibleNumber:(NBPhoneNumber *)number { + return [self isPossibleNumberWithReason:number] == NBEValidationResultIS_POSSIBLE; } /** * Helper method to check a number against possible lengths for this region, based on the metadata * being passed in, and determine whether it matches, or is too short or too long. */ -- (NBEValidationResult)validateNumberLength:(NSString *)number metadata:(NBPhoneMetaData *)metadata { - return [self validateNumberLength:number metadata:metadata type:NBEPhoneNumberTypeUNKNOWN]; +- (NBEValidationResult)validateNumberLength:(NSString *)number + metadata:(NBPhoneMetaData *)metadata { + return [self validateNumberLength:number metadata:metadata type:NBEPhoneNumberTypeUNKNOWN]; } /** * Helper method to check a number against possible lengths for this number type, and determine * whether it matches, or is too short or too long. */ -- (NBEValidationResult)validateNumberLength:(NSString *)number metadata:(NBPhoneMetaData *)metadata type:(NBEPhoneNumberType)type { - NBPhoneNumberDesc *descForType = [self getNumberDescByType:metadata type:type]; - // There should always be "possibleLengths" set for every element. - // For size efficiency, where a sub-description (e.g. fixed-line) has the same possibleLengths - // as the parent, this is missing, so we fall back to the general desc (where no numbers of the - // type exist at all, there is one possible length (-1) which is guaranteed not to match the - // length of any real phone number). - NSArray *possibleLengths = [descForType.possibleLength count] == 0 ? metadata.generalDesc.possibleLength : descForType.possibleLength; - NSArray *localLengths = descForType.possibleLengthLocalOnly; - - if (type == NBEPhoneNumberTypeFIXED_LINE_OR_MOBILE) { - if ([self descHasPossibleNumberData:[self getNumberDescByType:metadata type:NBEPhoneNumberTypeFIXED_LINE]]) { - // The rare case has been encountered where no fixedLine data is available (true for some - // non-geographical entities), so we just check mobile. - return [self validateNumberLength:number metadata:metadata type:NBEPhoneNumberTypeMOBILE]; +- (NBEValidationResult)validateNumberLength:(NSString *)number + metadata:(NBPhoneMetaData *)metadata + type:(NBEPhoneNumberType)type { + NBPhoneNumberDesc *descForType = [self getNumberDescByType:metadata type:type]; + // There should always be "possibleLengths" set for every element. + // For size efficiency, where a sub-description (e.g. fixed-line) has the same possibleLengths + // as the parent, this is missing, so we fall back to the general desc (where no numbers of the + // type exist at all, there is one possible length (-1) which is guaranteed not to match the + // length of any real phone number). + NSArray *possibleLengths = [descForType.possibleLength count] == 0 + ? metadata.generalDesc.possibleLength + : descForType.possibleLength; + NSArray *localLengths = descForType.possibleLengthLocalOnly; + + if (type == NBEPhoneNumberTypeFIXED_LINE_OR_MOBILE) { + if ([self descHasPossibleNumberData:[self getNumberDescByType:metadata + type:NBEPhoneNumberTypeFIXED_LINE]]) { + // The rare case has been encountered where no fixedLine data is available (true for some + // non-geographical entities), so we just check mobile. + return [self validateNumberLength:number metadata:metadata type:NBEPhoneNumberTypeMOBILE]; + } else { + NBPhoneNumberDesc *mobileDesc = + [self getNumberDescByType:metadata type:NBEPhoneNumberTypeMOBILE]; + if ([self descHasPossibleNumberData:mobileDesc]) { + // Merge the mobile data in if there was any. We have to make a copy to do this. + // Note that when adding the possible lengths from mobile, we have to again check they + // aren't empty since if they are this indicates they are the same as the general desc and + // should be obtained from there. + NSArray *combinedArray = + [possibleLengths arrayByAddingObjectsFromArray:[mobileDesc.possibleLength count] == 0 + ? metadata.generalDesc.possibleLength + : mobileDesc.possibleLength]; + + // The current list is sorted; we need to merge in the new list and re-sort (duplicates + // are okay). Sorting isn't so expensive because the lists are very small. + possibleLengths = [combinedArray sortedArrayUsingSelector:@selector(compare:)]; + + if (![localLengths count]) { + localLengths = mobileDesc.possibleLengthLocalOnly; } else { - NBPhoneNumberDesc *mobileDesc = [self getNumberDescByType:metadata type:NBEPhoneNumberTypeMOBILE]; - if([self descHasPossibleNumberData:mobileDesc]) { - // Merge the mobile data in if there was any. We have to make a copy to do this. - // Note that when adding the possible lengths from mobile, we have to again check they - // aren't empty since if they are this indicates they are the same as the general desc and - // should be obtained from there. - NSArray *combinedArray = [possibleLengths arrayByAddingObjectsFromArray:[mobileDesc.possibleLength count] == 0 ? metadata.generalDesc.possibleLength : mobileDesc.possibleLength]; - - // The current list is sorted; we need to merge in the new list and re-sort (duplicates - // are okay). Sorting isn't so expensive because the lists are very small. - possibleLengths = [combinedArray sortedArrayUsingSelector:@selector(compare:)]; - - if (![localLengths count]) { - localLengths = mobileDesc.possibleLengthLocalOnly; - } else { - NSArray *combinedArray = [localLengths arrayByAddingObjectsFromArray:mobileDesc.possibleLengthLocalOnly]; - localLengths = [combinedArray sortedArrayUsingSelector:@selector(compare:)]; - } - } + NSArray *combinedArray = + [localLengths arrayByAddingObjectsFromArray:mobileDesc.possibleLengthLocalOnly]; + localLengths = [combinedArray sortedArrayUsingSelector:@selector(compare:)]; } + } } - - // If the type is not supported at all (indicated by the possible lengths containing -1 at this - // point) we return invalid length. - if ([possibleLengths.firstObject isEqualToNumber:@(-1)]) { - return NBEValidationResultINVALID_LENGTH; - } - - NSNumber *actualLength = @(number.length); - // This is safe because there is never an overlap beween the possible lengths and the local-only - // lengths; this is checked at build time. - if ([localLengths containsObject:actualLength]) { - return NBEValidationResultIS_POSSIBLE_LOCAL_ONLY; - } - - NSNumber *minimumLength = possibleLengths.firstObject; - NSComparisonResult comparisionResult = [minimumLength compare:actualLength]; - - if (comparisionResult == NSOrderedSame) { - return NBEValidationResultIS_POSSIBLE; - } else if (comparisionResult == NSOrderedDescending) { - return NBEValidationResultTOO_SHORT; - } else if ([possibleLengths.lastObject compare:actualLength] == NSOrderedAscending) { - return NBEValidationResultTOO_LONG; - } - - // We skip the first element; we've already checked it. - NSArray *possibleLengthsSubarray = [possibleLengths subarrayWithRange:NSMakeRange(1, possibleLengths.count - 1)]; - return [possibleLengthsSubarray containsObject:actualLength] ? NBEValidationResultIS_POSSIBLE : NBEValidationResultINVALID_LENGTH; + } + + // If the type is not supported at all (indicated by the possible lengths containing -1 at this + // point) we return invalid length. + if ([possibleLengths.firstObject isEqualToNumber:@(-1)]) { + return NBEValidationResultINVALID_LENGTH; + } + + NSNumber *actualLength = @(number.length); + // This is safe because there is never an overlap beween the possible lengths and the local-only + // lengths; this is checked at build time. + if ([localLengths containsObject:actualLength]) { + return NBEValidationResultIS_POSSIBLE_LOCAL_ONLY; + } + + NSNumber *minimumLength = possibleLengths.firstObject; + NSComparisonResult comparisionResult = [minimumLength compare:actualLength]; + + if (comparisionResult == NSOrderedSame) { + return NBEValidationResultIS_POSSIBLE; + } else if (comparisionResult == NSOrderedDescending) { + return NBEValidationResultTOO_SHORT; + } else if ([possibleLengths.lastObject compare:actualLength] == NSOrderedAscending) { + return NBEValidationResultTOO_LONG; + } + + // We skip the first element; we've already checked it. + NSArray *possibleLengthsSubarray = + [possibleLengths subarrayWithRange:NSMakeRange(1, possibleLengths.count - 1)]; + return [possibleLengthsSubarray containsObject:actualLength] ? NBEValidationResultIS_POSSIBLE + : NBEValidationResultINVALID_LENGTH; } /** @@ -2679,40 +2741,40 @@ static NSArray *GEO_MOBILE_COUNTRIES; * - return {i18n.phonenumbers.PhoneNumberUtil.ValidationResult} * @private */ -- (NBEValidationResult)testNumberLength:(NSString *)number desc:(NBPhoneNumberDesc *)phoneNumberDesc -{ - NSArray *possibleLengths = phoneNumberDesc.possibleLength; - NSArray *localLengths = phoneNumberDesc.possibleLengthLocalOnly; +- (NBEValidationResult)testNumberLength:(NSString *)number + desc:(NBPhoneNumberDesc *)phoneNumberDesc { + NSArray *possibleLengths = phoneNumberDesc.possibleLength; + NSArray *localLengths = phoneNumberDesc.possibleLengthLocalOnly; - NSUInteger actualLength = number.length; + NSUInteger actualLength = number.length; - if ([localLengths containsObject:@(actualLength)]) { - return NBEValidationResultIS_POSSIBLE; + if ([localLengths containsObject:@(actualLength)]) { + return NBEValidationResultIS_POSSIBLE; + } + + // There should always be "possibleLengths" set for every element. This will + // be a build-time check once ShortNumberMetadata.xml is migrated to contain + // this information as well. + NSNumber *minimumLength = possibleLengths[0]; + if (minimumLength.unsignedIntegerValue == actualLength) { + return NBEValidationResultIS_POSSIBLE; + } else if (minimumLength.unsignedIntegerValue > actualLength) { + return NBEValidationResultTOO_SHORT; + } else if (possibleLengths.count - 1 < possibleLengths.count) { + if (((NSNumber *)possibleLengths[possibleLengths.count - 1]).integerValue < actualLength) { + return NBEValidationResultTOO_LONG; } - - // There should always be "possibleLengths" set for every element. This will - // be a build-time check once ShortNumberMetadata.xml is migrated to contain - // this information as well. - NSNumber *minimumLength = possibleLengths[0]; - if (minimumLength.unsignedIntegerValue == actualLength) { - return NBEValidationResultIS_POSSIBLE; - } else if (minimumLength.unsignedIntegerValue > actualLength) { - return NBEValidationResultTOO_SHORT; - } else if (possibleLengths.count - 1 < possibleLengths.count) { - if (((NSNumber *)possibleLengths[possibleLengths.count - 1]).integerValue < actualLength) { - return NBEValidationResultTOO_LONG; - } - } - // Note that actually the number is not too long if possible_lengths does not - // contain the length: we know it is less than the highest possible number - // length, and higher than the lowest possible number length. However, we - // don't currently have an enum to express this, so we return TOO_LONG in the - // short-term. - // We skip the first element since we've already checked it. - return [possibleLengths containsObject:@(actualLength)] ? NBEValidationResultIS_POSSIBLE : NBEValidationResultTOO_LONG; + } + // Note that actually the number is not too long if possible_lengths does not + // contain the length: we know it is less than the highest possible number + // length, and higher than the lowest possible number length. However, we + // don't currently have an enum to express this, so we return TOO_LONG in the + // short-term. + // We skip the first element since we've already checked it. + return [possibleLengths containsObject:@(actualLength)] ? NBEValidationResultIS_POSSIBLE + : NBEValidationResultTOO_LONG; } - /** * Check whether a phone number is a possible number. It provides a more lenient * check than {@link #isValidNumber} in the following sense: @@ -2738,43 +2800,39 @@ static NSArray *GEO_MOBILE_COUNTRIES; * @return {ValidationResult} a * ValidationResult object which indicates whether the number is possible. */ -- (NBEValidationResult)isPossibleNumberWithReason:(NBPhoneNumber*)number error:(NSError *__autoreleasing *)error -{ - NBEValidationResult res = NBEValidationResultUNKNOWN; - @try { - res = [self isPossibleNumberWithReason:number]; - } - @catch (NSException *exception) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObject:exception.reason - forKey:NSLocalizedDescriptionKey]; - if (error != NULL) - (*error) = [NSError errorWithDomain:exception.name code:0 userInfo:userInfo]; - } - - return res; +- (NBEValidationResult)isPossibleNumberWithReason:(NBPhoneNumber *)number + error:(NSError *__autoreleasing *)error { + NBEValidationResult res = NBEValidationResultUNKNOWN; + @try { + res = [self isPossibleNumberWithReason:number]; + } @catch (NSException *exception) { + NSDictionary *userInfo = + [NSDictionary dictionaryWithObject:exception.reason forKey:NSLocalizedDescriptionKey]; + if (error != NULL) (*error) = [NSError errorWithDomain:exception.name code:0 userInfo:userInfo]; + } + + return res; } +- (NBEValidationResult)isPossibleNumberWithReason:(NBPhoneNumber *)number { + NSString *nationalNumber = [self getNationalSignificantNumber:number]; + NSNumber *countryCode = number.countryCode; + // Note: For Russian Fed and NANPA numbers, we just use the rules from the + // default region (US or Russia) since the getRegionCodeForNumber will not + // work if the number is possible but not valid. This would need to be + // revisited if the possible number pattern ever differed between various + // regions within those plans. + if ([self hasValidCountryCallingCode:countryCode] == NO) { + return NBEValidationResultINVALID_COUNTRY_CODE; + } -- (NBEValidationResult)isPossibleNumberWithReason:(NBPhoneNumber*)number -{ - NSString *nationalNumber = [self getNationalSignificantNumber:number]; - NSNumber *countryCode = number.countryCode; - // Note: For Russian Fed and NANPA numbers, we just use the rules from the - // default region (US or Russia) since the getRegionCodeForNumber will not - // work if the number is possible but not valid. This would need to be - // revisited if the possible number pattern ever differed between various - // regions within those plans. - if ([self hasValidCountryCallingCode:countryCode] == NO) { - return NBEValidationResultINVALID_COUNTRY_CODE; - } - - NSString *regionCode = [self getRegionCodeForCountryCode:countryCode]; - // Metadata cannot be nil because the country calling code is valid. - NBPhoneMetaData *metadata = [self getMetadataForRegionOrCallingCode:countryCode regionCode:regionCode]; - return [self testNumberLength:nationalNumber desc:metadata.generalDesc]; + NSString *regionCode = [self getRegionCodeForCountryCode:countryCode]; + // Metadata cannot be nil because the country calling code is valid. + NBPhoneMetaData *metadata = + [self getMetadataForRegionOrCallingCode:countryCode regionCode:regionCode]; + return [self testNumberLength:nationalNumber desc:metadata.generalDesc]; } - /** * Check whether a phone number is a possible number given a number in the form * of a string, and the region where the number could be dialed from. It @@ -2798,12 +2856,14 @@ static NSArray *GEO_MOBILE_COUNTRIES; * (Mountain View, CA, to be more specific). * @return {boolean} NO if the number is possible. */ -- (BOOL)isPossibleNumberString:(NSString *)number regionDialingFrom:(NSString *)regionDialingFrom error:(NSError**)error -{ - number = NormalizeNonBreakingSpace(number); - - BOOL res = [self isPossibleNumber:[self parse:number defaultRegion:regionDialingFrom error:error]]; - return res; +- (BOOL)isPossibleNumberString:(NSString *)number + regionDialingFrom:(NSString *)regionDialingFrom + error:(NSError **)error { + number = NormalizeNonBreakingSpace(number); + + BOOL res = + [self isPossibleNumber:[self parse:number defaultRegion:regionDialingFrom error:error]]; + return res; } /** @@ -2816,27 +2876,26 @@ static NSArray *GEO_MOBILE_COUNTRIES; * @return {boolean} NO if a valid phone number can be successfully extracted. */ -- (BOOL)truncateTooLongNumber:(NBPhoneNumber*)number -{ - if ([self isValidNumber:number]) { - return YES; - } - - NBPhoneNumber *numberCopy = [number copy]; - NSNumber *nationalNumber = number.nationalNumber; - do { - nationalNumber = [NSNumber numberWithLongLong:(long long)floor(nationalNumber.unsignedLongLongValue / 10)]; - numberCopy.nationalNumber = [nationalNumber copy]; - if ([nationalNumber isEqualToNumber:@0] || [self isPossibleNumberWithReason:numberCopy] == NBEValidationResultTOO_SHORT) { - return NO; - } - } - while ([self isValidNumber:numberCopy] == NO); - - number.nationalNumber = nationalNumber; +- (BOOL)truncateTooLongNumber:(NBPhoneNumber *)number { + if ([self isValidNumber:number]) { return YES; -} + } + NBPhoneNumber *numberCopy = [number copy]; + NSNumber *nationalNumber = number.nationalNumber; + do { + nationalNumber = + [NSNumber numberWithLongLong:(long long)floor(nationalNumber.unsignedLongLongValue / 10)]; + numberCopy.nationalNumber = [nationalNumber copy]; + if ([nationalNumber isEqualToNumber:@0] || + [self isPossibleNumberWithReason:numberCopy] == NBEValidationResultTOO_SHORT) { + return NO; + } + } while ([self isValidNumber:numberCopy] == NO); + + number.nationalNumber = nationalNumber; + return YES; +} /** * Extracts country calling code from fullNumber, returns it and places the @@ -2848,42 +2907,41 @@ static NSArray *GEO_MOBILE_COUNTRIES; * - param {!goog.string.StringBuffer} nationalNumber * @return {number} */ -- (NSNumber *)extractCountryCode:(NSString *)fullNumber nationalNumber:(NSString **)nationalNumber -{ - fullNumber = NormalizeNonBreakingSpace(fullNumber); - - if ((fullNumber.length == 0) || ([[fullNumber substringToIndex:1] isEqualToString:@"0"])) { - // Country codes do not begin with a '0'. - return @0; - } - - NSUInteger numberLength = fullNumber.length; - NSUInteger maxCountryCode = MAX_LENGTH_COUNTRY_CODE_; - - if ([fullNumber hasPrefix:@"+"]) { - maxCountryCode = MAX_LENGTH_COUNTRY_CODE_ + 1; - } - - for (NSUInteger i = 1; i <= maxCountryCode && i <= numberLength; ++i) { - NSString *subNumber = [fullNumber substringWithRange:NSMakeRange(0, i)]; - NSNumber *potentialCountryCode = [NSNumber numberWithInteger:[subNumber integerValue]]; - - NSArray *regionCodes = [NBMetadataHelper regionCodeFromCountryCode:potentialCountryCode]; - if (regionCodes != nil && regionCodes.count > 0) { - if (nationalNumber != NULL) { - if ((*nationalNumber) == nil) { - (*nationalNumber) = [NSString stringWithFormat:@"%@", [fullNumber substringFromIndex:i]]; - } else { - (*nationalNumber) = [NSString stringWithFormat:@"%@%@", (*nationalNumber), [fullNumber substringFromIndex:i]]; - } - } - return potentialCountryCode; - } - } - - return @0; -} +- (NSNumber *)extractCountryCode:(NSString *)fullNumber nationalNumber:(NSString **)nationalNumber { + fullNumber = NormalizeNonBreakingSpace(fullNumber); + if ((fullNumber.length == 0) || ([[fullNumber substringToIndex:1] isEqualToString:@"0"])) { + // Country codes do not begin with a '0'. + return @0; + } + + NSUInteger numberLength = fullNumber.length; + NSUInteger maxCountryCode = MAX_LENGTH_COUNTRY_CODE_; + + if ([fullNumber hasPrefix:@"+"]) { + maxCountryCode = MAX_LENGTH_COUNTRY_CODE_ + 1; + } + + for (NSUInteger i = 1; i <= maxCountryCode && i <= numberLength; ++i) { + NSString *subNumber = [fullNumber substringWithRange:NSMakeRange(0, i)]; + NSNumber *potentialCountryCode = [NSNumber numberWithInteger:[subNumber integerValue]]; + + NSArray *regionCodes = [NBMetadataHelper regionCodeFromCountryCode:potentialCountryCode]; + if (regionCodes != nil && regionCodes.count > 0) { + if (nationalNumber != NULL) { + if ((*nationalNumber) == nil) { + (*nationalNumber) = [NSString stringWithFormat:@"%@", [fullNumber substringFromIndex:i]]; + } else { + (*nationalNumber) = [NSString + stringWithFormat:@"%@%@", (*nationalNumber), [fullNumber substringFromIndex:i]]; + } + } + return potentialCountryCode; + } + } + + return @0; +} /** * Convenience method to get a list of what regions the library has metadata @@ -2891,15 +2949,15 @@ static NSArray *GEO_MOBILE_COUNTRIES; * @return {!Array.} region codes supported by the library. */ -- (NSArray *)getSupportedRegions -{ - NSArray *allKeys = [[NBMetadataHelper CCode2CNMap] allKeys]; - NSPredicate *predicateIsNaN = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { +- (NSArray *)getSupportedRegions { + NSArray *allKeys = [[NBMetadataHelper CCode2CNMap] allKeys]; + NSPredicate *predicateIsNaN = + [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { return [self isNaN:evaluatedObject]; - }]; - - NSArray *supportedRegions = [allKeys filteredArrayUsingPredicate:predicateIsNaN]; - return supportedRegions; + }]; + + NSArray *supportedRegions = [allKeys filteredArrayUsingPredicate:predicateIsNaN]; + return supportedRegions; } /* @@ -2933,7 +2991,6 @@ static NSArray *GEO_MOBILE_COUNTRIES; }; */ - /** * Tries to extract a country calling code from a number. This method will * return zero if no country calling code is considered to be present. Country @@ -2974,102 +3031,114 @@ static NSArray *GEO_MOBILE_COUNTRIES; * extracted. * @throws {i18n.phonenumbers.Error} */ -- (NSNumber *)maybeExtractCountryCode:(NSString *)number metadata:(NBPhoneMetaData*)defaultRegionMetadata - nationalNumber:(NSString **)nationalNumber keepRawInput:(BOOL)keepRawInput - phoneNumber:(NBPhoneNumber**)phoneNumber error:(NSError**)error -{ - if (nationalNumber == NULL || phoneNumber == NULL || number.length <= 0) { - return @0; - } - - NSString *fullNumber = [number copy]; - // Set the default prefix to be something that will never match. - NSString *possibleCountryIddPrefix = @""; - if (defaultRegionMetadata != nil) { - possibleCountryIddPrefix = defaultRegionMetadata.internationalPrefix; - } - - if (possibleCountryIddPrefix == nil) { - possibleCountryIddPrefix = @"NonMatch"; - } - - /** @type {i18n.phonenumbers.PhoneNumber.CountryCodeSource} */ - NBECountryCodeSource countryCodeSource = [self maybeStripInternationalPrefixAndNormalize:&fullNumber - possibleIddPrefix:possibleCountryIddPrefix]; - if (keepRawInput) { - (*phoneNumber).countryCodeSource = [NSNumber numberWithInteger:countryCodeSource]; - } - - if (countryCodeSource != NBECountryCodeSourceFROM_DEFAULT_COUNTRY) { - if (fullNumber.length <= MIN_LENGTH_FOR_NSN_) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObject:[NSString stringWithFormat:@"TOO_SHORT_AFTER_IDD:%@", fullNumber] - forKey:NSLocalizedDescriptionKey]; - if (error != NULL) { - (*error) = [NSError errorWithDomain:@"TOO_SHORT_AFTER_IDD" code:0 userInfo:userInfo]; - } - return @0; - } - - NSNumber *potentialCountryCode = [self extractCountryCode:fullNumber nationalNumber:nationalNumber]; - - if (![potentialCountryCode isEqualToNumber:@0]) { - (*phoneNumber).countryCode = potentialCountryCode; - return potentialCountryCode; - } - - // If this fails, they must be using a strange country calling code that we - // don't recognize, or that doesn't exist. - NSDictionary *userInfo = [NSDictionary dictionaryWithObject:[NSString stringWithFormat:@"INVALID_COUNTRY_CODE:%@", potentialCountryCode] - forKey:NSLocalizedDescriptionKey]; - if (error != NULL) { - (*error) = [NSError errorWithDomain:@"INVALID_COUNTRY_CODE" code:0 userInfo:userInfo]; - } - - return @0; - } else if (defaultRegionMetadata != nil) { - // Check to see if the number starts with the country calling code for the - // default region. If so, we remove the country calling code, and do some - // checks on the validity of the number before and after. - NSNumber *defaultCountryCode = defaultRegionMetadata.countryCode; - NSString *defaultCountryCodeString = [NSString stringWithFormat:@"%@", defaultCountryCode]; - NSString *normalizedNumber = [fullNumber copy]; - - if ([normalizedNumber hasPrefix:defaultCountryCodeString]) { - NSString *potentialNationalNumber = [normalizedNumber substringFromIndex:defaultCountryCodeString.length]; - NBPhoneNumberDesc *generalDesc = defaultRegionMetadata.generalDesc; - - NSString *validNumberPattern = generalDesc.nationalNumberPattern; - // Passing null since we don't need the carrier code. - [self maybeStripNationalPrefixAndCarrierCode:&potentialNationalNumber metadata:defaultRegionMetadata carrierCode:nil]; - - NSString *potentialNationalNumberStr = [potentialNationalNumber copy]; - // If the number was not valid before but is valid now, or if it was too - // long before, we consider the number with the country calling code - // stripped to be a better result and keep that instead. - if ((![self matchesEntirely:validNumberPattern string:fullNumber] && - [self matchesEntirely:validNumberPattern string:potentialNationalNumberStr]) || - [self testNumberLength:fullNumber desc:generalDesc] == NBEValidationResultTOO_LONG) { - (*nationalNumber) = [(*nationalNumber) stringByAppendingString:potentialNationalNumberStr]; - if (keepRawInput) { - (*phoneNumber).countryCodeSource = [NSNumber numberWithInteger:NBECountryCodeSourceFROM_NUMBER_WITHOUT_PLUS_SIGN]; - } - (*phoneNumber).countryCode = defaultCountryCode; - return defaultCountryCode; - } - } - } - // No country calling code present. - (*phoneNumber).countryCode = @0; +- (NSNumber *)maybeExtractCountryCode:(NSString *)number + metadata:(NBPhoneMetaData *)defaultRegionMetadata + nationalNumber:(NSString **)nationalNumber + keepRawInput:(BOOL)keepRawInput + phoneNumber:(NBPhoneNumber **)phoneNumber + error:(NSError **)error { + if (nationalNumber == NULL || phoneNumber == NULL || number.length <= 0) { return @0; + } + + NSString *fullNumber = [number copy]; + // Set the default prefix to be something that will never match. + NSString *possibleCountryIddPrefix = @""; + if (defaultRegionMetadata != nil) { + possibleCountryIddPrefix = defaultRegionMetadata.internationalPrefix; + } + + if (possibleCountryIddPrefix == nil) { + possibleCountryIddPrefix = @"NonMatch"; + } + + /** @type {i18n.phonenumbers.PhoneNumber.CountryCodeSource} */ + NBECountryCodeSource countryCodeSource = + [self maybeStripInternationalPrefixAndNormalize:&fullNumber + possibleIddPrefix:possibleCountryIddPrefix]; + if (keepRawInput) { + (*phoneNumber).countryCodeSource = [NSNumber numberWithInteger:countryCodeSource]; + } + + if (countryCodeSource != NBECountryCodeSourceFROM_DEFAULT_COUNTRY) { + if (fullNumber.length <= MIN_LENGTH_FOR_NSN_) { + NSDictionary *userInfo = [NSDictionary + dictionaryWithObject:[NSString stringWithFormat:@"TOO_SHORT_AFTER_IDD:%@", fullNumber] + forKey:NSLocalizedDescriptionKey]; + if (error != NULL) { + (*error) = [NSError errorWithDomain:@"TOO_SHORT_AFTER_IDD" code:0 userInfo:userInfo]; + } + return @0; + } + + NSNumber *potentialCountryCode = + [self extractCountryCode:fullNumber nationalNumber:nationalNumber]; + + if (![potentialCountryCode isEqualToNumber:@0]) { + (*phoneNumber).countryCode = potentialCountryCode; + return potentialCountryCode; + } + + // If this fails, they must be using a strange country calling code that we + // don't recognize, or that doesn't exist. + NSDictionary *userInfo = + [NSDictionary dictionaryWithObject:[NSString stringWithFormat:@"INVALID_COUNTRY_CODE:%@", + potentialCountryCode] + forKey:NSLocalizedDescriptionKey]; + if (error != NULL) { + (*error) = [NSError errorWithDomain:@"INVALID_COUNTRY_CODE" code:0 userInfo:userInfo]; + } + + return @0; + } else if (defaultRegionMetadata != nil) { + // Check to see if the number starts with the country calling code for the + // default region. If so, we remove the country calling code, and do some + // checks on the validity of the number before and after. + NSNumber *defaultCountryCode = defaultRegionMetadata.countryCode; + NSString *defaultCountryCodeString = [NSString stringWithFormat:@"%@", defaultCountryCode]; + NSString *normalizedNumber = [fullNumber copy]; + + if ([normalizedNumber hasPrefix:defaultCountryCodeString]) { + NSString *potentialNationalNumber = + [normalizedNumber substringFromIndex:defaultCountryCodeString.length]; + NBPhoneNumberDesc *generalDesc = defaultRegionMetadata.generalDesc; + + NSString *validNumberPattern = generalDesc.nationalNumberPattern; + // Passing null since we don't need the carrier code. + [self maybeStripNationalPrefixAndCarrierCode:&potentialNationalNumber + metadata:defaultRegionMetadata + carrierCode:nil]; + + NSString *potentialNationalNumberStr = [potentialNationalNumber copy]; + // If the number was not valid before but is valid now, or if it was too + // long before, we consider the number with the country calling code + // stripped to be a better result and keep that instead. + if ((![self matchesEntirely:validNumberPattern string:fullNumber] && + [self matchesEntirely:validNumberPattern string:potentialNationalNumberStr]) || + [self testNumberLength:fullNumber desc:generalDesc] == NBEValidationResultTOO_LONG) { + (*nationalNumber) = [(*nationalNumber) stringByAppendingString:potentialNationalNumberStr]; + if (keepRawInput) { + (*phoneNumber).countryCodeSource = + [NSNumber numberWithInteger:NBECountryCodeSourceFROM_NUMBER_WITHOUT_PLUS_SIGN]; + } + (*phoneNumber).countryCode = defaultCountryCode; + return defaultCountryCode; + } + } + } + // No country calling code present. + (*phoneNumber).countryCode = @0; + return @0; } /** * Returns true if there is any possible number data set for a particular PhoneNumberDesc. */ - (BOOL)descHasPossibleNumberData:(NBPhoneNumberDesc *)desc { - // If this is empty, it means numbers of this type inherit from the "general desc" -> the value - // "-1" means that no numbers exist for this type. - return [desc.possibleLength count] != 1 || ![[desc.possibleLength firstObject] isEqualToNumber: @(-1)]; + // If this is empty, it means numbers of this type inherit from the "general desc" -> the value + // "-1" means that no numbers exist for this type. + return [desc.possibleLength count] != 1 || + ![[desc.possibleLength firstObject] isEqualToNumber:@(-1)]; } /** @@ -3083,39 +3152,42 @@ static NSArray *GEO_MOBILE_COUNTRIES; * @return {boolean} NO if an international prefix was present. * @private */ -- (BOOL)parsePrefixAsIdd:(NSString *)iddPattern sourceString:(NSString **)number -{ - if (number == NULL) { - return NO; - } - - NSString *numberStr = [(*number) copy]; - - if ([self stringPositionByRegex:numberStr regex:iddPattern] == 0) { - NSTextCheckingResult *matched = [[self matchesByRegex:numberStr regex:iddPattern] objectAtIndex:0]; - NSString *matchedString = [numberStr substringWithRange:matched.range]; - NSUInteger matchEnd = matchedString.length; - NSString *remainString = [numberStr substringFromIndex:matchEnd]; - - NSArray *matchedGroups = [_CAPTURING_DIGIT_PATTERN matchesInString:remainString options:0 range:NSMakeRange(0, remainString.length)]; - - if (matchedGroups && [matchedGroups count] > 0 && [matchedGroups objectAtIndex:0] != nil) { - NSString *digitMatched = [remainString substringWithRange:((NSTextCheckingResult*)[matchedGroups objectAtIndex:0]).range]; - if (digitMatched.length > 0) { - NSString *normalizedGroup = [self normalizeDigitsOnly:digitMatched]; - if ([normalizedGroup isEqualToString:@"0"]) { - return NO; - } - } - } - - (*number) = [remainString copy]; - return YES; - } - +- (BOOL)parsePrefixAsIdd:(NSString *)iddPattern sourceString:(NSString **)number { + if (number == NULL) { return NO; -} + } + NSString *numberStr = [(*number)copy]; + + if ([self stringPositionByRegex:numberStr regex:iddPattern] == 0) { + NSTextCheckingResult *matched = + [[self matchesByRegex:numberStr regex:iddPattern] objectAtIndex:0]; + NSString *matchedString = [numberStr substringWithRange:matched.range]; + NSUInteger matchEnd = matchedString.length; + NSString *remainString = [numberStr substringFromIndex:matchEnd]; + + NSArray *matchedGroups = + [_CAPTURING_DIGIT_PATTERN matchesInString:remainString + options:0 + range:NSMakeRange(0, remainString.length)]; + + if (matchedGroups && [matchedGroups count] > 0 && [matchedGroups objectAtIndex:0] != nil) { + NSString *digitMatched = [remainString + substringWithRange:((NSTextCheckingResult *)[matchedGroups objectAtIndex:0]).range]; + if (digitMatched.length > 0) { + NSString *normalizedGroup = [self normalizeDigitsOnly:digitMatched]; + if ([normalizedGroup isEqualToString:@"0"]) { + return NO; + } + } + } + + (*number) = [remainString copy]; + return YES; + } + + return NO; +} /** * Strips any international prefix (such as +, 00, 011) present in the number @@ -3131,28 +3203,30 @@ static NSArray *GEO_MOBILE_COUNTRIES; * from the number, otherwise CountryCodeSource.FROM_DEFAULT_COUNTRY if * the number did not seem to be in international format. */ -- (NBECountryCodeSource)maybeStripInternationalPrefixAndNormalize:(NSString **)numberStr possibleIddPrefix:(NSString *)possibleIddPrefix -{ - if (numberStr == NULL || (*numberStr).length == 0) { - return NBECountryCodeSourceFROM_DEFAULT_COUNTRY; - } - - // Check to see if the number begins with one or more plus signs. - if ([self isStartingStringByRegex:(*numberStr) regex:LEADING_PLUS_CHARS_PATTERN]) { - (*numberStr) = [self replaceStringByRegex:(*numberStr) regex:LEADING_PLUS_CHARS_PATTERN withTemplate:@""]; - // Can now normalize the rest of the number since we've consumed the '+' - // sign at the start. - (*numberStr) = [self normalize:(*numberStr)]; - return NBECountryCodeSourceFROM_NUMBER_WITH_PLUS_SIGN; - } - - // Attempt to parse the first digits as an international prefix. - NSString *iddPattern = [possibleIddPrefix copy]; - [self normalizeSB:numberStr]; - - return [self parsePrefixAsIdd:iddPattern sourceString:numberStr] ? NBECountryCodeSourceFROM_NUMBER_WITH_IDD : NBECountryCodeSourceFROM_DEFAULT_COUNTRY; -} +- (NBECountryCodeSource)maybeStripInternationalPrefixAndNormalize:(NSString **)numberStr + possibleIddPrefix:(NSString *)possibleIddPrefix { + if (numberStr == NULL || (*numberStr).length == 0) { + return NBECountryCodeSourceFROM_DEFAULT_COUNTRY; + } + // Check to see if the number begins with one or more plus signs. + if ([self isStartingStringByRegex:(*numberStr)regex:LEADING_PLUS_CHARS_PATTERN]) { + (*numberStr) = + [self replaceStringByRegex:(*numberStr)regex:LEADING_PLUS_CHARS_PATTERN withTemplate:@""]; + // Can now normalize the rest of the number since we've consumed the '+' + // sign at the start. + (*numberStr) = [self normalize:(*numberStr)]; + return NBECountryCodeSourceFROM_NUMBER_WITH_PLUS_SIGN; + } + + // Attempt to parse the first digits as an international prefix. + NSString *iddPattern = [possibleIddPrefix copy]; + [self normalizeSB:numberStr]; + + return [self parsePrefixAsIdd:iddPattern sourceString:numberStr] + ? NBECountryCodeSourceFROM_NUMBER_WITH_IDD + : NBECountryCodeSourceFROM_DEFAULT_COUNTRY; +} /** * Strips any national prefix (such as 0, 1) present in the number provided. @@ -3166,70 +3240,80 @@ static NSArray *GEO_MOBILE_COUNTRIES; * @return {boolean} NO if a national prefix or carrier code (or both) could * be extracted. */ -- (BOOL)maybeStripNationalPrefixAndCarrierCode:(NSString **)number metadata:(NBPhoneMetaData*)metadata carrierCode:(NSString **)carrierCode -{ - if (number == NULL) { - return NO; - } - - NSString *numberStr = [(*number) copy]; - NSUInteger numberLength = numberStr.length; - NSString *possibleNationalPrefix = metadata.nationalPrefixForParsing; - - if (numberLength == 0 || [NBMetadataHelper hasValue:possibleNationalPrefix] == NO) { - // Early return for numbers of zero length. - return NO; - } - - // Attempt to parse the first digits as a national prefix. - NSString *prefixPattern = [NSString stringWithFormat:@"^(?:%@)", possibleNationalPrefix]; - NSError *error = nil; - NSRegularExpression *currentPattern = [self regularExpressionWithPattern:prefixPattern options:0 error:&error]; - - NSArray *prefixMatcher = [currentPattern matchesInString:numberStr options:0 range:NSMakeRange(0, numberLength)]; - if (prefixMatcher && [prefixMatcher count] > 0) { - NSString *nationalNumberRule = metadata.generalDesc.nationalNumberPattern; - NSTextCheckingResult *firstMatch = [prefixMatcher objectAtIndex:0]; - NSString *firstMatchString = [numberStr substringWithRange:firstMatch.range]; - - // prefixMatcher[numOfGroups] == null implies nothing was captured by the - // capturing groups in possibleNationalPrefix; therefore, no transformation - // is necessary, and we just remove the national prefix. - NSUInteger numOfGroups = firstMatch.numberOfRanges - 1; - NSString *transformRule = metadata.nationalPrefixTransformRule; - NSString *transformedNumber = @""; - NSRange firstRange = [firstMatch rangeAtIndex:numOfGroups]; - NSString *firstMatchStringWithGroup = (firstRange.location != NSNotFound && firstRange.location < numberStr.length) ? [numberStr substringWithRange:firstRange] : nil; - BOOL noTransform = (transformRule == nil || transformRule.length == 0 || [NBMetadataHelper hasValue:firstMatchStringWithGroup] == NO); - - if (noTransform) { - transformedNumber = [numberStr substringFromIndex:firstMatchString.length]; - } else { - transformedNumber = [self replaceFirstStringByRegex:numberStr regex:prefixPattern withTemplate:transformRule]; - } - // If the original number was viable, and the resultant number is not, - // we return. - if ([NBMetadataHelper hasValue:nationalNumberRule ] && [self matchesEntirely:nationalNumberRule string:numberStr] && - [self matchesEntirely:nationalNumberRule string:transformedNumber] == NO) { - return NO; - } - - if ((noTransform && numOfGroups > 0 && [NBMetadataHelper hasValue:firstMatchStringWithGroup]) || (!noTransform && numOfGroups > 1)) { - if (carrierCode != NULL && (*carrierCode) != nil) { - (*carrierCode) = [(*carrierCode) stringByAppendingString:firstMatchStringWithGroup]; - } - } else if ((noTransform && numOfGroups > 0 && [NBMetadataHelper hasValue:firstMatchString]) || (!noTransform && numOfGroups > 1)) { - if (carrierCode != NULL && (*carrierCode) != nil) { - (*carrierCode) = [(*carrierCode) stringByAppendingString:firstMatchString]; - } - } - - (*number) = transformedNumber; - return YES; - } +- (BOOL)maybeStripNationalPrefixAndCarrierCode:(NSString **)number + metadata:(NBPhoneMetaData *)metadata + carrierCode:(NSString **)carrierCode { + if (number == NULL) { return NO; -} + } + NSString *numberStr = [(*number)copy]; + NSUInteger numberLength = numberStr.length; + NSString *possibleNationalPrefix = metadata.nationalPrefixForParsing; + + if (numberLength == 0 || [NBMetadataHelper hasValue:possibleNationalPrefix] == NO) { + // Early return for numbers of zero length. + return NO; + } + + // Attempt to parse the first digits as a national prefix. + NSString *prefixPattern = [NSString stringWithFormat:@"^(?:%@)", possibleNationalPrefix]; + NSError *error = nil; + NSRegularExpression *currentPattern = + [self regularExpressionWithPattern:prefixPattern options:0 error:&error]; + + NSArray *prefixMatcher = + [currentPattern matchesInString:numberStr options:0 range:NSMakeRange(0, numberLength)]; + if (prefixMatcher && [prefixMatcher count] > 0) { + NSString *nationalNumberRule = metadata.generalDesc.nationalNumberPattern; + NSTextCheckingResult *firstMatch = [prefixMatcher objectAtIndex:0]; + NSString *firstMatchString = [numberStr substringWithRange:firstMatch.range]; + + // prefixMatcher[numOfGroups] == null implies nothing was captured by the + // capturing groups in possibleNationalPrefix; therefore, no transformation + // is necessary, and we just remove the national prefix. + NSUInteger numOfGroups = firstMatch.numberOfRanges - 1; + NSString *transformRule = metadata.nationalPrefixTransformRule; + NSString *transformedNumber = @""; + NSRange firstRange = [firstMatch rangeAtIndex:numOfGroups]; + NSString *firstMatchStringWithGroup = + (firstRange.location != NSNotFound && firstRange.location < numberStr.length) + ? [numberStr substringWithRange:firstRange] + : nil; + BOOL noTransform = (transformRule == nil || transformRule.length == 0 || + [NBMetadataHelper hasValue:firstMatchStringWithGroup] == NO); + + if (noTransform) { + transformedNumber = [numberStr substringFromIndex:firstMatchString.length]; + } else { + transformedNumber = + [self replaceFirstStringByRegex:numberStr regex:prefixPattern withTemplate:transformRule]; + } + // If the original number was viable, and the resultant number is not, + // we return. + if ([NBMetadataHelper hasValue:nationalNumberRule] && + [self matchesEntirely:nationalNumberRule string:numberStr] && + [self matchesEntirely:nationalNumberRule string:transformedNumber] == NO) { + return NO; + } + + if ((noTransform && numOfGroups > 0 && [NBMetadataHelper hasValue:firstMatchStringWithGroup]) || + (!noTransform && numOfGroups > 1)) { + if (carrierCode != NULL && (*carrierCode) != nil) { + (*carrierCode) = [(*carrierCode) stringByAppendingString:firstMatchStringWithGroup]; + } + } else if ((noTransform && numOfGroups > 0 && [NBMetadataHelper hasValue:firstMatchString]) || + (!noTransform && numOfGroups > 1)) { + if (carrierCode != NULL && (*carrierCode) != nil) { + (*carrierCode) = [(*carrierCode) stringByAppendingString:firstMatchString]; + } + } + + (*number) = transformedNumber; + return YES; + } + return NO; +} /** * Strips any extension (as in, the part of the number dialled after the call is @@ -3240,41 +3324,40 @@ static NSArray *GEO_MOBILE_COUNTRIES; * that we wish to strip the extension from. * @return {string} the phone extension. */ -- (NSString *)maybeStripExtension:(NSString **)number -{ - if (number == NULL) { - return @""; - } - - NSString *numberStr = [(*number) copy]; - int mStart = [self stringPositionByRegex:numberStr regex:EXTN_PATTERN]; - - // If we find a potential extension, and the number preceding this is a viable - // number, we assume it is an extension. - if (mStart >= 0 && [self isViablePhoneNumber:[numberStr substringWithRange:NSMakeRange(0, mStart)]]) { - // The numbers are captured into groups in the regular expression. - NSTextCheckingResult *firstMatch = [self matchFirstByRegex:numberStr regex:EXTN_PATTERN]; - NSUInteger matchedGroupsLength = [firstMatch numberOfRanges]; - - for (NSUInteger i = 1; i < matchedGroupsLength; i++) { - NSRange curRange = [firstMatch rangeAtIndex:i]; - - if (curRange.location != NSNotFound && curRange.location < numberStr.length) { - NSString *matchString = [(*number) substringWithRange:curRange]; - // We go through the capturing groups until we find one that captured - // some digits. If none did, then we will return the empty string. - NSString *tokenedString = [numberStr substringWithRange:NSMakeRange(0, mStart)]; - (*number) = @""; - (*number) = [(*number) stringByAppendingString:tokenedString]; - - return matchString; - } - } - } - +- (NSString *)maybeStripExtension:(NSString **)number { + if (number == NULL) { return @""; -} + } + NSString *numberStr = [(*number)copy]; + int mStart = [self stringPositionByRegex:numberStr regex:EXTN_PATTERN]; + + // If we find a potential extension, and the number preceding this is a viable + // number, we assume it is an extension. + if (mStart >= 0 && + [self isViablePhoneNumber:[numberStr substringWithRange:NSMakeRange(0, mStart)]]) { + // The numbers are captured into groups in the regular expression. + NSTextCheckingResult *firstMatch = [self matchFirstByRegex:numberStr regex:EXTN_PATTERN]; + NSUInteger matchedGroupsLength = [firstMatch numberOfRanges]; + + for (NSUInteger i = 1; i < matchedGroupsLength; i++) { + NSRange curRange = [firstMatch rangeAtIndex:i]; + + if (curRange.location != NSNotFound && curRange.location < numberStr.length) { + NSString *matchString = [(*number) substringWithRange:curRange]; + // We go through the capturing groups until we find one that captured + // some digits. If none did, then we will return the empty string. + NSString *tokenedString = [numberStr substringWithRange:NSMakeRange(0, mStart)]; + (*number) = @""; + (*number) = [(*number) stringByAppendingString:tokenedString]; + + return matchString; + } + } + } + + return @""; +} /** * Checks to see that the region code used is valid, or if it is not valid, that @@ -3287,14 +3370,13 @@ static NSArray *GEO_MOBILE_COUNTRIES; * cannot be inferred. * @private */ -- (BOOL)checkRegionForParsing:(NSString *)numberToParse defaultRegion:(NSString *)defaultRegion -{ - // If the number is nil or empty, we can't infer the region. - return [self isValidRegionCode:defaultRegion] || - (numberToParse != nil && numberToParse.length > 0 && [self isStartingStringByRegex:numberToParse regex:LEADING_PLUS_CHARS_PATTERN]); +- (BOOL)checkRegionForParsing:(NSString *)numberToParse defaultRegion:(NSString *)defaultRegion { + // If the number is nil or empty, we can't infer the region. + return [self isValidRegionCode:defaultRegion] || + (numberToParse != nil && numberToParse.length > 0 && + [self isStartingStringByRegex:numberToParse regex:LEADING_PLUS_CHARS_PATTERN]); } - /** * Parses a string and returns it in proto buffer format. This method will throw * a {@link i18n.phonenumbers.Error} if the number is not considered to be a @@ -3317,17 +3399,22 @@ static NSArray *GEO_MOBILE_COUNTRIES; * viable phone number or if no default region was supplied and the number * is not in international format (does not start with +). */ -- (NBPhoneNumber*)parse:(NSString *)numberToParse defaultRegion:(NSString *)defaultRegion error:(NSError**)error -{ - NSError *anError = nil; - NBPhoneNumber *phoneNumber = [self parseHelper:numberToParse defaultRegion:defaultRegion keepRawInput:NO checkRegion:YES error:&anError]; - - if (anError != nil) { - if (error != NULL) { - (*error) = [self errorWithObject:anError.description withDomain:anError.domain]; - } +- (NBPhoneNumber *)parse:(NSString *)numberToParse + defaultRegion:(NSString *)defaultRegion + error:(NSError **)error { + NSError *anError = nil; + NBPhoneNumber *phoneNumber = [self parseHelper:numberToParse + defaultRegion:defaultRegion + keepRawInput:NO + checkRegion:YES + error:&anError]; + + if (anError != nil) { + if (error != NULL) { + (*error) = [self errorWithObject:anError.description withDomain:anError.domain]; } - return phoneNumber; + } + return phoneNumber; } /** @@ -3337,65 +3424,57 @@ static NSArray *GEO_MOBILE_COUNTRIES; * number using +1 (AT&T is a US Carrier) as the default country code. * This also works for CDMA phones which don't have a sim card. */ -- (NBPhoneNumber*)parseWithPhoneCarrierRegion:(NSString *)numberToParse error:(NSError**)error -{ - numberToParse = NormalizeNonBreakingSpace(numberToParse); - - NSString *defaultRegion = nil; +- (NBPhoneNumber *)parseWithPhoneCarrierRegion:(NSString *)numberToParse error:(NSError **)error { + numberToParse = NormalizeNonBreakingSpace(numberToParse); + + NSString *defaultRegion = nil; #if TARGET_OS_IOS - defaultRegion = [self countryCodeByCarrier]; + defaultRegion = [self countryCodeByCarrier]; #else - defaultRegion = [[NSLocale currentLocale] objectForKey: NSLocaleCountryCode]; + defaultRegion = [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode]; #endif - if ([NB_UNKNOWN_REGION isEqualToString:defaultRegion]) { - // get region from device as a failover (e.g. iPad) - NSLocale *currentLocale = [NSLocale currentLocale]; - defaultRegion = [currentLocale objectForKey:NSLocaleCountryCode]; - } - - return [self parse:numberToParse defaultRegion:defaultRegion error:error]; + if ([NB_UNKNOWN_REGION isEqualToString:defaultRegion]) { + // get region from device as a failover (e.g. iPad) + NSLocale *currentLocale = [NSLocale currentLocale]; + defaultRegion = [currentLocale objectForKey:NSLocaleCountryCode]; + } + + return [self parse:numberToParse defaultRegion:defaultRegion error:error]; } #if TARGET_OS_IOS -static CTTelephonyNetworkInfo* _telephonyNetworkInfo; +static CTTelephonyNetworkInfo *_telephonyNetworkInfo; -- (CTTelephonyNetworkInfo*)telephonyNetworkInfo { - - // cache telephony network info; - // CTTelephonyNetworkInfo objects are unnecessarily created for every call to parseWithPhoneCarrierRegion:error: - // when in reality this information not change while an app lives in memory - // real-world performance test while parsing 93 phone numbers: - // before change: 126ms - // after change: 32ms - // using static instance prevents deallocation crashes due to ios bug - - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - _telephonyNetworkInfo = [[CTTelephonyNetworkInfo alloc] init]; - }); - - return _telephonyNetworkInfo; - +- (CTTelephonyNetworkInfo *)telephonyNetworkInfo { + // cache telephony network info; + // CTTelephonyNetworkInfo objects are unnecessarily created for every call to + // parseWithPhoneCarrierRegion:error: when in reality this information not change while an app + // lives in memory real-world performance test while parsing 93 phone numbers: before change: + // 126ms after change: 32ms using static instance prevents deallocation crashes due to ios bug + + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _telephonyNetworkInfo = [[CTTelephonyNetworkInfo alloc] init]; + }); + + return _telephonyNetworkInfo; } -- (NSString *)countryCodeByCarrier -{ - - NSString *isoCode = [[self.telephonyNetworkInfo subscriberCellularProvider] isoCountryCode]; - - // The 2nd part of the if is working around an iOS 7 bug - // If the SIM card is missing, iOS 7 returns an empty string instead of nil - if (isoCode.length == 0) { - isoCode = NB_UNKNOWN_REGION; - } - - return isoCode; +- (NSString *)countryCodeByCarrier { + NSString *isoCode = [[self.telephonyNetworkInfo subscriberCellularProvider] isoCountryCode]; + + // The 2nd part of the if is working around an iOS 7 bug + // If the SIM card is missing, iOS 7 returns an empty string instead of nil + if (isoCode.length == 0) { + isoCode = NB_UNKNOWN_REGION; + } + + return isoCode; } #endif - /** * Parses a string and returns it in proto buffer format. This method differs * from {@link #parse} in that it always populates the raw_input field of the @@ -3413,21 +3492,26 @@ static CTTelephonyNetworkInfo* _telephonyNetworkInfo; * @throws {i18n.phonenumbers.Error} if the string is not considered to be a * viable phone number or if no default region was supplied. */ -- (NBPhoneNumber*)parseAndKeepRawInput:(NSString *)numberToParse defaultRegion:(NSString *)defaultRegion error:(NSError**)error -{ - if ([self isValidRegionCode:defaultRegion] == NO) { - if (numberToParse.length > 0 && [numberToParse hasPrefix:@"+"] == NO) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObject:[NSString stringWithFormat:@"Invalid country code:%@", numberToParse] - forKey:NSLocalizedDescriptionKey]; - if (error != NULL) { - (*error) = [NSError errorWithDomain:@"INVALID_COUNTRY_CODE" code:0 userInfo:userInfo]; - } - } +- (NBPhoneNumber *)parseAndKeepRawInput:(NSString *)numberToParse + defaultRegion:(NSString *)defaultRegion + error:(NSError **)error { + if ([self isValidRegionCode:defaultRegion] == NO) { + if (numberToParse.length > 0 && [numberToParse hasPrefix:@"+"] == NO) { + NSDictionary *userInfo = [NSDictionary + dictionaryWithObject:[NSString stringWithFormat:@"Invalid country code:%@", numberToParse] + forKey:NSLocalizedDescriptionKey]; + if (error != NULL) { + (*error) = [NSError errorWithDomain:@"INVALID_COUNTRY_CODE" code:0 userInfo:userInfo]; + } } - return [self parseHelper:numberToParse defaultRegion:defaultRegion keepRawInput:YES checkRegion:YES error:error]; + } + return [self parseHelper:numberToParse + defaultRegion:defaultRegion + keepRawInput:YES + checkRegion:YES + error:error]; } - /** * A helper function to set the values related to leading zeros in a * PhoneNumber. @@ -3437,24 +3521,24 @@ static CTTelephonyNetworkInfo* _telephonyNetworkInfo; * buffer to fill in. * @private */ -- (void)setItalianLeadingZerosForPhoneNumber:(NSString *)nationalNumber phoneNumber:(NBPhoneNumber *)phoneNumber -{ - if (nationalNumber.length > 1 && [nationalNumber hasPrefix:@"0"]) { - phoneNumber.italianLeadingZero = YES; - NSInteger numberOfLeadingZeros = 1; - // Note that if the national number is all "0"s, the last "0" is not counted - // as a leading zero. - while (numberOfLeadingZeros < nationalNumber.length - 1 && - [[nationalNumber substringWithRange:NSMakeRange(numberOfLeadingZeros, 1)] isEqualToString:@"0"]) { - numberOfLeadingZeros++; - } - if (numberOfLeadingZeros != 1) { - phoneNumber.numberOfLeadingZeros = @(numberOfLeadingZeros); - } +- (void)setItalianLeadingZerosForPhoneNumber:(NSString *)nationalNumber + phoneNumber:(NBPhoneNumber *)phoneNumber { + if (nationalNumber.length > 1 && [nationalNumber hasPrefix:@"0"]) { + phoneNumber.italianLeadingZero = YES; + NSInteger numberOfLeadingZeros = 1; + // Note that if the national number is all "0"s, the last "0" is not counted + // as a leading zero. + while (numberOfLeadingZeros < nationalNumber.length - 1 && + [[nationalNumber substringWithRange:NSMakeRange(numberOfLeadingZeros, 1)] + isEqualToString:@"0"]) { + numberOfLeadingZeros++; } + if (numberOfLeadingZeros != 1) { + phoneNumber.numberOfLeadingZeros = @(numberOfLeadingZeros); + } + } } - /** * Parses a string and returns it in proto buffer format. This method is the * same as the public {@link #parse} method, with the exception that it allows @@ -3476,168 +3560,191 @@ static CTTelephonyNetworkInfo* _telephonyNetworkInfo; * @throws {i18n.phonenumbers.Error} * @private */ -- (NBPhoneNumber*)parseHelper:(NSString *)numberToParse defaultRegion:(NSString *)defaultRegion - keepRawInput:(BOOL)keepRawInput checkRegion:(BOOL)checkRegion error:(NSError**)error -{ - numberToParse = NormalizeNonBreakingSpace(numberToParse); - - if (numberToParse == nil) { - if (error != NULL) { - (*error) = [self errorWithObject:[NSString stringWithFormat:@"NOT_A_NUMBER:%@", numberToParse] withDomain:@"NOT_A_NUMBER"]; - } - - return nil; - } else if (numberToParse.length > MAX_INPUT_STRING_LENGTH_) { - if (error != NULL) { - (*error) = [self errorWithObject:[NSString stringWithFormat:@"TOO_LONG:%@", numberToParse] withDomain:@"TOO_LONG"]; - } - - return nil; +- (NBPhoneNumber *)parseHelper:(NSString *)numberToParse + defaultRegion:(NSString *)defaultRegion + keepRawInput:(BOOL)keepRawInput + checkRegion:(BOOL)checkRegion + error:(NSError **)error { + numberToParse = NormalizeNonBreakingSpace(numberToParse); + + if (numberToParse == nil) { + if (error != NULL) { + (*error) = [self errorWithObject:[NSString stringWithFormat:@"NOT_A_NUMBER:%@", numberToParse] + withDomain:@"NOT_A_NUMBER"]; } - - NSString *nationalNumber = @""; - [self buildNationalNumberForParsing:numberToParse nationalNumber:&nationalNumber]; - - if ([self isViablePhoneNumber:nationalNumber] == NO) { - if (error != NULL) { - (*error) = [self errorWithObject:[NSString stringWithFormat:@"NOT_A_NUMBER:%@", nationalNumber] withDomain:@"NOT_A_NUMBER"]; - } - - return nil; + + return nil; + } else if (numberToParse.length > MAX_INPUT_STRING_LENGTH_) { + if (error != NULL) { + (*error) = [self errorWithObject:[NSString stringWithFormat:@"TOO_LONG:%@", numberToParse] + withDomain:@"TOO_LONG"]; } - - // Check the region supplied is valid, or that the extracted number starts - // with some sort of + sign so the number's region can be determined. - if (checkRegion && [self checkRegionForParsing:nationalNumber defaultRegion:defaultRegion] == NO) { - if (error != NULL) { - (*error) = [self errorWithObject:[NSString stringWithFormat:@"INVALID_COUNTRY_CODE:%@", defaultRegion] - withDomain:@"INVALID_COUNTRY_CODE"]; - } - - return nil; + + return nil; + } + + NSString *nationalNumber = @""; + [self buildNationalNumberForParsing:numberToParse nationalNumber:&nationalNumber]; + + if ([self isViablePhoneNumber:nationalNumber] == NO) { + if (error != NULL) { + (*error) = + [self errorWithObject:[NSString stringWithFormat:@"NOT_A_NUMBER:%@", nationalNumber] + withDomain:@"NOT_A_NUMBER"]; } - - NBPhoneNumber *phoneNumber = [[NBPhoneNumber alloc] init]; - if (keepRawInput) { - phoneNumber.rawInput = [numberToParse copy]; + + return nil; + } + + // Check the region supplied is valid, or that the extracted number starts + // with some sort of + sign so the number's region can be determined. + if (checkRegion && + [self checkRegionForParsing:nationalNumber defaultRegion:defaultRegion] == NO) { + if (error != NULL) { + (*error) = [self + errorWithObject:[NSString stringWithFormat:@"INVALID_COUNTRY_CODE:%@", defaultRegion] + withDomain:@"INVALID_COUNTRY_CODE"]; } - - // Attempt to parse extension first, since it doesn't require region-specific - // data and we want to have the non-normalised number here. - NSString *extension = [self maybeStripExtension:&nationalNumber]; - if (extension.length > 0) { - phoneNumber.extension = [extension copy]; - } - NBPhoneMetaData *regionMetadata = [self.helper getMetadataForRegion:defaultRegion]; - // Check to see if the number is given in international format so we know - // whether this number is from the default region or not. - NSString *normalizedNationalNumber = @""; - NSNumber *countryCode = nil; - NSString *nationalNumberStr = [nationalNumber copy]; - - { - NSError *anError = nil; + + return nil; + } + + NBPhoneNumber *phoneNumber = [[NBPhoneNumber alloc] init]; + if (keepRawInput) { + phoneNumber.rawInput = [numberToParse copy]; + } + + // Attempt to parse extension first, since it doesn't require region-specific + // data and we want to have the non-normalised number here. + NSString *extension = [self maybeStripExtension:&nationalNumber]; + if (extension.length > 0) { + phoneNumber.extension = [extension copy]; + } + NBPhoneMetaData *regionMetadata = [self.helper getMetadataForRegion:defaultRegion]; + // Check to see if the number is given in international format so we know + // whether this number is from the default region or not. + NSString *normalizedNationalNumber = @""; + NSNumber *countryCode = nil; + NSString *nationalNumberStr = [nationalNumber copy]; + + { + NSError *anError = nil; + countryCode = [self maybeExtractCountryCode:nationalNumberStr + metadata:regionMetadata + nationalNumber:&normalizedNationalNumber + keepRawInput:keepRawInput + phoneNumber:&phoneNumber + error:&anError]; + + if (anError != nil) { + if ([anError.domain isEqualToString:@"INVALID_COUNTRY_CODE"] && + [self stringPositionByRegex:nationalNumberStr regex:LEADING_PLUS_CHARS_PATTERN] >= 0) { + // Strip the plus-char, and try again. + NSError *aNestedError = nil; + nationalNumberStr = [self replaceStringByRegex:nationalNumberStr + regex:LEADING_PLUS_CHARS_PATTERN + withTemplate:@""]; countryCode = [self maybeExtractCountryCode:nationalNumberStr metadata:regionMetadata nationalNumber:&normalizedNationalNumber keepRawInput:keepRawInput - phoneNumber:&phoneNumber error:&anError]; - - if (anError != nil) { - if ([anError.domain isEqualToString:@"INVALID_COUNTRY_CODE"] && [self stringPositionByRegex:nationalNumberStr - regex:LEADING_PLUS_CHARS_PATTERN] >= 0) - { - // Strip the plus-char, and try again. - NSError *aNestedError = nil; - nationalNumberStr = [self replaceStringByRegex:nationalNumberStr regex:LEADING_PLUS_CHARS_PATTERN withTemplate:@""]; - countryCode = [self maybeExtractCountryCode:nationalNumberStr - metadata:regionMetadata - nationalNumber:&normalizedNationalNumber - keepRawInput:keepRawInput - phoneNumber:&phoneNumber error:&aNestedError]; - if ([countryCode isEqualToNumber:@0]) { - if (error != NULL) - (*error) = [self errorWithObject:anError.description withDomain:anError.domain]; - - return nil; - } - } else { - if (error != NULL) - (*error) = [self errorWithObject:anError.description withDomain:anError.domain]; - - return nil; - } + phoneNumber:&phoneNumber + error:&aNestedError]; + if ([countryCode isEqualToNumber:@0]) { + if (error != NULL) + (*error) = [self errorWithObject:anError.description withDomain:anError.domain]; + + return nil; } - } - - if (![countryCode isEqualToNumber:@0]) { - NSString *phoneNumberRegion = [self getRegionCodeForCountryCode:countryCode]; - if (phoneNumberRegion != defaultRegion) { - // Metadata cannot be nil because the country calling code is valid. - regionMetadata = [self getMetadataForRegionOrCallingCode:countryCode regionCode:phoneNumberRegion]; - } - } else { - // If no extracted country calling code, use the region supplied instead. - // The national number is just the normalized version of the number we were - // given to parse. - [self normalizeSB:&nationalNumber]; - normalizedNationalNumber = [normalizedNationalNumber stringByAppendingString:nationalNumber]; - - if (defaultRegion != nil) { - countryCode = regionMetadata.countryCode; - phoneNumber.countryCode = countryCode; - } else if (keepRawInput) { - [phoneNumber clearCountryCodeSource]; - } - } - - if (normalizedNationalNumber.length < MIN_LENGTH_FOR_NSN_){ - if (error != NULL) { - (*error) = [self errorWithObject:[NSString stringWithFormat:@"TOO_SHORT_NSN:%@", normalizedNationalNumber] withDomain:@"TOO_SHORT_NSN"]; - } - + } else { + if (error != NULL) + (*error) = [self errorWithObject:anError.description withDomain:anError.domain]; + return nil; + } } - - if (regionMetadata != nil) { - NSString *carrierCode = @""; - NSString *potentialNationalNumber = [normalizedNationalNumber copy]; - [self maybeStripNationalPrefixAndCarrierCode:&potentialNationalNumber metadata:regionMetadata carrierCode:&carrierCode]; - NBEValidationResult validationResult = [self validateNumberLength:potentialNationalNumber metadata:regionMetadata]; - if (validationResult != NBEValidationResultTOO_SHORT && validationResult != NBEValidationResultIS_POSSIBLE_LOCAL_ONLY && validationResult != NBEValidationResultINVALID_LENGTH) { - normalizedNationalNumber = potentialNationalNumber; - if (keepRawInput) { - phoneNumber.preferredDomesticCarrierCode = [carrierCode copy]; - } - } + } + + if (![countryCode isEqualToNumber:@0]) { + NSString *phoneNumberRegion = [self getRegionCodeForCountryCode:countryCode]; + if (phoneNumberRegion != defaultRegion) { + // Metadata cannot be nil because the country calling code is valid. + regionMetadata = + [self getMetadataForRegionOrCallingCode:countryCode regionCode:phoneNumberRegion]; } - - NSString *normalizedNationalNumberStr = [normalizedNationalNumber copy]; - - NSUInteger lengthOfNationalNumber = normalizedNationalNumberStr.length; - if (lengthOfNationalNumber < MIN_LENGTH_FOR_NSN_) { - if (error != NULL) { - (*error) = [self errorWithObject:[NSString stringWithFormat:@"TOO_SHORT_NSN:%@", normalizedNationalNumber] withDomain:@"TOO_SHORT_NSN"]; - } - - return nil; + } else { + // If no extracted country calling code, use the region supplied instead. + // The national number is just the normalized version of the number we were + // given to parse. + [self normalizeSB:&nationalNumber]; + normalizedNationalNumber = [normalizedNationalNumber stringByAppendingString:nationalNumber]; + + if (defaultRegion != nil) { + countryCode = regionMetadata.countryCode; + phoneNumber.countryCode = countryCode; + } else if (keepRawInput) { + [phoneNumber clearCountryCodeSource]; } - - if (lengthOfNationalNumber > MAX_LENGTH_FOR_NSN_) { - if (error != NULL) { - (*error) = [self errorWithObject:[NSString stringWithFormat:@"TOO_LONG:%@", normalizedNationalNumber] withDomain:@"TOO_LONG"]; - } - - return nil; + } + + if (normalizedNationalNumber.length < MIN_LENGTH_FOR_NSN_) { + if (error != NULL) { + (*error) = [self + errorWithObject:[NSString stringWithFormat:@"TOO_SHORT_NSN:%@", normalizedNationalNumber] + withDomain:@"TOO_SHORT_NSN"]; } - [self setItalianLeadingZerosForPhoneNumber:normalizedNationalNumberStr phoneNumber:phoneNumber]; + return nil; + } - phoneNumber.nationalNumber = [NSNumber numberWithLongLong:[normalizedNationalNumberStr longLongValue]]; - return phoneNumber; + if (regionMetadata != nil) { + NSString *carrierCode = @""; + NSString *potentialNationalNumber = [normalizedNationalNumber copy]; + [self maybeStripNationalPrefixAndCarrierCode:&potentialNationalNumber + metadata:regionMetadata + carrierCode:&carrierCode]; + NBEValidationResult validationResult = + [self validateNumberLength:potentialNationalNumber metadata:regionMetadata]; + if (validationResult != NBEValidationResultTOO_SHORT && + validationResult != NBEValidationResultIS_POSSIBLE_LOCAL_ONLY && + validationResult != NBEValidationResultINVALID_LENGTH) { + normalizedNationalNumber = potentialNationalNumber; + if (keepRawInput) { + phoneNumber.preferredDomesticCarrierCode = [carrierCode copy]; + } + } + } + + NSString *normalizedNationalNumberStr = [normalizedNationalNumber copy]; + + NSUInteger lengthOfNationalNumber = normalizedNationalNumberStr.length; + if (lengthOfNationalNumber < MIN_LENGTH_FOR_NSN_) { + if (error != NULL) { + (*error) = [self + errorWithObject:[NSString stringWithFormat:@"TOO_SHORT_NSN:%@", normalizedNationalNumber] + withDomain:@"TOO_SHORT_NSN"]; + } + + return nil; + } + + if (lengthOfNationalNumber > MAX_LENGTH_FOR_NSN_) { + if (error != NULL) { + (*error) = + [self errorWithObject:[NSString stringWithFormat:@"TOO_LONG:%@", normalizedNationalNumber] + withDomain:@"TOO_LONG"]; + } + + return nil; + } + + [self setItalianLeadingZerosForPhoneNumber:normalizedNationalNumberStr phoneNumber:phoneNumber]; + + phoneNumber.nationalNumber = + [NSNumber numberWithLongLong:[normalizedNationalNumberStr longLongValue]]; + return phoneNumber; } - /** * Converts numberToParse to a form that we can parse and write it to * nationalNumber if it is written in RFC3966; otherwise extract a possible @@ -3650,65 +3757,65 @@ static CTTelephonyNetworkInfo* _telephonyNetworkInfo; * the national significant number. * @private */ -- (void)buildNationalNumberForParsing:(NSString *)numberToParse nationalNumber:(NSString **)nationalNumber -{ - if (nationalNumber == NULL) - return; - - int indexOfPhoneContext = [self indexOfStringByString:numberToParse target:RFC3966_PHONE_CONTEXT]; - if (indexOfPhoneContext > 0) - { - NSUInteger phoneContextStart = indexOfPhoneContext + RFC3966_PHONE_CONTEXT.length; - // If the phone context contains a phone number prefix, we need to capture - // it, whereas domains will be ignored. - if ([numberToParse characterAtIndex:phoneContextStart] == '+') - { - // Additional parameters might follow the phone context. If so, we will - // remove them here because the parameters after phone context are not - // important for parsing the phone number. - NSRange foundRange = [numberToParse rangeOfString:@";" options:NSLiteralSearch range:NSMakeRange(phoneContextStart, numberToParse.length - phoneContextStart)]; - if (foundRange.location != NSNotFound) - { - NSRange subRange = NSMakeRange(phoneContextStart, foundRange.location - phoneContextStart); - (*nationalNumber) = [(*nationalNumber) stringByAppendingString:[numberToParse substringWithRange:subRange]]; - } - else - { - (*nationalNumber) = [(*nationalNumber) stringByAppendingString:[numberToParse substringFromIndex:phoneContextStart]]; - } - } - - // Now append everything between the "tel:" prefix and the phone-context. - // This should include the national number, an optional extension or - // isdn-subaddress component. - NSUInteger rfc3966Start = [self indexOfStringByString:numberToParse target:RFC3966_PREFIX] + RFC3966_PREFIX.length; - NSString *subString = [numberToParse substringWithRange:NSMakeRange(rfc3966Start, indexOfPhoneContext - rfc3966Start)]; - (*nationalNumber) = [(*nationalNumber) stringByAppendingString:subString]; - } - else - { - // Extract a possible number from the string passed in (this strips leading - // characters that could not be the start of a phone number.) - (*nationalNumber) = [(*nationalNumber) stringByAppendingString:[self extractPossibleNumber:numberToParse]]; - } - - // Delete the isdn-subaddress and everything after it if it is present. - // Note extension won't appear at the same time with isdn-subaddress - // according to paragraph 5.3 of the RFC3966 spec, - NSString *nationalNumberStr = [(*nationalNumber) copy]; - int indexOfIsdn = [self indexOfStringByString:nationalNumberStr target:RFC3966_ISDN_SUBADDRESS]; - if (indexOfIsdn > 0) - { - (*nationalNumber) = @""; - (*nationalNumber) = [(*nationalNumber) stringByAppendingString:[nationalNumberStr substringWithRange:NSMakeRange(0, indexOfIsdn)]]; - } - // If both phone context and isdn-subaddress are absent but other - // parameters are present, the parameters are left in nationalNumber. This - // is because we are concerned about deleting content from a potential - // number string when there is no strong evidence that the number is - // actually written in RFC3966. -} +- (void)buildNationalNumberForParsing:(NSString *)numberToParse + nationalNumber:(NSString **)nationalNumber { + if (nationalNumber == NULL) return; + int indexOfPhoneContext = [self indexOfStringByString:numberToParse target:RFC3966_PHONE_CONTEXT]; + if (indexOfPhoneContext > 0) { + NSUInteger phoneContextStart = indexOfPhoneContext + RFC3966_PHONE_CONTEXT.length; + // If the phone context contains a phone number prefix, we need to capture + // it, whereas domains will be ignored. + if ([numberToParse characterAtIndex:phoneContextStart] == '+') { + // Additional parameters might follow the phone context. If so, we will + // remove them here because the parameters after phone context are not + // important for parsing the phone number. + NSRange foundRange = [numberToParse + rangeOfString:@";" + options:NSLiteralSearch + range:NSMakeRange(phoneContextStart, numberToParse.length - phoneContextStart)]; + if (foundRange.location != NSNotFound) { + NSRange subRange = NSMakeRange(phoneContextStart, foundRange.location - phoneContextStart); + (*nationalNumber) = + [(*nationalNumber) stringByAppendingString:[numberToParse substringWithRange:subRange]]; + } else { + (*nationalNumber) = + [(*nationalNumber) stringByAppendingString:[numberToParse + substringFromIndex:phoneContextStart]]; + } + } + + // Now append everything between the "tel:" prefix and the phone-context. + // This should include the national number, an optional extension or + // isdn-subaddress component. + NSUInteger rfc3966Start = + [self indexOfStringByString:numberToParse target:RFC3966_PREFIX] + RFC3966_PREFIX.length; + NSString *subString = [numberToParse + substringWithRange:NSMakeRange(rfc3966Start, indexOfPhoneContext - rfc3966Start)]; + (*nationalNumber) = [(*nationalNumber) stringByAppendingString:subString]; + } else { + // Extract a possible number from the string passed in (this strips leading + // characters that could not be the start of a phone number.) + (*nationalNumber) = + [(*nationalNumber) stringByAppendingString:[self extractPossibleNumber:numberToParse]]; + } + + // Delete the isdn-subaddress and everything after it if it is present. + // Note extension won't appear at the same time with isdn-subaddress + // according to paragraph 5.3 of the RFC3966 spec, + NSString *nationalNumberStr = [(*nationalNumber)copy]; + int indexOfIsdn = [self indexOfStringByString:nationalNumberStr target:RFC3966_ISDN_SUBADDRESS]; + if (indexOfIsdn > 0) { + (*nationalNumber) = @""; + (*nationalNumber) = [(*nationalNumber) + stringByAppendingString:[nationalNumberStr substringWithRange:NSMakeRange(0, indexOfIsdn)]]; + } + // If both phone context and isdn-subaddress are absent but other + // parameters are present, the parameters are left in nationalNumber. This + // is because we are concerned about deleting content from a potential + // number string when there is no strong evidence that the number is + // actually written in RFC3966. +} /** * Takes two phone numbers and compares them for equality. @@ -3733,146 +3840,149 @@ static CTTelephonyNetworkInfo* _telephonyNetworkInfo; * SHORT_NSN_MATCH, NSN_MATCH or EXACT_MATCH depending on the level of * equality of the two numbers, described in the method definition. */ -- (NBEMatchType)isNumberMatch:(id)firstNumberIn second:(id)secondNumberIn error:(NSError**)error -{ - NBEMatchType res = 0; - @try { - res = [self isNumberMatch:firstNumberIn second:secondNumberIn]; - } - @catch (NSException *exception) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObject:exception.reason - forKey:NSLocalizedDescriptionKey]; - if (error != NULL) - (*error) = [NSError errorWithDomain:exception.name code:0 userInfo:userInfo]; - } - return res; +- (NBEMatchType)isNumberMatch:(id)firstNumberIn second:(id)secondNumberIn error:(NSError **)error { + NBEMatchType res = 0; + @try { + res = [self isNumberMatch:firstNumberIn second:secondNumberIn]; + } @catch (NSException *exception) { + NSDictionary *userInfo = + [NSDictionary dictionaryWithObject:exception.reason forKey:NSLocalizedDescriptionKey]; + if (error != NULL) (*error) = [NSError errorWithDomain:exception.name code:0 userInfo:userInfo]; + } + return res; } -- (NBEMatchType)isNumberMatch:(id)firstNumberIn second:(id)secondNumberIn -{ - // If the input arguements are strings parse them to a proto buffer format. - // Else make copies of the phone numbers so that the numbers passed in are not - // edited. - /** @type {i18n.phonenumbers.PhoneNumber} */ - NBPhoneNumber *firstNumber = nil, *secondNumber = nil; - - if ([firstNumberIn isKindOfClass:[NSString class]]) { - // First see if the first number has an implicit country calling code, by - // attempting to parse it. - NSError *anError; - firstNumber = [self parse:firstNumberIn defaultRegion:NB_UNKNOWN_REGION error:&anError]; - - if (anError != nil) { - if ([anError.domain isEqualToString:@"INVALID_COUNTRY_CODE"] == NO) { - return NBEMatchTypeNOT_A_NUMBER; - } - // The first number has no country calling code. EXACT_MATCH is no longer - // possible. We parse it as if the region was the same as that for the - // second number, and if EXACT_MATCH is returned, we replace this with - // NSN_MATCH. - if ([secondNumberIn isKindOfClass:[NSString class]] == NO) { - NSString *secondNumberRegion = [self getRegionCodeForCountryCode:((NBPhoneNumber*)secondNumberIn).countryCode]; - if (secondNumberRegion != NB_UNKNOWN_REGION) { - NSError *aNestedError; - firstNumber = [self parse:firstNumberIn defaultRegion:secondNumberRegion error:&aNestedError]; - - if (aNestedError != nil) { - return NBEMatchTypeNOT_A_NUMBER; - } - - NBEMatchType match = [self isNumberMatch:firstNumber second:secondNumberIn]; - if (match == NBEMatchTypeEXACT_MATCH) { - return NBEMatchTypeNSN_MATCH; - } - return match; - } - } - // If the second number is a string or doesn't have a valid country - // calling code, we parse the first number without country calling code. - NSError *aNestedError; - firstNumber = [self parseHelper:firstNumberIn defaultRegion:nil keepRawInput:NO checkRegion:NO error:&aNestedError]; - if (aNestedError != nil) { - return NBEMatchTypeNOT_A_NUMBER; - } +- (NBEMatchType)isNumberMatch:(id)firstNumberIn second:(id)secondNumberIn { + // If the input arguements are strings parse them to a proto buffer format. + // Else make copies of the phone numbers so that the numbers passed in are not + // edited. + /** @type {i18n.phonenumbers.PhoneNumber} */ + NBPhoneNumber *firstNumber = nil, *secondNumber = nil; + + if ([firstNumberIn isKindOfClass:[NSString class]]) { + // First see if the first number has an implicit country calling code, by + // attempting to parse it. + NSError *anError; + firstNumber = [self parse:firstNumberIn defaultRegion:NB_UNKNOWN_REGION error:&anError]; + + if (anError != nil) { + if ([anError.domain isEqualToString:@"INVALID_COUNTRY_CODE"] == NO) { + return NBEMatchTypeNOT_A_NUMBER; + } + // The first number has no country calling code. EXACT_MATCH is no longer + // possible. We parse it as if the region was the same as that for the + // second number, and if EXACT_MATCH is returned, we replace this with + // NSN_MATCH. + if ([secondNumberIn isKindOfClass:[NSString class]] == NO) { + NSString *secondNumberRegion = + [self getRegionCodeForCountryCode:((NBPhoneNumber *)secondNumberIn).countryCode]; + if (secondNumberRegion != NB_UNKNOWN_REGION) { + NSError *aNestedError; + firstNumber = + [self parse:firstNumberIn defaultRegion:secondNumberRegion error:&aNestedError]; + + if (aNestedError != nil) { + return NBEMatchTypeNOT_A_NUMBER; + } + + NBEMatchType match = [self isNumberMatch:firstNumber second:secondNumberIn]; + if (match == NBEMatchTypeEXACT_MATCH) { + return NBEMatchTypeNSN_MATCH; + } + return match; } + } + // If the second number is a string or doesn't have a valid country + // calling code, we parse the first number without country calling code. + NSError *aNestedError; + firstNumber = [self parseHelper:firstNumberIn + defaultRegion:nil + keepRawInput:NO + checkRegion:NO + error:&aNestedError]; + if (aNestedError != nil) { + return NBEMatchTypeNOT_A_NUMBER; + } + } + } else { + firstNumber = [firstNumberIn copy]; + } + + if ([secondNumberIn isKindOfClass:[NSString class]]) { + NSError *parseError; + secondNumber = [self parse:secondNumberIn defaultRegion:NB_UNKNOWN_REGION error:&parseError]; + if (parseError != nil) { + if ([parseError.domain isEqualToString:@"INVALID_COUNTRY_CODE"] == NO) { + return NBEMatchTypeNOT_A_NUMBER; + } + return [self isNumberMatch:secondNumberIn second:firstNumber]; } else { - firstNumber = [firstNumberIn copy]; + return [self isNumberMatch:firstNumberIn second:secondNumber]; } - - if ([secondNumberIn isKindOfClass:[NSString class]]) { - NSError *parseError; - secondNumber = [self parse:secondNumberIn defaultRegion:NB_UNKNOWN_REGION error:&parseError]; - if (parseError != nil) { - if ([parseError.domain isEqualToString:@"INVALID_COUNTRY_CODE"] == NO) { - return NBEMatchTypeNOT_A_NUMBER; - } - return [self isNumberMatch:secondNumberIn second:firstNumber]; - } else { - return [self isNumberMatch:firstNumberIn second:secondNumber]; - } - } - else { - secondNumber = [secondNumberIn copy]; - } - - // First clear raw_input, country_code_source and - // preferred_domestic_carrier_code fields and any empty-string extensions so - // that we can use the proto-buffer equality method. - firstNumber.rawInput = @""; - [firstNumber clearCountryCodeSource]; - firstNumber.preferredDomesticCarrierCode = @""; - - secondNumber.rawInput = @""; - [secondNumber clearCountryCodeSource]; - secondNumber.preferredDomesticCarrierCode = @""; - - if (firstNumber.extension != nil && firstNumber.extension.length == 0) { - firstNumber.extension = nil; - } - - if (secondNumber.extension != nil && secondNumber.extension.length == 0) { - secondNumber.extension = nil; - } - - // Early exit if both had extensions and these are different. - if ([NBMetadataHelper hasValue:firstNumber.extension] && [NBMetadataHelper hasValue:secondNumber.extension] && - [firstNumber.extension isEqualToString:secondNumber.extension] == NO) { - return NBEMatchTypeNO_MATCH; - } - - NSNumber *firstNumberCountryCode = firstNumber.countryCode; - NSNumber *secondNumberCountryCode = secondNumber.countryCode; - - // Both had country_code specified. - if (![firstNumberCountryCode isEqualToNumber:@0] && ![secondNumberCountryCode isEqualToNumber:@0]) { - if ([firstNumber isEqual:secondNumber]) { - return NBEMatchTypeEXACT_MATCH; - } else if ([firstNumberCountryCode isEqualToNumber:secondNumberCountryCode] && [self isNationalNumberSuffixOfTheOther:firstNumber second:secondNumber]) { - // A SHORT_NSN_MATCH occurs if there is a difference because of the - // presence or absence of an 'Italian leading zero', the presence or - // absence of an extension, or one NSN being a shorter variant of the - // other. - return NBEMatchTypeSHORT_NSN_MATCH; - } - // This is not a match. - return NBEMatchTypeNO_MATCH; - } - // Checks cases where one or both country_code fields were not specified. To - // make equality checks easier, we first set the country_code fields to be - // equal. - firstNumber.countryCode = @0; - secondNumber.countryCode = @0; - // If all else was the same, then this is an NSN_MATCH. - if ([firstNumber isEqual:secondNumber]) { - return NBEMatchTypeNSN_MATCH; - } - - if ([self isNationalNumberSuffixOfTheOther:firstNumber second:secondNumber]) { - return NBEMatchTypeSHORT_NSN_MATCH; - } - return NBEMatchTypeNO_MATCH; -} + } else { + secondNumber = [secondNumberIn copy]; + } + // First clear raw_input, country_code_source and + // preferred_domestic_carrier_code fields and any empty-string extensions so + // that we can use the proto-buffer equality method. + firstNumber.rawInput = @""; + [firstNumber clearCountryCodeSource]; + firstNumber.preferredDomesticCarrierCode = @""; + + secondNumber.rawInput = @""; + [secondNumber clearCountryCodeSource]; + secondNumber.preferredDomesticCarrierCode = @""; + + if (firstNumber.extension != nil && firstNumber.extension.length == 0) { + firstNumber.extension = nil; + } + + if (secondNumber.extension != nil && secondNumber.extension.length == 0) { + secondNumber.extension = nil; + } + + // Early exit if both had extensions and these are different. + if ([NBMetadataHelper hasValue:firstNumber.extension] && + [NBMetadataHelper hasValue:secondNumber.extension] && + [firstNumber.extension isEqualToString:secondNumber.extension] == NO) { + return NBEMatchTypeNO_MATCH; + } + + NSNumber *firstNumberCountryCode = firstNumber.countryCode; + NSNumber *secondNumberCountryCode = secondNumber.countryCode; + + // Both had country_code specified. + if (![firstNumberCountryCode isEqualToNumber:@0] && + ![secondNumberCountryCode isEqualToNumber:@0]) { + if ([firstNumber isEqual:secondNumber]) { + return NBEMatchTypeEXACT_MATCH; + } else if ([firstNumberCountryCode isEqualToNumber:secondNumberCountryCode] && + [self isNationalNumberSuffixOfTheOther:firstNumber second:secondNumber]) { + // A SHORT_NSN_MATCH occurs if there is a difference because of the + // presence or absence of an 'Italian leading zero', the presence or + // absence of an extension, or one NSN being a shorter variant of the + // other. + return NBEMatchTypeSHORT_NSN_MATCH; + } + // This is not a match. + return NBEMatchTypeNO_MATCH; + } + // Checks cases where one or both country_code fields were not specified. To + // make equality checks easier, we first set the country_code fields to be + // equal. + firstNumber.countryCode = @0; + secondNumber.countryCode = @0; + // If all else was the same, then this is an NSN_MATCH. + if ([firstNumber isEqual:secondNumber]) { + return NBEMatchTypeNSN_MATCH; + } + + if ([self isNationalNumberSuffixOfTheOther:firstNumber second:secondNumber]) { + return NBEMatchTypeSHORT_NSN_MATCH; + } + return NBEMatchTypeNO_MATCH; +} /** * Returns NO when one national number is the suffix of the other or both are @@ -3885,16 +3995,17 @@ static CTTelephonyNetworkInfo* _telephonyNetworkInfo; * @return {boolean} NO if one PhoneNumber is the suffix of the other one. * @private */ -- (BOOL)isNationalNumberSuffixOfTheOther:(NBPhoneNumber*)firstNumber second:(NBPhoneNumber*)secondNumber -{ - NSString *firstNumberNationalNumber = [NSString stringWithFormat:@"%@", firstNumber.nationalNumber]; - NSString *secondNumberNationalNumber = [NSString stringWithFormat:@"%@", secondNumber.nationalNumber]; - - // Note that endsWith returns NO if the numbers are equal. - return [firstNumberNationalNumber hasSuffix:secondNumberNationalNumber] || - [secondNumberNationalNumber hasSuffix:firstNumberNationalNumber]; -} +- (BOOL)isNationalNumberSuffixOfTheOther:(NBPhoneNumber *)firstNumber + second:(NBPhoneNumber *)secondNumber { + NSString *firstNumberNationalNumber = + [NSString stringWithFormat:@"%@", firstNumber.nationalNumber]; + NSString *secondNumberNationalNumber = + [NSString stringWithFormat:@"%@", secondNumber.nationalNumber]; + // Note that endsWith returns NO if the numbers are equal. + return [firstNumberNationalNumber hasSuffix:secondNumberNationalNumber] || + [secondNumberNationalNumber hasSuffix:firstNumberNationalNumber]; +} /** * Returns NO if the number can be dialled from outside the region, or @@ -3908,34 +4019,31 @@ static CTTelephonyNetworkInfo* _telephonyNetworkInfo; * @return {boolean} NO if the number can only be dialled from within the * country. */ -- (BOOL)canBeInternationallyDialled:(NBPhoneNumber*)number error:(NSError**)error -{ - BOOL res = NO; - @try { - res = [self canBeInternationallyDialled:number]; - } - @catch (NSException *exception) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObject:exception.reason - forKey:NSLocalizedDescriptionKey]; - if (error != NULL) - (*error) = [NSError errorWithDomain:exception.name code:0 userInfo:userInfo]; - } - return res; +- (BOOL)canBeInternationallyDialled:(NBPhoneNumber *)number error:(NSError **)error { + BOOL res = NO; + @try { + res = [self canBeInternationallyDialled:number]; + } @catch (NSException *exception) { + NSDictionary *userInfo = + [NSDictionary dictionaryWithObject:exception.reason forKey:NSLocalizedDescriptionKey]; + if (error != NULL) (*error) = [NSError errorWithDomain:exception.name code:0 userInfo:userInfo]; + } + return res; } -- (BOOL)canBeInternationallyDialled:(NBPhoneNumber*)number -{ - NBPhoneMetaData *metadata = [self.helper getMetadataForRegion:[self getRegionCodeForNumber:number]]; - if (metadata == nil) { - // Note numbers belonging to non-geographical entities (e.g. +800 numbers) - // are always internationally diallable, and will be caught here. - return YES; - } - NSString *nationalSignificantNumber = [self getNationalSignificantNumber:number]; - return [self isNumberMatchingDesc:nationalSignificantNumber numberDesc:metadata.noInternationalDialling] == NO; +- (BOOL)canBeInternationallyDialled:(NBPhoneNumber *)number { + NBPhoneMetaData *metadata = + [self.helper getMetadataForRegion:[self getRegionCodeForNumber:number]]; + if (metadata == nil) { + // Note numbers belonging to non-geographical entities (e.g. +800 numbers) + // are always internationally diallable, and will be caught here. + return YES; + } + NSString *nationalSignificantNumber = [self getNationalSignificantNumber:number]; + return [self isNumberMatchingDesc:nationalSignificantNumber + numberDesc:metadata.noInternationalDialling] == NO; } - /** * Check whether the entire input sequence can be matched against the regular * expression. @@ -3945,26 +4053,26 @@ static CTTelephonyNetworkInfo* _telephonyNetworkInfo; * @return {boolean} NO if str can be matched entirely against regex. * @private */ -- (BOOL)matchesEntirely:(NSString *)regex string:(NSString *)str -{ - if ([regex isEqualToString:@"NA"]) { - return NO; - } - - NSError *error = nil; - NSRegularExpression *currentPattern = [self entireRegularExpressionWithPattern:regex options:0 error:&error]; - NSRange stringRange = NSMakeRange(0, str.length); - NSTextCheckingResult *matchResult = [currentPattern firstMatchInString:str options:NSMatchingAnchored range:stringRange]; - - if (matchResult != nil) { - BOOL matchIsEntireString = NSEqualRanges(matchResult.range, stringRange); - if (matchIsEntireString) - { - return YES; - } - } - +- (BOOL)matchesEntirely:(NSString *)regex string:(NSString *)str { + if ([regex isEqualToString:@"NA"]) { return NO; + } + + NSError *error = nil; + NSRegularExpression *currentPattern = + [self entireRegularExpressionWithPattern:regex options:0 error:&error]; + NSRange stringRange = NSMakeRange(0, str.length); + NSTextCheckingResult *matchResult = + [currentPattern firstMatchInString:str options:NSMatchingAnchored range:stringRange]; + + if (matchResult != nil) { + BOOL matchIsEntireString = NSEqualRanges(matchResult.range, stringRange); + if (matchIsEntireString) { + return YES; + } + } + + return NO; } @end diff --git a/libPhoneNumber/NSArray+NBAdditions.m b/libPhoneNumber/NSArray+NBAdditions.m index 13677cd..4bb9b44 100644 --- a/libPhoneNumber/NSArray+NBAdditions.m +++ b/libPhoneNumber/NSArray+NBAdditions.m @@ -11,29 +11,29 @@ @implementation NSArray (NBAdditions) - (id)nb_safeObjectAtIndex:(NSUInteger)index class:(Class)clazz { - if (index >= self.count) { - return nil; - } - id res = [self objectAtIndex:index]; - if (![res isKindOfClass:clazz]) { - return nil; - } - return res; + if (index >= self.count) { + return nil; + } + id res = [self objectAtIndex:index]; + if (![res isKindOfClass:clazz]) { + return nil; + } + return res; } -- (NSString *)nb_safeStringAtIndex:(NSUInteger)index { - return [self nb_safeObjectAtIndex:index class:[NSString class]]; + - (NSString *)nb_safeStringAtIndex : (NSUInteger)index { + return [self nb_safeObjectAtIndex:index class:[NSString class]]; } - (NSNumber *)nb_safeNumberAtIndex:(NSUInteger)index { - return [self nb_safeObjectAtIndex:index class:[NSNumber class]]; + return [self nb_safeObjectAtIndex:index class:[NSNumber class]]; } - (NSArray *)nb_safeArrayAtIndex:(NSUInteger)index { - return [self nb_safeObjectAtIndex:index class:[NSArray class]]; + return [self nb_safeObjectAtIndex:index class:[NSArray class]]; } - (NSData *)nb_safeDataAtIndex:(NSUInteger)index { - return [self nb_safeObjectAtIndex:index class:[NSData class]]; + return [self nb_safeObjectAtIndex:index class:[NSData class]]; } @end diff --git a/libPhoneNumberTests/NBAsYouTypeFormatterTest.m b/libPhoneNumberTests/NBAsYouTypeFormatterTest.m old mode 100755 new mode 100644 index abb3911..aa330f8 --- a/libPhoneNumberTests/NBAsYouTypeFormatterTest.m +++ b/libPhoneNumberTests/NBAsYouTypeFormatterTest.m @@ -9,11 +9,9 @@ #import "NBAsYouTypeFormatter.h" #import "NBMetadataHelper.h" - @interface NBAsYouTypeFormatterTest : XCTestCase @end - @implementation NBAsYouTypeFormatterTest - (void)testInvalidRegion { @@ -28,7 +26,7 @@ XCTAssertEqualObjects(@"+48 88 123", [f inputDigit:@"3"]); XCTAssertEqualObjects(@"+48 88 123 1", [f inputDigit:@"1"]); XCTAssertEqualObjects(@"+48 88 123 12", [f inputDigit:@"2"]); - + [f clear]; XCTAssertEqualObjects(@"6", [f inputDigit:@"6"]); XCTAssertEqualObjects(@"65", [f inputDigit:@"5"]); @@ -53,7 +51,7 @@ // otherwise, no formatting is applied. XCTAssertEqualObjects(@"+48881231+", [f inputDigit:@"+"]); XCTAssertEqualObjects(@"+48881231+2", [f inputDigit:@"2"]); - + XCTAssertEqualObjects(@"+48881231+", [f removeLastDigit]); XCTAssertEqualObjects(@"+48 88 123 1", [f removeLastDigit]); XCTAssertEqualObjects(@"+48 88 123", [f removeLastDigit]); @@ -132,7 +130,7 @@ XCTAssertEqualObjects(@"650 253 22", [f inputDigit:@"2"]); XCTAssertEqualObjects(@"650 253 222", [f inputDigit:@"2"]); XCTAssertEqualObjects(@"650 253 2222", [f inputDigit:@"2"]); - + [f clear]; XCTAssertEqualObjects(@"1", [f inputDigit:@"1"]); XCTAssertEqualObjects(@"16", [f inputDigit:@"6"]); @@ -145,7 +143,7 @@ XCTAssertEqualObjects(@"1 650 253 22", [f inputDigit:@"2"]); XCTAssertEqualObjects(@"1 650 253 222", [f inputDigit:@"2"]); XCTAssertEqualObjects(@"1 650 253 2222", [f inputDigit:@"2"]); - + [f clear]; XCTAssertEqualObjects(@"0", [f inputDigit:@"0"]); XCTAssertEqualObjects(@"01", [f inputDigit:@"1"]); @@ -162,7 +160,7 @@ XCTAssertEqualObjects(@"011 44 6 123 123 1", [f inputDigit:@"1"]); XCTAssertEqualObjects(@"011 44 6 123 123 12", [f inputDigit:@"2"]); XCTAssertEqualObjects(@"011 44 6 123 123 123", [f inputDigit:@"3"]); - + [f clear]; XCTAssertEqualObjects(@"0", [f inputDigit:@"0"]); XCTAssertEqualObjects(@"01", [f inputDigit:@"1"]); @@ -180,7 +178,7 @@ XCTAssertEqualObjects(@"011 54 9 11 2312 12", [f inputDigit:@"2"]); XCTAssertEqualObjects(@"011 54 9 11 2312 123", [f inputDigit:@"3"]); XCTAssertEqualObjects(@"011 54 9 11 2312 1234", [f inputDigit:@"4"]); - + [f clear]; XCTAssertEqualObjects(@"0", [f inputDigit:@"0"]); XCTAssertEqualObjects(@"01", [f inputDigit:@"1"]); @@ -197,7 +195,7 @@ XCTAssertEqualObjects(@"011 244 280 000 0", [f inputDigit:@"0"]); XCTAssertEqualObjects(@"011 244 280 000 00", [f inputDigit:@"0"]); XCTAssertEqualObjects(@"011 244 280 000 000", [f inputDigit:@"0"]); - + [f clear]; XCTAssertEqualObjects(@"+", [f inputDigit:@"+"]); XCTAssertEqualObjects(@"+4", [f inputDigit:@"4"]); @@ -278,7 +276,7 @@ XCTAssertEqual(10, [f getRememberedPosition]); XCTAssertEqualObjects(@"1650253222222", [f inputDigit:@"2"]); XCTAssertEqual(10, [f getRememberedPosition]); - + [f clear]; XCTAssertEqualObjects(@"1", [f inputDigit:@"1"]); XCTAssertEqualObjects(@"16", [f inputDigitAndRememberPosition:@"6"]); @@ -299,7 +297,7 @@ XCTAssertEqual(2, [f getRememberedPosition]); XCTAssertEqualObjects(@"1650253222222", [f inputDigit:@"2"]); XCTAssertEqual(2, [f getRememberedPosition]); - + [f clear]; XCTAssertEqualObjects(@"6", [f inputDigit:@"6"]); XCTAssertEqualObjects(@"65", [f inputDigit:@"5"]); @@ -316,7 +314,7 @@ XCTAssertEqualObjects(@"650253222;", [f inputDigit:@";"]); XCTAssertEqual(7, [f getRememberedPosition]); XCTAssertEqualObjects(@"650253222;2", [f inputDigit:@"2"]); - + [f clear]; XCTAssertEqualObjects(@"6", [f inputDigit:@"6"]); XCTAssertEqualObjects(@"65", [f inputDigit:@"5"]); @@ -334,7 +332,7 @@ XCTAssertEqualObjects(@"650-253-22", [f inputDigit:@"2"]); XCTAssertEqualObjects(@"650-253-222", [f inputDigit:@"2"]); XCTAssertEqualObjects(@"650-253-2222", [f inputDigit:@"2"]); - + [f clear]; XCTAssertEqualObjects(@"0", [f inputDigit:@"0"]); XCTAssertEqualObjects(@"01", [f inputDigit:@"1"]); @@ -353,7 +351,7 @@ XCTAssertEqualObjects(@"011 48 88 123 12", [f inputDigit:@"2"]); XCTAssertEqualObjects(@"011 48 88 123 12 1", [f inputDigit:@"1"]); XCTAssertEqualObjects(@"011 48 88 123 12 12", [f inputDigit:@"2"]); - + [f clear]; XCTAssertEqualObjects(@"+", [f inputDigit:@"+"]); XCTAssertEqualObjects(@"+1", [f inputDigit:@"1"]); @@ -369,7 +367,7 @@ XCTAssertEqualObjects(@"+1 650 253 22", [f inputDigit:@"2"]); XCTAssertEqualObjects(@"+1 650 253 222", [f inputDigit:@"2"]); XCTAssertEqual(10, [f getRememberedPosition]); - + [f clear]; XCTAssertEqualObjects(@"+", [f inputDigit:@"+"]); XCTAssertEqualObjects(@"+1", [f inputDigit:@"1"]); @@ -459,7 +457,7 @@ XCTAssertEqualObjects(@"030/12", [f inputDigit:@"2"]); XCTAssertEqualObjects(@"030/123", [f inputDigit:@"3"]); XCTAssertEqualObjects(@"030/1234", [f inputDigit:@"4"]); - + // 04134 1234 [f clear]; XCTAssertEqualObjects(@"0", [f inputDigit:@"0"]); @@ -471,7 +469,7 @@ XCTAssertEqualObjects(@"04134 12", [f inputDigit:@"2"]); XCTAssertEqualObjects(@"04134 123", [f inputDigit:@"3"]); XCTAssertEqualObjects(@"04134 1234", [f inputDigit:@"4"]); - + // 08021 2345 [f clear]; XCTAssertEqualObjects(@"0", [f inputDigit:@"0"]); @@ -483,7 +481,7 @@ XCTAssertEqualObjects(@"08021 23", [f inputDigit:@"3"]); XCTAssertEqualObjects(@"08021 234", [f inputDigit:@"4"]); XCTAssertEqualObjects(@"08021 2345", [f inputDigit:@"5"]); - + // 00 1 650 253 2250 [f clear]; XCTAssertEqualObjects(@"0", [f inputDigit:@"0"]); @@ -516,7 +514,7 @@ XCTAssertEqualObjects(@"011 7031-3000", [f inputDigit:@"0"]); } --(void)testAYTFARMobile { +- (void)testAYTFARMobile { NBAsYouTypeFormatter *f = [[NBAsYouTypeFormatter alloc] initWithRegionCode:@"AR"]; XCTAssertEqualObjects(@"+", [f inputDigit:@"+"]); XCTAssertEqualObjects(@"+5", [f inputDigit:@"5"]); @@ -534,7 +532,7 @@ XCTAssertEqualObjects(@"+54 9 11 2312 1234", [f inputDigit:@"4"]); } --(void)testAYTFKR { +- (void)testAYTFKR { // +82 51 234 5678 NBAsYouTypeFormatter *f = [[NBAsYouTypeFormatter alloc] initWithRegionCode:@"KR"]; XCTAssertEqualObjects(@"+", [f inputDigit:@"+"]); @@ -549,7 +547,7 @@ XCTAssertEqualObjects(@"+82 51-234-56", [f inputDigit:@"6"]); XCTAssertEqualObjects(@"+82 51-234-567", [f inputDigit:@"7"]); XCTAssertEqualObjects(@"+82 51-234-5678", [f inputDigit:@"8"]); - + // +82 2 531 5678 [f clear]; XCTAssertEqualObjects(@"+", [f inputDigit:@"+"]); @@ -563,7 +561,7 @@ XCTAssertEqualObjects(@"+82 2-531-56", [f inputDigit:@"6"]); XCTAssertEqualObjects(@"+82 2-531-567", [f inputDigit:@"7"]); XCTAssertEqualObjects(@"+82 2-531-5678", [f inputDigit:@"8"]); - + // +82 2 3665 5678 [f clear]; XCTAssertEqualObjects(@"+", [f inputDigit:@"+"]); @@ -578,7 +576,7 @@ XCTAssertEqualObjects(@"+82 2-3665-56", [f inputDigit:@"6"]); XCTAssertEqualObjects(@"+82 2-3665-567", [f inputDigit:@"7"]); XCTAssertEqualObjects(@"+82 2-3665-5678", [f inputDigit:@"8"]); - + // 02-114 [f clear]; XCTAssertEqualObjects(@"0", [f inputDigit:@"0"]); @@ -586,7 +584,7 @@ XCTAssertEqualObjects(@"021", [f inputDigit:@"1"]); XCTAssertEqualObjects(@"02-11", [f inputDigit:@"1"]); XCTAssertEqualObjects(@"02-114", [f inputDigit:@"4"]); - + // 02-1300 [f clear]; XCTAssertEqualObjects(@"0", [f inputDigit:@"0"]); @@ -595,7 +593,7 @@ XCTAssertEqualObjects(@"02-13", [f inputDigit:@"3"]); XCTAssertEqualObjects(@"02-130", [f inputDigit:@"0"]); XCTAssertEqualObjects(@"02-1300", [f inputDigit:@"0"]); - + // 011-456-7890 [f clear]; XCTAssertEqualObjects(@"0", [f inputDigit:@"0"]); @@ -608,7 +606,7 @@ XCTAssertEqualObjects(@"011-456-78", [f inputDigit:@"8"]); XCTAssertEqualObjects(@"011-456-789", [f inputDigit:@"9"]); XCTAssertEqualObjects(@"011-456-7890", [f inputDigit:@"0"]); - + // 011-9876-7890 [f clear]; XCTAssertEqualObjects(@"0", [f inputDigit:@"0"]); @@ -624,9 +622,9 @@ XCTAssertEqualObjects(@"011-9876-7890", [f inputDigit:@"0"]); } --(void)testAYTF_MX { +- (void)testAYTF_MX { NBAsYouTypeFormatter *f = [[NBAsYouTypeFormatter alloc] initWithRegionCode:@"MX"]; - + // +52 800 123 4567 XCTAssertEqualObjects(@"+", [f inputDigit:@"+"]); XCTAssertEqualObjects(@"+5", [f inputDigit:@"5"]); @@ -641,7 +639,7 @@ XCTAssertEqualObjects(@"+52 800 123 45", [f inputDigit:@"5"]); XCTAssertEqualObjects(@"+52 800 123 456", [f inputDigit:@"6"]); XCTAssertEqualObjects(@"+52 800 123 4567", [f inputDigit:@"7"]); - + // +52 55 1234 5678 [f clear]; XCTAssertEqualObjects(@"+", [f inputDigit:@"+"]); @@ -657,7 +655,7 @@ XCTAssertEqualObjects(@"+52 55 1234 56", [f inputDigit:@"6"]); XCTAssertEqualObjects(@"+52 55 1234 567", [f inputDigit:@"7"]); XCTAssertEqualObjects(@"+52 55 1234 5678", [f inputDigit:@"8"]); - + // +52 212 345 6789 [f clear]; XCTAssertEqualObjects(@"+", [f inputDigit:@"+"]); @@ -673,7 +671,7 @@ XCTAssertEqualObjects(@"+52 212 345 67", [f inputDigit:@"7"]); XCTAssertEqualObjects(@"+52 212 345 678", [f inputDigit:@"8"]); XCTAssertEqualObjects(@"+52 212 345 6789", [f inputDigit:@"9"]); - + // +52 1 55 1234 5678 [f clear]; XCTAssertEqualObjects(@"+", [f inputDigit:@"+"]); @@ -690,7 +688,7 @@ XCTAssertEqualObjects(@"+52 1 55 1234 56", [f inputDigit:@"6"]); XCTAssertEqualObjects(@"+52 1 55 1234 567", [f inputDigit:@"7"]); XCTAssertEqualObjects(@"+52 1 55 1234 5678", [f inputDigit:@"8"]); - + // +52 1 541 234 5678 [f clear]; XCTAssertEqualObjects(@"+", [f inputDigit:@"+"]); @@ -709,7 +707,7 @@ XCTAssertEqualObjects(@"+52 1 541 234 5678", [f inputDigit:@"8"]); } --(void)testAYTF_International_Toll_Free { +- (void)testAYTF_International_Toll_Free { NBAsYouTypeFormatter *f = [[NBAsYouTypeFormatter alloc] initWithRegionCode:@"US"]; // +800 1234 5678 XCTAssertEqualObjects(@"+", [f inputDigit:@"+"]); @@ -727,7 +725,7 @@ XCTAssertEqualObjects(@"+800123456789", [f inputDigit:@"9"]); } --(void)testAYTFMultipleLeadingDigitPatterns { +- (void)testAYTFMultipleLeadingDigitPatterns { // +81 50 2345 6789 NBAsYouTypeFormatter *f = [[NBAsYouTypeFormatter alloc] initWithRegionCode:@"JP"]; XCTAssertEqualObjects(@"+", [f inputDigit:@"+"]); @@ -743,7 +741,7 @@ XCTAssertEqualObjects(@"+81 50 2345 67", [f inputDigit:@"7"]); XCTAssertEqualObjects(@"+81 50 2345 678", [f inputDigit:@"8"]); XCTAssertEqualObjects(@"+81 50 2345 6789", [f inputDigit:@"9"]); - + // +81 222 12 5678 [f clear]; XCTAssertEqualObjects(@"+", [f inputDigit:@"+"]); @@ -758,7 +756,7 @@ XCTAssertEqualObjects(@"+81 222 12 56", [f inputDigit:@"6"]); XCTAssertEqualObjects(@"+81 222 12 567", [f inputDigit:@"7"]); XCTAssertEqualObjects(@"+81 222 12 5678", [f inputDigit:@"8"]); - + // 011113 [f clear]; XCTAssertEqualObjects(@"0", [f inputDigit:@"0"]); @@ -767,7 +765,7 @@ XCTAssertEqualObjects(@"011 1", [f inputDigit:@"1"]); XCTAssertEqualObjects(@"011 11", [f inputDigit:@"1"]); XCTAssertEqualObjects(@"011113", [f inputDigit:@"3"]); - + // +81 3332 2 5678 [f clear]; XCTAssertEqualObjects(@"+", [f inputDigit:@"+"]); @@ -784,7 +782,7 @@ XCTAssertEqualObjects(@"+81 3332 2 5678", [f inputDigit:@"8"]); } --(void)testAYTFLongIDD_AU { +- (void)testAYTFLongIDD_AU { NBAsYouTypeFormatter *f = [[NBAsYouTypeFormatter alloc] initWithRegionCode:@"AU"]; // 0011 1 650 253 2250 XCTAssertEqualObjects(@"0", [f inputDigit:@"0"]); @@ -802,7 +800,7 @@ XCTAssertEqualObjects(@"0011 1 650 253 22", [f inputDigit:@"2"]); XCTAssertEqualObjects(@"0011 1 650 253 222", [f inputDigit:@"2"]); XCTAssertEqualObjects(@"0011 1 650 253 2222", [f inputDigit:@"2"]); - + // 0011 81 3332 2 5678 [f clear]; XCTAssertEqualObjects(@"0", [f inputDigit:@"0"]); @@ -820,7 +818,7 @@ XCTAssertEqualObjects(@"0011 81 3332 2 56", [f inputDigit:@"6"]); XCTAssertEqualObjects(@"0011 81 3332 2 567", [f inputDigit:@"7"]); XCTAssertEqualObjects(@"0011 81 3332 2 5678", [f inputDigit:@"8"]); - + // 0011 244 250 253 222 [f clear]; XCTAssertEqualObjects(@"0", [f inputDigit:@"0"]); @@ -841,7 +839,7 @@ XCTAssertEqualObjects(@"0011 244 250 253 222", [f inputDigit:@"2"]); } --(void)testAYTFLongIDD_KR { +- (void)testAYTFLongIDD_KR { NBAsYouTypeFormatter *f = [[NBAsYouTypeFormatter alloc] initWithRegionCode:@"KR"]; // 00300 1 650 253 2222 XCTAssertEqualObjects(@"0", [f inputDigit:@"0"]); @@ -862,7 +860,7 @@ XCTAssertEqualObjects(@"00300 1 650 253 2222", [f inputDigit:@"2"]); } --(void)testAYTFLongNDD_KR { +- (void)testAYTFLongNDD_KR { NBAsYouTypeFormatter *f = [[NBAsYouTypeFormatter alloc] initWithRegionCode:@"KR"]; // 08811-9876-7890 XCTAssertEqualObjects(@"0", [f inputDigit:@"0"]); @@ -878,7 +876,7 @@ XCTAssertEqualObjects(@"08811-9876-78", [f inputDigit:@"8"]); XCTAssertEqualObjects(@"08811-9876-789", [f inputDigit:@"9"]); XCTAssertEqualObjects(@"08811-9876-7890", [f inputDigit:@"0"]); - + // 08500 11-9876-7890 [f clear]; XCTAssertEqualObjects(@"0", [f inputDigit:@"0"]); @@ -898,7 +896,7 @@ XCTAssertEqualObjects(@"08500 11-9876-7890", [f inputDigit:@"0"]); } --(void)testAYTFLongNDD_SG { +- (void)testAYTFLongNDD_SG { NBAsYouTypeFormatter *f = [[NBAsYouTypeFormatter alloc] initWithRegionCode:@"SG"]; // 777777 9876 7890 XCTAssertEqualObjects(@"7", [f inputDigit:@"7"]); @@ -917,10 +915,10 @@ XCTAssertEqualObjects(@"777777 9876 7890", [f inputDigit:@"0"]); } --(void)testAYTFShortNumberFormattingFix_AU { +- (void)testAYTFShortNumberFormattingFix_AU { // For Australia, the national prefix is not optional when formatting. NBAsYouTypeFormatter *f = [[NBAsYouTypeFormatter alloc] initWithRegionCode:@"AU"]; - + // 1234567890 - For leading digit 1, the national prefix formatting rule has // first group only. XCTAssertEqualObjects(@"1", [f inputDigit:@"1"]); @@ -933,7 +931,7 @@ XCTAssertEqualObjects(@"1234 567 8", [f inputDigit:@"8"]); XCTAssertEqualObjects(@"1234 567 89", [f inputDigit:@"9"]); XCTAssertEqualObjects(@"1234 567 890", [f inputDigit:@"0"]); - + // +61 1234 567 890 - Test the same number, but with the country code. [f clear]; XCTAssertEqualObjects(@"+", [f inputDigit:@"+"]); @@ -949,7 +947,7 @@ XCTAssertEqualObjects(@"+61 1234 567 8", [f inputDigit:@"8"]); XCTAssertEqualObjects(@"+61 1234 567 89", [f inputDigit:@"9"]); XCTAssertEqualObjects(@"+61 1234 567 890", [f inputDigit:@"0"]); - + // 212345678 - For leading digit 2, the national prefix formatting rule puts // the national prefix before the first group. [f clear]; @@ -963,7 +961,7 @@ XCTAssertEqualObjects(@"02 1234 56", [f inputDigit:@"6"]); XCTAssertEqualObjects(@"02 1234 567", [f inputDigit:@"7"]); XCTAssertEqualObjects(@"02 1234 5678", [f inputDigit:@"8"]); - + // 212345678 - Test the same number, but without the leading 0. [f clear]; XCTAssertEqualObjects(@"2", [f inputDigit:@"2"]); @@ -975,7 +973,7 @@ XCTAssertEqualObjects(@"2123456", [f inputDigit:@"6"]); XCTAssertEqualObjects(@"21234567", [f inputDigit:@"7"]); XCTAssertEqualObjects(@"212345678", [f inputDigit:@"8"]); - + // +61 2 1234 5678 - Test the same number, but with the country code. [f clear]; XCTAssertEqualObjects(@"+", [f inputDigit:@"+"]); @@ -992,22 +990,22 @@ XCTAssertEqualObjects(@"+61 2 1234 5678", [f inputDigit:@"8"]); } --(void)testAYTFShortNumberFormattingFix_KR { +- (void)testAYTFShortNumberFormattingFix_KR { // For Korea, the national prefix is not optional when formatting, and the // national prefix formatting rule doesn't consist of only the first group. NBAsYouTypeFormatter *f = [[NBAsYouTypeFormatter alloc] initWithRegionCode:@"KR"]; - + // 111 XCTAssertEqualObjects(@"1", [f inputDigit:@"1"]); XCTAssertEqualObjects(@"11", [f inputDigit:@"1"]); XCTAssertEqualObjects(@"111", [f inputDigit:@"1"]); - + // 114 [f clear]; XCTAssertEqualObjects(@"1", [f inputDigit:@"1"]); XCTAssertEqualObjects(@"11", [f inputDigit:@"1"]); XCTAssertEqualObjects(@"114", [f inputDigit:@"4"]); - + // 13121234 - Test a mobile number without the national prefix. Even though it // is not an emergency number, it should be formatted as a block. [f clear]; @@ -1019,7 +1017,7 @@ XCTAssertEqualObjects(@"131212", [f inputDigit:@"2"]); XCTAssertEqualObjects(@"1312123", [f inputDigit:@"3"]); XCTAssertEqualObjects(@"13121234", [f inputDigit:@"4"]); - + // +82 131-2-1234 - Test the same number, but with the country code. [f clear]; XCTAssertEqualObjects(@"+", [f inputDigit:@"+"]); @@ -1035,15 +1033,15 @@ XCTAssertEqualObjects(@"+82 131-2-1234", [f inputDigit:@"4"]); } --(void)testAYTFShortNumberFormattingFix_MX { +- (void)testAYTFShortNumberFormattingFix_MX { // For Mexico, the national prefix is optional when formatting. NBAsYouTypeFormatter *f = [[NBAsYouTypeFormatter alloc] initWithRegionCode:@"MX"]; - + // 911 XCTAssertEqualObjects(@"9", [f inputDigit:@"9"]); XCTAssertEqualObjects(@"91", [f inputDigit:@"1"]); XCTAssertEqualObjects(@"911", [f inputDigit:@"1"]); - + // 800 123 4567 - Test a toll-free number, which should have a formatting rule // applied to it even though it doesn't begin with the national prefix. [f clear]; @@ -1057,7 +1055,7 @@ XCTAssertEqualObjects(@"800 123 45", [f inputDigit:@"5"]); XCTAssertEqualObjects(@"800 123 456", [f inputDigit:@"6"]); XCTAssertEqualObjects(@"800 123 4567", [f inputDigit:@"7"]); - + // +52 800 123 4567 - Test the same number, but with the country code. [f clear]; XCTAssertEqualObjects(@"+", [f inputDigit:@"+"]); @@ -1075,7 +1073,7 @@ XCTAssertEqualObjects(@"+52 800 123 4567", [f inputDigit:@"7"]); } --(void)testAYTFNoNationalPrefix { +- (void)testAYTFNoNationalPrefix { NBAsYouTypeFormatter *f = [[NBAsYouTypeFormatter alloc] initWithRegionCode:@"IT"]; XCTAssertEqualObjects(@"3", [f inputDigit:@"3"]); XCTAssertEqualObjects(@"33", [f inputDigit:@"3"]); @@ -1085,21 +1083,21 @@ XCTAssertEqualObjects(@"333 333", [f inputDigit:@"3"]); } --(void)testAYTFShortNumberFormattingFix_US { +- (void)testAYTFShortNumberFormattingFix_US { // For the US, an initial 1 is treated specially. NBAsYouTypeFormatter *f = [[NBAsYouTypeFormatter alloc] initWithRegionCode:@"US"]; - + // 101 - Test that the initial 1 is not treated as a national prefix. XCTAssertEqualObjects(@"1", [f inputDigit:@"1"]); XCTAssertEqualObjects(@"10", [f inputDigit:@"0"]); XCTAssertEqualObjects(@"101", [f inputDigit:@"1"]); - + // 112 - Test that the initial 1 is not treated as a national prefix. [f clear]; XCTAssertEqualObjects(@"1", [f inputDigit:@"1"]); XCTAssertEqualObjects(@"11", [f inputDigit:@"1"]); XCTAssertEqualObjects(@"112", [f inputDigit:@"2"]); - + // 122 - Test that the initial 1 is treated as a national prefix. [f clear]; XCTAssertEqualObjects(@"1", [f inputDigit:@"1"]); @@ -1107,9 +1105,9 @@ XCTAssertEqualObjects(@"1 22", [f inputDigit:@"2"]); } --(void)testAYTFDescription { +- (void)testAYTFDescription { NBAsYouTypeFormatter *f = [[NBAsYouTypeFormatter alloc] initWithRegionCode:@"US"]; - + [f inputDigit:@"1"]; [f inputDigit:@"6"]; [f inputDigit:@"5"]; @@ -1122,47 +1120,47 @@ [f inputDigit:@"2"]; [f inputDigit:@"2"]; XCTAssertEqualObjects(@"1 650 253 2222", [f description]); - + [f removeLastDigit]; XCTAssertEqualObjects(@"1 650 253 222", [f description]); - + [f removeLastDigit]; XCTAssertEqualObjects(@"1 650 253 22", [f description]); - + [f removeLastDigit]; XCTAssertEqualObjects(@"1 650 253 2", [f description]); - + [f removeLastDigit]; XCTAssertEqualObjects(@"1 650 253", [f description]); - + [f removeLastDigit]; XCTAssertEqualObjects(@"1 650 25", [f description]); - + [f removeLastDigit]; XCTAssertEqualObjects(@"1 650 2", [f description]); - + [f removeLastDigit]; XCTAssertEqualObjects(@"1 650", [f description]); - + [f removeLastDigit]; XCTAssertEqualObjects(@"1 65", [f description]); - + [f removeLastDigit]; XCTAssertEqualObjects(@"16", [f description]); - + [f removeLastDigit]; XCTAssertEqualObjects(@"1", [f description]); - + [f removeLastDigit]; XCTAssertEqualObjects(@"", [f description]); - + [f inputString:@"16502532222"]; XCTAssertEqualObjects(@"1 650 253 2222", [f description]); } --(void)testAYTFNumberPatternsBecomingInvalidShouldNotResultInDigitLoss { +- (void)testAYTFNumberPatternsBecomingInvalidShouldNotResultInDigitLoss { NBAsYouTypeFormatter *f = [[NBAsYouTypeFormatter alloc] initWithRegionCode:@"CN"]; - + XCTAssertEqualObjects(@"+", [f inputDigit:@"+"]); XCTAssertEqualObjects(@"+8", [f inputDigit:@"8"]); XCTAssertEqualObjects(@"+86 ", [f inputDigit:@"6"]); diff --git a/libPhoneNumberTests/NBPhoneNumberUtilTest.m b/libPhoneNumberTests/NBPhoneNumberUtilTest.m old mode 100755 new mode 100644 index 75994c9..d4147ad --- a/libPhoneNumberTests/NBPhoneNumberUtilTest.m +++ b/libPhoneNumberTests/NBPhoneNumberUtilTest.m @@ -9,75 +9,87 @@ #import "NBMetadataHelper.h" #import "NBPhoneMetaData.h" +#import "NBNumberFormat.h" #import "NBPhoneNumber.h" #import "NBPhoneNumberDesc.h" #import "NBPhoneNumberUtil.h" -#import "NBNumberFormat.h" // Create an entry array for a phone number desc based on numberPattern static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPattern) { // nationalNumberPattern is entry #2 - return @[[NSNull null], [NSNull null], numberPattern]; + return @[ [NSNull null], [NSNull null], numberPattern ]; } - @interface NBPhoneNumberUtil (FOR_UNIT_TEST) -- (BOOL)canBeInternationallyDialled:(NBPhoneNumber*)number; -- (BOOL)truncateTooLongNumber:(NBPhoneNumber*)number; -- (NBEValidationResult)isPossibleNumberWithReason:(NBPhoneNumber*)number; -- (BOOL)isPossibleNumber:(NBPhoneNumber*)number; -- (NBEValidationResult)validateNumberLength:(NSString *)number metadata:(NBPhoneMetaData *)metadata type:(NBEPhoneNumberType)type; +- (BOOL)canBeInternationallyDialled:(NBPhoneNumber *)number; +- (BOOL)truncateTooLongNumber:(NBPhoneNumber *)number; +- (NBEValidationResult)isPossibleNumberWithReason:(NBPhoneNumber *)number; +- (BOOL)isPossibleNumber:(NBPhoneNumber *)number; +- (NBEValidationResult)validateNumberLength:(NSString *)number + metadata:(NBPhoneMetaData *)metadata + type:(NBEPhoneNumberType)type; - (NBEMatchType)isNumberMatch:(id)firstNumberIn second:(id)secondNumberIn; -- (int)getLengthOfGeographicalAreaCode:(NBPhoneNumber*)phoneNumber; -- (int)getLengthOfNationalDestinationCode:(NBPhoneNumber*)phoneNumber; -- (BOOL)maybeStripNationalPrefixAndCarrierCode:(NSString**)numberStr metadata:(NBPhoneMetaData*)metadata carrierCode:(NSString**)carrierCode; -- (NBECountryCodeSource)maybeStripInternationalPrefixAndNormalize:(NSString**)numberStr possibleIddPrefix:(NSString*)possibleIddPrefix; -- (NSString*)format:(NBPhoneNumber*)phoneNumber numberFormat:(NBEPhoneNumberFormat)numberFormat; -- (NSString*)formatByPattern:(NBPhoneNumber*)number numberFormat:(NBEPhoneNumberFormat)numberFormat userDefinedFormats:(NSArray*)userDefinedFormats; -- (NSString*)formatNumberForMobileDialing:(NBPhoneNumber*)number regionCallingFrom:(NSString*)regionCallingFrom withFormatting:(BOOL)withFormatting; -- (NSString*)formatOutOfCountryCallingNumber:(NBPhoneNumber*)number regionCallingFrom:(NSString*)regionCallingFrom; -- (NSString*)formatOutOfCountryKeepingAlphaChars:(NBPhoneNumber*)number regionCallingFrom:(NSString*)regionCallingFrom; -- (NSString*)formatNationalNumberWithCarrierCode:(NBPhoneNumber*)number carrierCode:(NSString*)carrierCode; -- (NSString*)formatInOriginalFormat:(NBPhoneNumber*)number regionCallingFrom:(NSString*)regionCallingFrom; -- (NSString*)formatNationalNumberWithPreferredCarrierCode:(NBPhoneNumber*)number fallbackCarrierCode:(NSString*)fallbackCarrierCode; +- (int)getLengthOfGeographicalAreaCode:(NBPhoneNumber *)phoneNumber; +- (int)getLengthOfNationalDestinationCode:(NBPhoneNumber *)phoneNumber; +- (BOOL)maybeStripNationalPrefixAndCarrierCode:(NSString **)numberStr + metadata:(NBPhoneMetaData *)metadata + carrierCode:(NSString **)carrierCode; +- (NBECountryCodeSource)maybeStripInternationalPrefixAndNormalize:(NSString **)numberStr + possibleIddPrefix:(NSString *)possibleIddPrefix; +- (NSString *)format:(NBPhoneNumber *)phoneNumber numberFormat:(NBEPhoneNumberFormat)numberFormat; +- (NSString *)formatByPattern:(NBPhoneNumber *)number + numberFormat:(NBEPhoneNumberFormat)numberFormat + userDefinedFormats:(NSArray *)userDefinedFormats; +- (NSString *)formatNumberForMobileDialing:(NBPhoneNumber *)number + regionCallingFrom:(NSString *)regionCallingFrom + withFormatting:(BOOL)withFormatting; +- (NSString *)formatOutOfCountryCallingNumber:(NBPhoneNumber *)number + regionCallingFrom:(NSString *)regionCallingFrom; +- (NSString *)formatOutOfCountryKeepingAlphaChars:(NBPhoneNumber *)number + regionCallingFrom:(NSString *)regionCallingFrom; +- (NSString *)formatNationalNumberWithCarrierCode:(NBPhoneNumber *)number + carrierCode:(NSString *)carrierCode; +- (NSString *)formatInOriginalFormat:(NBPhoneNumber *)number + regionCallingFrom:(NSString *)regionCallingFrom; +- (NSString *)formatNationalNumberWithPreferredCarrierCode:(NBPhoneNumber *)number + fallbackCarrierCode:(NSString *)fallbackCarrierCode; @end - @interface NBPhoneNumberUtilTest : XCTestCase -@property (nonatomic, strong) NBPhoneNumberUtil *aUtil; -@property (nonatomic, strong) NBMetadataHelper *helper; +@property(nonatomic, strong) NBPhoneNumberUtil *aUtil; +@property(nonatomic, strong) NBMetadataHelper *helper; -@property (nonatomic, readonly, copy) NBPhoneNumber *alphaNumbericNumber; -@property (nonatomic, readonly, copy) NBPhoneNumber *arMobile; -@property (nonatomic, readonly, copy) NBPhoneNumber *arNumber; -@property (nonatomic, readonly, copy) NBPhoneNumber *auNumber; -@property (nonatomic, readonly, copy) NBPhoneNumber *bsMobile; -@property (nonatomic, readonly, copy) NBPhoneNumber *bsNumber; -@property (nonatomic, readonly, copy) NBPhoneNumber *deNumber; -@property (nonatomic, readonly, copy) NBPhoneNumber *deShortNumber; -@property (nonatomic, readonly, copy) NBPhoneNumber *gbMobile; -@property (nonatomic, readonly, copy) NBPhoneNumber *gbNumber; -@property (nonatomic, readonly, copy) NBPhoneNumber *internationalTollFreeNumber; -@property (nonatomic, readonly, copy) NBPhoneNumber *itMobile; -@property (nonatomic, readonly, copy) NBPhoneNumber *itNumber; -@property (nonatomic, readonly, copy) NBPhoneNumber *mxNumber; -@property (nonatomic, readonly, copy) NBPhoneNumber *mxMobile1; -@property (nonatomic, readonly, copy) NBPhoneNumber *mxMobile2; -@property (nonatomic, readonly, copy) NBPhoneNumber *nzNumber; -@property (nonatomic, readonly, copy) NBPhoneNumber *sgNumber; -@property (nonatomic, readonly, copy) NBPhoneNumber *universalPremiumRateNumber; -@property (nonatomic, readonly, copy) NBPhoneNumber *unknownCountryCodeNoRawInput; -@property (nonatomic, readonly, copy) NBPhoneNumber *usLocalNumber; -@property (nonatomic, readonly, copy) NBPhoneNumber *usNumber; -@property (nonatomic, readonly, copy) NBPhoneNumber *usPremiumNumber; -@property (nonatomic, readonly, copy) NBPhoneNumber *usShortByOneNumber; -@property (nonatomic, readonly, copy) NBPhoneNumber *usTollFreeNumber; +@property(nonatomic, readonly, copy) NBPhoneNumber *alphaNumbericNumber; +@property(nonatomic, readonly, copy) NBPhoneNumber *arMobile; +@property(nonatomic, readonly, copy) NBPhoneNumber *arNumber; +@property(nonatomic, readonly, copy) NBPhoneNumber *auNumber; +@property(nonatomic, readonly, copy) NBPhoneNumber *bsMobile; +@property(nonatomic, readonly, copy) NBPhoneNumber *bsNumber; +@property(nonatomic, readonly, copy) NBPhoneNumber *deNumber; +@property(nonatomic, readonly, copy) NBPhoneNumber *deShortNumber; +@property(nonatomic, readonly, copy) NBPhoneNumber *gbMobile; +@property(nonatomic, readonly, copy) NBPhoneNumber *gbNumber; +@property(nonatomic, readonly, copy) NBPhoneNumber *internationalTollFreeNumber; +@property(nonatomic, readonly, copy) NBPhoneNumber *itMobile; +@property(nonatomic, readonly, copy) NBPhoneNumber *itNumber; +@property(nonatomic, readonly, copy) NBPhoneNumber *mxNumber; +@property(nonatomic, readonly, copy) NBPhoneNumber *mxMobile1; +@property(nonatomic, readonly, copy) NBPhoneNumber *mxMobile2; +@property(nonatomic, readonly, copy) NBPhoneNumber *nzNumber; +@property(nonatomic, readonly, copy) NBPhoneNumber *sgNumber; +@property(nonatomic, readonly, copy) NBPhoneNumber *universalPremiumRateNumber; +@property(nonatomic, readonly, copy) NBPhoneNumber *unknownCountryCodeNoRawInput; +@property(nonatomic, readonly, copy) NBPhoneNumber *usLocalNumber; +@property(nonatomic, readonly, copy) NBPhoneNumber *usNumber; +@property(nonatomic, readonly, copy) NBPhoneNumber *usPremiumNumber; +@property(nonatomic, readonly, copy) NBPhoneNumber *usShortByOneNumber; +@property(nonatomic, readonly, copy) NBPhoneNumber *usTollFreeNumber; // Too-long and hence invalid numbers. -@property (nonatomic, readonly, copy) NBPhoneNumber *usTooLongNumber; -@property (nonatomic, readonly, copy) NBPhoneNumber *internationalTollFreeTooLongNumber; +@property(nonatomic, readonly, copy) NBPhoneNumber *usTooLongNumber; +@property(nonatomic, readonly, copy) NBPhoneNumber *internationalTollFreeTooLongNumber; @end @@ -90,23 +102,35 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat } - (void)tearDown { - [super tearDown]; + [super tearDown]; } -- (NSString*)stringForNumberType:(NBEPhoneNumberType)type { +- (NSString *)stringForNumberType:(NBEPhoneNumberType)type { switch (type) { - case 0: return @"FIXED_LINE"; - case 1: return @"MOBILE"; - case 2: return @"FIXED_LINE_OR_MOBILE"; - case 3: return @"TOLL_FREE"; - case 4: return @"PREMIUM_RATE"; - case 5: return @"SHARED_COST"; - case 6: return @"VOIP"; - case 7: return @"PERSONAL_NUMBER"; - case 8: return @"PAGER"; - case 9: return @"UAN"; - case 10: return @"VOICEMAIL"; - default: return @"UNKNOWN"; + case 0: + return @"FIXED_LINE"; + case 1: + return @"MOBILE"; + case 2: + return @"FIXED_LINE_OR_MOBILE"; + case 3: + return @"TOLL_FREE"; + case 4: + return @"PREMIUM_RATE"; + case 5: + return @"SHARED_COST"; + case 6: + return @"VOIP"; + case 7: + return @"PERSONAL_NUMBER"; + case 8: + return @"PAGER"; + case 9: + return @"UAN"; + case 10: + return @"VOICEMAIL"; + default: + return @"UNKNOWN"; } } @@ -201,7 +225,7 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat usPremiumNumber.nationalNumber = @9002530000; return usPremiumNumber; } - + - (NBPhoneNumber *)usLocalNumber { // Too short, but still possible US numbers. NBPhoneNumber *usLocalNumber = [[NBPhoneNumber alloc] init]; @@ -217,14 +241,14 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat usShortByOneNumber.nationalNumber = @650253000; return usShortByOneNumber; } - + - (NBPhoneNumber *)usTollFreeNumber { NBPhoneNumber *usTollFreeNumber = [[NBPhoneNumber alloc] init]; usTollFreeNumber.countryCode = @1; usTollFreeNumber.nationalNumber = @8002530000; return usTollFreeNumber; } - + - (NBPhoneNumber *)universalPremiumRateNumber { NBPhoneNumber *universalPremiumRateNumber = [[NBPhoneNumber alloc] init]; universalPremiumRateNumber.countryCode = @979; @@ -256,19 +280,19 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat // Numbers to test the formatting rules from Mexico. - (NBPhoneNumber *)mxMobile1 { - // Note that this is the same as the example number for DE in the metadata. - NBPhoneNumber *number = [[NBPhoneNumber alloc] init]; - number.countryCode = @52; - number.nationalNumber = @12345678900; - return number; + // Note that this is the same as the example number for DE in the metadata. + NBPhoneNumber *number = [[NBPhoneNumber alloc] init]; + number.countryCode = @52; + number.nationalNumber = @12345678900; + return number; } - (NBPhoneNumber *)mxMobile2 { - // Note that this is the same as the example number for DE in the metadata. - NBPhoneNumber *number = [[NBPhoneNumber alloc] init]; - number.countryCode = @52; - number.nationalNumber = @15512345678; - return number; + // Note that this is the same as the example number for DE in the metadata. + NBPhoneNumber *number = [[NBPhoneNumber alloc] init]; + number.countryCode = @52; + number.nationalNumber = @15512345678; + return number; } - (NBPhoneNumber *)mxNumber { @@ -313,7 +337,7 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat XCTAssertNil([self.helper getMetadataForRegion:NULL]); XCTAssertNil([self.helper getMetadataForRegion:@""]); XCTAssertNotNil([self.helper getMetadataForRegion:@" AU"]); - XCTAssertNotNil( [self.helper getMetadataForRegion:@" JP "]); + XCTAssertNotNil([self.helper getMetadataForRegion:@" JP "]); } - (void)testNSDictionaryableKey { @@ -324,14 +348,14 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat NBPhoneNumber *myNumber3 = [_aUtil parse:@"12423570000" defaultRegion:@"BS" error:&anError]; NBPhoneNumber *myNumber4 = [_aUtil parse:@"39236618300" defaultRegion:@"IT" error:&anError]; NBPhoneNumber *myNumber5 = [_aUtil parse:@"16502530000" defaultRegion:@"US" error:&anError]; - + NSMutableDictionary *dicTest = [[NSMutableDictionary alloc] init]; [dicTest setObject:@"AE" forKey:myNumber1]; [dicTest setObject:@"AR" forKey:myNumber2]; [dicTest setObject:@"BS" forKey:myNumber3]; [dicTest setObject:@"IT" forKey:myNumber4]; [dicTest setObject:@"US" forKey:myNumber5]; - + XCTAssertEqualObjects(@"AE", [dicTest objectForKey:myNumber1]); XCTAssertEqualObjects(@"AR", [dicTest objectForKey:myNumber2]); XCTAssertEqualObjects(@"BS", [dicTest objectForKey:myNumber3]); @@ -340,36 +364,42 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat } - (void)testGetInstanceLoadUSMetadata { - NBPhoneMetaData *metadata = [self.helper getMetadataForRegion:@"US"]; - + XCTAssertEqualObjects(@"US", metadata.codeID); XCTAssertEqualObjects(@1, metadata.countryCode); XCTAssertEqualObjects(@"011", metadata.internationalPrefix); XCTAssertTrue(metadata.nationalPrefix != nil); XCTAssertEqual(2, (int)[metadata.numberFormats count]); - XCTAssertEqualObjects(@"(\\d{3})(\\d{3})(\\d{4})", ((NBNumberFormat*)metadata.numberFormats[1]).pattern); - XCTAssertEqualObjects(@"$1 $2 $3", ((NBNumberFormat*)metadata.numberFormats[1]).format); - XCTAssertEqualObjects(@"[13-689]\\d{9}|2[0-35-9]\\d{8}", metadata.generalDesc.nationalNumberPattern); - XCTAssertEqualObjects(@"[13-689]\\d{9}|2[0-35-9]\\d{8}", metadata.fixedLine.nationalNumberPattern); + XCTAssertEqualObjects(@"(\\d{3})(\\d{3})(\\d{4})", + ((NBNumberFormat *)metadata.numberFormats[1]).pattern); + XCTAssertEqualObjects(@"$1 $2 $3", ((NBNumberFormat *)metadata.numberFormats[1]).format); + XCTAssertEqualObjects(@"[13-689]\\d{9}|2[0-35-9]\\d{8}", + metadata.generalDesc.nationalNumberPattern); + XCTAssertEqualObjects(@"[13-689]\\d{9}|2[0-35-9]\\d{8}", + metadata.fixedLine.nationalNumberPattern); XCTAssertEqualObjects(@"900\\d{7}", metadata.premiumRate.nationalNumberPattern); // No shared-cost data is available, so its national number data should not be // set. XCTAssertFalse([metadata.sharedCost nationalNumberPattern] != nil); } --(void) testGetInstanceLoadDEMetadata { +- (void)testGetInstanceLoadDEMetadata { NBPhoneMetaData *metadata = [self.helper getMetadataForRegion:@"DE"]; XCTAssertEqualObjects(@"DE", metadata.codeID); XCTAssertEqualObjects(@49, metadata.countryCode); XCTAssertEqualObjects(@"00", metadata.internationalPrefix); XCTAssertEqualObjects(@"0", metadata.nationalPrefix); XCTAssertEqual(6, (int)[metadata.numberFormats count]); - XCTAssertEqual(1, (int)[((NBNumberFormat*)metadata.numberFormats[5]).leadingDigitsPatterns count]); - XCTAssertEqualObjects(@"900", ((NBNumberFormat*)metadata.numberFormats[5]).leadingDigitsPatterns[0]); - XCTAssertEqualObjects(@"(\\d{3})(\\d{3,4})(\\d{4})", ((NBNumberFormat*)metadata.numberFormats[5]).pattern); - XCTAssertEqualObjects(@"$1 $2 $3", ((NBNumberFormat*)metadata.numberFormats[5]).format); - XCTAssertEqualObjects(@"(?:[24-6]\\d{2}|3[03-9]\\d|[789](?:0[2-9]|[1-9]\\d))\\d{1,8}", metadata.fixedLine.nationalNumberPattern); + XCTAssertEqual(1, + (int)[((NBNumberFormat *)metadata.numberFormats[5]).leadingDigitsPatterns count]); + XCTAssertEqualObjects(@"900", + ((NBNumberFormat *)metadata.numberFormats[5]).leadingDigitsPatterns[0]); + XCTAssertEqualObjects(@"(\\d{3})(\\d{3,4})(\\d{4})", + ((NBNumberFormat *)metadata.numberFormats[5]).pattern); + XCTAssertEqualObjects(@"$1 $2 $3", ((NBNumberFormat *)metadata.numberFormats[5]).format); + XCTAssertEqualObjects(@"(?:[24-6]\\d{2}|3[03-9]\\d|[789](?:0[2-9]|[1-9]\\d))\\d{1,8}", + metadata.fixedLine.nationalNumberPattern); XCTAssertEqualObjects(@"30123456", metadata.fixedLine.exampleNumber); XCTAssertEqualObjects(@"900([135]\\d{6}|9\\d{7})", metadata.premiumRate.nationalNumberPattern); } @@ -382,18 +412,20 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat XCTAssertEqualObjects(@"0", metadata.nationalPrefix); XCTAssertEqualObjects(@"0(?:(11|343|3715)15)?", metadata.nationalPrefixForParsing); XCTAssertEqualObjects(@"9$1", metadata.nationalPrefixTransformRule); - XCTAssertEqualObjects(@"$2 15 $3-$4", ((NBNumberFormat*)metadata.numberFormats[2]).format); - XCTAssertEqualObjects(@"(9)(\\d{4})(\\d{2})(\\d{4})", ((NBNumberFormat*)metadata.numberFormats[3]).pattern); - XCTAssertEqualObjects(@"(9)(\\d{4})(\\d{2})(\\d{4})", ((NBNumberFormat*)metadata.intlNumberFormats[3]).pattern); - XCTAssertEqualObjects(@"$1 $2 $3 $4", ((NBNumberFormat*)metadata.intlNumberFormats[3]).format); + XCTAssertEqualObjects(@"$2 15 $3-$4", ((NBNumberFormat *)metadata.numberFormats[2]).format); + XCTAssertEqualObjects(@"(9)(\\d{4})(\\d{2})(\\d{4})", + ((NBNumberFormat *)metadata.numberFormats[3]).pattern); + XCTAssertEqualObjects(@"(9)(\\d{4})(\\d{2})(\\d{4})", + ((NBNumberFormat *)metadata.intlNumberFormats[3]).pattern); + XCTAssertEqualObjects(@"$1 $2 $3 $4", ((NBNumberFormat *)metadata.intlNumberFormats[3]).format); } - (void)testGetInstanceLoadInternationalTollFreeMetadata { NBPhoneMetaData *metadata = [self.helper getMetadataForNonGeographicalRegion:@800]; XCTAssertEqualObjects(@"001", metadata.codeID); XCTAssertEqualObjects(@800, metadata.countryCode); - XCTAssertEqualObjects(@"$1 $2", ((NBNumberFormat*)metadata.numberFormats[0]).format); - XCTAssertEqualObjects(@"(\\d{4})(\\d{4})", ((NBNumberFormat*)metadata.numberFormats[0]).pattern); + XCTAssertEqualObjects(@"$1 $2", ((NBNumberFormat *)metadata.numberFormats[0]).format); + XCTAssertEqualObjects(@"(\\d{4})(\\d{4})", ((NBNumberFormat *)metadata.numberFormats[0]).pattern); XCTAssertEqual(0, metadata.generalDesc.possibleLengthLocalOnly.count); XCTAssertEqual(1, metadata.generalDesc.possibleLength.count); XCTAssertEqualObjects(@"12345678", metadata.tollFree.exampleNumber); @@ -419,32 +451,32 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat - (void)testgetLengthOfGeographicalAreaCode { // Google MTV, which has area code '650'. XCTAssertEqual(3, [_aUtil getLengthOfGeographicalAreaCode:self.usNumber]); - + // A North America toll-free number, which has no area code. XCTAssertEqual(0, [_aUtil getLengthOfGeographicalAreaCode:self.usTollFreeNumber]); - + // Google London, which has area code '20'. XCTAssertEqual(2, [_aUtil getLengthOfGeographicalAreaCode:self.gbNumber]); - + // A UK mobile phone, which has no area code. XCTAssertEqual(0, [_aUtil getLengthOfGeographicalAreaCode:self.gbMobile]); - + // Google Buenos Aires, which has area code '11'. XCTAssertEqual(2, [_aUtil getLengthOfGeographicalAreaCode:self.arNumber]); - + // Google Sydney, which has area code '2'. XCTAssertEqual(1, [_aUtil getLengthOfGeographicalAreaCode:self.auNumber]); - + // Italian numbers - there is no national prefix, but it still has an area // code. XCTAssertEqual(2, [_aUtil getLengthOfGeographicalAreaCode:self.itNumber]); - + // Google Singapore. Singapore has no area code and no national prefix. XCTAssertEqual(0, [_aUtil getLengthOfGeographicalAreaCode:self.sgNumber]); - + // An invalid US number (1 digit shorter), which has no area code. XCTAssertEqual(0, [_aUtil getLengthOfGeographicalAreaCode:self.usShortByOneNumber]); - + // An international toll free number, which has no area code. XCTAssertEqual(0, [_aUtil getLengthOfGeographicalAreaCode:self.internationalTollFreeNumber]); } @@ -452,40 +484,39 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat - (void)testGetLengthOfNationalDestinationCode { // Google MTV, which has national destination code (NDC) '650'. XCTAssertEqual(3, [_aUtil getLengthOfNationalDestinationCode:self.usNumber]); - + // A North America toll-free number, which has NDC '800'. XCTAssertEqual(3, [_aUtil getLengthOfNationalDestinationCode:self.usTollFreeNumber]); - + // Google London, which has NDC '20'. XCTAssertEqual(2, [_aUtil getLengthOfNationalDestinationCode:self.gbNumber]); - + // A UK mobile phone, which has NDC '7912'. XCTAssertEqual(4, [_aUtil getLengthOfNationalDestinationCode:self.gbMobile]); - + // Google Buenos Aires, which has NDC '11'. XCTAssertEqual(2, [_aUtil getLengthOfNationalDestinationCode:self.arNumber]); - + // An Argentinian mobile which has NDC '911'. XCTAssertEqual(3, [_aUtil getLengthOfNationalDestinationCode:self.arMobile]); - + // Google Sydney, which has NDC '2'. XCTAssertEqual(1, [_aUtil getLengthOfNationalDestinationCode:self.auNumber]); - + // Google Singapore, which has NDC '6521'. XCTAssertEqual(4, [_aUtil getLengthOfNationalDestinationCode:self.sgNumber]); - + // An invalid US number (1 digit shorter), which has no NDC. - XCTAssertEqual(0, - [_aUtil getLengthOfNationalDestinationCode:self.usShortByOneNumber]); - + XCTAssertEqual(0, [_aUtil getLengthOfNationalDestinationCode:self.usShortByOneNumber]); + // A number containing an invalid country calling code, which shouldn't have // any NDC. - + NBPhoneNumber *number = [[NBPhoneNumber alloc] init]; [number setCountryCode:@123]; [number setNationalNumber:@6502530000]; XCTAssertEqual(0, [_aUtil getLengthOfNationalDestinationCode:number]); - + // An international toll free number, which has NDC '1234'. XCTAssertEqual(4, [_aUtil getLengthOfNationalDestinationCode:self.internationalTollFreeNumber]); } @@ -499,25 +530,31 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat - (void)testGetNationalSignificantNumber { XCTAssertEqualObjects(@"6502530000", [_aUtil getNationalSignificantNumber:self.usNumber]); - + // An Italian mobile number. XCTAssertEqualObjects(@"345678901", [_aUtil getNationalSignificantNumber:self.itMobile]); - + // An Italian fixed line number. XCTAssertEqualObjects(@"0236618300", [_aUtil getNationalSignificantNumber:self.itNumber]); - - XCTAssertEqualObjects(@"12345678", [_aUtil getNationalSignificantNumber:self.internationalTollFreeNumber]); + + XCTAssertEqualObjects(@"12345678", + [_aUtil getNationalSignificantNumber:self.internationalTollFreeNumber]); } - (void)testGetExampleNumber { XCTAssertTrue([self.deNumber isEqual:[_aUtil getExampleNumber:@"DE" error:nil]]); - - XCTAssertTrue([self.deNumber isEqual:[_aUtil getExampleNumberForType:@"DE" type:NBEPhoneNumberTypeFIXED_LINE error:nil]]); - XCTAssertTrue([self.deNumber isEqual:[_aUtil getExampleNumberForType:@"DE" type:NBEPhoneNumberTypeFIXED_LINE_OR_MOBILE error:nil]]); + + XCTAssertTrue([self.deNumber + isEqual:[_aUtil getExampleNumberForType:@"DE" type:NBEPhoneNumberTypeFIXED_LINE error:nil]]); + XCTAssertTrue( + [self.deNumber isEqual:[_aUtil getExampleNumberForType:@"DE" + type:NBEPhoneNumberTypeFIXED_LINE_OR_MOBILE + error:nil]]); // For the US, the example number is placed under general description, and // hence should be used for both fixed line and mobile, so neither of these // should return nil. - XCTAssertNotNil([_aUtil getExampleNumberForType:@"US" type:NBEPhoneNumberTypeFIXED_LINE error:nil]); + XCTAssertNotNil( + [_aUtil getExampleNumberForType:@"US" type:NBEPhoneNumberTypeFIXED_LINE error:nil]); XCTAssertNotNil([_aUtil getExampleNumberForType:@"US" type:NBEPhoneNumberTypeMOBILE error:nil]); // CS is an invalid region, so we have no data for it. XCTAssertNil([_aUtil getExampleNumberForType:@"CS" type:NBEPhoneNumberTypeMOBILE error:nil]); @@ -527,14 +564,16 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat } - (void)testexampleNumberForNonGeoEntity { - XCTAssertTrue([self.internationalTollFreeNumber isEqual:[_aUtil getExampleNumberForNonGeoEntity:@800 error:nil]]); - XCTAssertTrue([self.universalPremiumRateNumber isEqual:[_aUtil getExampleNumberForNonGeoEntity:@979 error:nil]]); + XCTAssertTrue([self.internationalTollFreeNumber + isEqual:[_aUtil getExampleNumberForNonGeoEntity:@800 error:nil]]); + XCTAssertTrue([self.universalPremiumRateNumber + isEqual:[_aUtil getExampleNumberForNonGeoEntity:@979 error:nil]]); } - (void)testConvertAlphaCharactersInNumber { NSString *input = @"1800-ABC-DEF"; // Alpha chars are converted to digits; everything else is left untouched. - + NSString *expectedOutput = @"1800-222-333"; XCTAssertEqualObjects(expectedOutput, [_aUtil convertAlphaCharactersInNumber:input]); } @@ -542,45 +581,58 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat - (void)testNormaliseRemovePunctuation { NSString *inputNumber = @"034-56&+#2\u00AD34"; NSString *expectedOutput = @"03456234"; - XCTAssertEqualObjects(expectedOutput, [_aUtil normalize:inputNumber], @"Conversion did not correctly remove punctuation"); + XCTAssertEqualObjects(expectedOutput, [_aUtil normalize:inputNumber], + @"Conversion did not correctly remove punctuation"); } - (void)testNormaliseReplaceAlphaCharacters { NSString *inputNumber = @"034-I-am-HUNGRY"; NSString *expectedOutput = @"034426486479"; - XCTAssertEqualObjects(expectedOutput, [_aUtil normalize:inputNumber], @"Conversion did not correctly replace alpha characters"); + XCTAssertEqualObjects(expectedOutput, [_aUtil normalize:inputNumber], + @"Conversion did not correctly replace alpha characters"); } - (void)testNormaliseOtherDigits { NSString *inputNumber = @"\uFF125\u0665"; NSString *expectedOutput = @"255"; - XCTAssertEqualObjects(expectedOutput, [_aUtil normalize:inputNumber], @"Conversion did not correctly replace non-latin digits"); + XCTAssertEqualObjects(expectedOutput, [_aUtil normalize:inputNumber], + @"Conversion did not correctly replace non-latin digits"); // Eastern-Arabic digits. inputNumber = @"\u06F52\u06F0"; expectedOutput = @"520"; - XCTAssertEqualObjects(expectedOutput, [_aUtil normalize:inputNumber], @"Conversion did not correctly replace non-latin digits"); + XCTAssertEqualObjects(expectedOutput, [_aUtil normalize:inputNumber], + @"Conversion did not correctly replace non-latin digits"); } - (void)testNormaliseStripAlphaCharacters { NSString *inputNumber = @"034-56&+a#234"; NSString *expectedOutput = @"03456234"; - XCTAssertEqualObjects(expectedOutput, [_aUtil normalizeDigitsOnly:inputNumber], @"Conversion did not correctly remove alpha character"); + XCTAssertEqualObjects(expectedOutput, [_aUtil normalizeDigitsOnly:inputNumber], + @"Conversion did not correctly remove alpha character"); } - (void)testNormalizeStripNonDiallableCharacters { NSString *inputNumber = @"03*4-56&+1a#234"; NSString *expectedOutput = @"03*456+1#234"; - XCTAssertEqualObjects(expectedOutput, [_aUtil normalizeDiallableCharsOnly:inputNumber], @"Conversion did not correctly remove non-diallable characters"); + XCTAssertEqualObjects(expectedOutput, [_aUtil normalizeDiallableCharsOnly:inputNumber], + @"Conversion did not correctly remove non-diallable characters"); } - (void)testFormatUSNumber { - XCTAssertEqualObjects(@"650 253 0000", [_aUtil format:self.usNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); - XCTAssertEqualObjects(@"+1 650 253 0000", [_aUtil format:self.usNumber numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); - XCTAssertEqualObjects(@"800 253 0000", [_aUtil format:self.usTollFreeNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); - XCTAssertEqualObjects(@"+1 800 253 0000", [_aUtil format:self.usTollFreeNumber numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); - XCTAssertEqualObjects(@"900 253 0000", [_aUtil format:self.usPremiumNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); - XCTAssertEqualObjects(@"+1 900 253 0000", [_aUtil format:self.usPremiumNumber numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); - XCTAssertEqualObjects(@"tel:+1-900-253-0000", [_aUtil format:self.usPremiumNumber numberFormat:NBEPhoneNumberFormatRFC3966]); + XCTAssertEqualObjects(@"650 253 0000", + [_aUtil format:self.usNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); + XCTAssertEqualObjects(@"+1 650 253 0000", [_aUtil format:self.usNumber + numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); + XCTAssertEqualObjects(@"800 253 0000", [_aUtil format:self.usTollFreeNumber + numberFormat:NBEPhoneNumberFormatNATIONAL]); + XCTAssertEqualObjects(@"+1 800 253 0000", [_aUtil format:self.usTollFreeNumber + numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); + XCTAssertEqualObjects(@"900 253 0000", [_aUtil format:self.usPremiumNumber + numberFormat:NBEPhoneNumberFormatNATIONAL]); + XCTAssertEqualObjects(@"+1 900 253 0000", [_aUtil format:self.usPremiumNumber + numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); + XCTAssertEqualObjects(@"tel:+1-900-253-0000", [_aUtil format:self.usPremiumNumber + numberFormat:NBEPhoneNumberFormatRFC3966]); // Numbers with all zeros in the national number part will be formatted by // using the raw_input if that is available no matter which format is // specified. @@ -588,9 +640,10 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat usSpoofWithRawInput.countryCode = @1; usSpoofWithRawInput.nationalNumber = @0; usSpoofWithRawInput.rawInput = @"000-000-0000"; - - XCTAssertEqualObjects(@"000-000-0000", [_aUtil format:usSpoofWithRawInput numberFormat:NBEPhoneNumberFormatNATIONAL]); - + + XCTAssertEqualObjects(@"000-000-0000", [_aUtil format:usSpoofWithRawInput + numberFormat:NBEPhoneNumberFormatNATIONAL]); + NBPhoneNumber *usSpoof = [[NBPhoneNumber alloc] init]; usSpoof.countryCode = @1; usSpoof.nationalNumber = @0; @@ -598,155 +651,232 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat } - (void)testFormatBSNumber { - XCTAssertEqualObjects(@"242 365 1234", [_aUtil format:self.bsNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); - XCTAssertEqualObjects(@"+1 242 365 1234", [_aUtil format:self.bsNumber numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); + XCTAssertEqualObjects(@"242 365 1234", + [_aUtil format:self.bsNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); + XCTAssertEqualObjects(@"+1 242 365 1234", [_aUtil format:self.bsNumber + numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); } - (void)testFormatGBNumber { NBPhoneNumber *gbNumber = self.gbNumber; - XCTAssertEqualObjects(@"(020) 7031 3000", [_aUtil format:gbNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); - XCTAssertEqualObjects(@"+44 20 7031 3000", [_aUtil format:gbNumber numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); - XCTAssertEqualObjects(@"(07912) 345 678", [_aUtil format:self.gbMobile numberFormat:NBEPhoneNumberFormatNATIONAL]); - XCTAssertEqualObjects(@"+44 7912 345 678", [_aUtil format:self.gbMobile numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); + XCTAssertEqualObjects(@"(020) 7031 3000", + [_aUtil format:gbNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); + XCTAssertEqualObjects(@"+44 20 7031 3000", + [_aUtil format:gbNumber numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); + XCTAssertEqualObjects(@"(07912) 345 678", + [_aUtil format:self.gbMobile numberFormat:NBEPhoneNumberFormatNATIONAL]); + XCTAssertEqualObjects(@"+44 7912 345 678", [_aUtil format:self.gbMobile + numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); } - (void)testFormatDENumber { id deNumber = [[NBPhoneNumber alloc] init]; [deNumber setCountryCode:@49]; [deNumber setNationalNumber:@301234]; - XCTAssertEqualObjects(@"030/1234", [_aUtil format:deNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); - XCTAssertEqualObjects(@"+49 30/1234", [_aUtil format:deNumber numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); - XCTAssertEqualObjects(@"tel:+49-30-1234", [_aUtil format:deNumber numberFormat:NBEPhoneNumberFormatRFC3966]); - + XCTAssertEqualObjects(@"030/1234", + [_aUtil format:deNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); + XCTAssertEqualObjects(@"+49 30/1234", + [_aUtil format:deNumber numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); + XCTAssertEqualObjects(@"tel:+49-30-1234", + [_aUtil format:deNumber numberFormat:NBEPhoneNumberFormatRFC3966]); + deNumber = [[NBPhoneNumber alloc] init]; [deNumber setCountryCode:@49]; [deNumber setNationalNumber:@291123]; - XCTAssertEqualObjects(@"0291 123", [_aUtil format:deNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); - XCTAssertEqualObjects(@"+49 291 123", [_aUtil format:deNumber numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); - + XCTAssertEqualObjects(@"0291 123", + [_aUtil format:deNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); + XCTAssertEqualObjects(@"+49 291 123", + [_aUtil format:deNumber numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); + deNumber = [[NBPhoneNumber alloc] init]; [deNumber setCountryCode:@49]; [deNumber setNationalNumber:@29112345678]; - XCTAssertEqualObjects(@"0291 12345678", [_aUtil format:deNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); - XCTAssertEqualObjects(@"+49 291 12345678", [_aUtil format:deNumber numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); - + XCTAssertEqualObjects(@"0291 12345678", + [_aUtil format:deNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); + XCTAssertEqualObjects(@"+49 291 12345678", + [_aUtil format:deNumber numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); + deNumber = [[NBPhoneNumber alloc] init]; [deNumber setCountryCode:@49]; [deNumber setNationalNumber:@912312345]; - XCTAssertEqualObjects(@"09123 12345", [_aUtil format:deNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); - XCTAssertEqualObjects(@"+49 9123 12345", [_aUtil format:deNumber numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); - + XCTAssertEqualObjects(@"09123 12345", + [_aUtil format:deNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); + XCTAssertEqualObjects(@"+49 9123 12345", + [_aUtil format:deNumber numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); + deNumber = [[NBPhoneNumber alloc] init]; [deNumber setCountryCode:@49]; [deNumber setNationalNumber:@80212345]; - XCTAssertEqualObjects(@"08021 2345", [_aUtil format:deNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); - XCTAssertEqualObjects(@"+49 8021 2345", [_aUtil format:deNumber numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); - + XCTAssertEqualObjects(@"08021 2345", + [_aUtil format:deNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); + XCTAssertEqualObjects(@"+49 8021 2345", + [_aUtil format:deNumber numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); + // Note this number is correctly formatted without national prefix. Most of // the numbers that are treated as invalid numbers by the library are short // numbers, and they are usually not dialed with national prefix. - XCTAssertEqualObjects(@"1234", [_aUtil format:self.deShortNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); - XCTAssertEqualObjects(@"+49 1234", [_aUtil format:self.deShortNumber numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); - + XCTAssertEqualObjects( + @"1234", [_aUtil format:self.deShortNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); + XCTAssertEqualObjects(@"+49 1234", [_aUtil format:self.deShortNumber + numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); + deNumber = [[NBPhoneNumber alloc] init]; [deNumber setCountryCode:@49]; [deNumber setNationalNumber:@41341234]; - XCTAssertEqualObjects(@"04134 1234", [_aUtil format:deNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); + XCTAssertEqualObjects(@"04134 1234", + [_aUtil format:deNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); } - (void)testFormatITNumber { - XCTAssertEqualObjects(@"02 3661 8300", [_aUtil format:self.itNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); - XCTAssertEqualObjects(@"+39 02 3661 8300", [_aUtil format:self.itNumber numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); - XCTAssertEqualObjects(@"+390236618300", [_aUtil format:self.itNumber numberFormat:NBEPhoneNumberFormatE164]); - XCTAssertEqualObjects(@"345 678 901", [_aUtil format:self.itMobile numberFormat:NBEPhoneNumberFormatNATIONAL]); - XCTAssertEqualObjects(@"+39 345 678 901", [_aUtil format:self.itMobile numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); - XCTAssertEqualObjects(@"+39345678901", [_aUtil format:self.itMobile numberFormat:NBEPhoneNumberFormatE164]); + XCTAssertEqualObjects(@"02 3661 8300", + [_aUtil format:self.itNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); + XCTAssertEqualObjects(@"+39 02 3661 8300", [_aUtil format:self.itNumber + numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); + XCTAssertEqualObjects(@"+390236618300", + [_aUtil format:self.itNumber numberFormat:NBEPhoneNumberFormatE164]); + XCTAssertEqualObjects(@"345 678 901", + [_aUtil format:self.itMobile numberFormat:NBEPhoneNumberFormatNATIONAL]); + XCTAssertEqualObjects(@"+39 345 678 901", [_aUtil format:self.itMobile + numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); + XCTAssertEqualObjects(@"+39345678901", + [_aUtil format:self.itMobile numberFormat:NBEPhoneNumberFormatE164]); } - (void)testFormatAUNumber { - XCTAssertEqualObjects(@"02 3661 8300", [_aUtil format:self.auNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); - XCTAssertEqualObjects(@"+61 2 3661 8300", [_aUtil format:self.auNumber numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); - XCTAssertEqualObjects(@"+61236618300", [_aUtil format:self.auNumber numberFormat:NBEPhoneNumberFormatE164]); - + XCTAssertEqualObjects(@"02 3661 8300", + [_aUtil format:self.auNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); + XCTAssertEqualObjects(@"+61 2 3661 8300", [_aUtil format:self.auNumber + numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); + XCTAssertEqualObjects(@"+61236618300", + [_aUtil format:self.auNumber numberFormat:NBEPhoneNumberFormatE164]); + id auNumber = [[NBPhoneNumber alloc] init]; [auNumber setCountryCode:@61]; [auNumber setNationalNumber:@1800123456]; - XCTAssertEqualObjects(@"1800 123 456", [_aUtil format:auNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); - XCTAssertEqualObjects(@"+61 1800 123 456", [_aUtil format:auNumber numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); - XCTAssertEqualObjects(@"+611800123456", [_aUtil format:auNumber numberFormat:NBEPhoneNumberFormatE164]); + XCTAssertEqualObjects(@"1800 123 456", + [_aUtil format:auNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); + XCTAssertEqualObjects(@"+61 1800 123 456", + [_aUtil format:auNumber numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); + XCTAssertEqualObjects(@"+611800123456", + [_aUtil format:auNumber numberFormat:NBEPhoneNumberFormatE164]); } - (void)testFormatARNumber { - XCTAssertEqualObjects(@"011 8765-4321", [_aUtil format:self.arNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); - XCTAssertEqualObjects(@"+54 11 8765-4321", [_aUtil format:self.arNumber numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); - XCTAssertEqualObjects(@"+541187654321", [_aUtil format:self.arNumber numberFormat:NBEPhoneNumberFormatE164]); - XCTAssertEqualObjects(@"011 15 8765-4321", [_aUtil format:self.arMobile numberFormat:NBEPhoneNumberFormatNATIONAL]); - XCTAssertEqualObjects(@"+54 9 11 8765 4321", [_aUtil format:self.arMobile numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); - XCTAssertEqualObjects(@"+5491187654321", [_aUtil format:self.arMobile numberFormat:NBEPhoneNumberFormatE164]); + XCTAssertEqualObjects(@"011 8765-4321", + [_aUtil format:self.arNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); + XCTAssertEqualObjects(@"+54 11 8765-4321", [_aUtil format:self.arNumber + numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); + XCTAssertEqualObjects(@"+541187654321", + [_aUtil format:self.arNumber numberFormat:NBEPhoneNumberFormatE164]); + XCTAssertEqualObjects(@"011 15 8765-4321", + [_aUtil format:self.arMobile numberFormat:NBEPhoneNumberFormatNATIONAL]); + XCTAssertEqualObjects(@"+54 9 11 8765 4321", [_aUtil format:self.arMobile + numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); + XCTAssertEqualObjects(@"+5491187654321", + [_aUtil format:self.arMobile numberFormat:NBEPhoneNumberFormatE164]); } - (void)testFormatMXNumber { NBPhoneNumber *mxMobile1 = [[NBPhoneNumber alloc] init]; mxMobile1.countryCode = @52; mxMobile1.nationalNumber = @12345678900; - XCTAssertEqualObjects(@"045 234 567 8900", [_aUtil format:mxMobile1 numberFormat:NBEPhoneNumberFormatNATIONAL]); - XCTAssertEqualObjects(@"+52 1 234 567 8900", [_aUtil format:mxMobile1 numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); - XCTAssertEqualObjects(@"+5212345678900", [_aUtil format:mxMobile1 numberFormat:NBEPhoneNumberFormatE164]); + XCTAssertEqualObjects(@"045 234 567 8900", + [_aUtil format:mxMobile1 numberFormat:NBEPhoneNumberFormatNATIONAL]); + XCTAssertEqualObjects(@"+52 1 234 567 8900", + [_aUtil format:mxMobile1 numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); + XCTAssertEqualObjects(@"+5212345678900", + [_aUtil format:mxMobile1 numberFormat:NBEPhoneNumberFormatE164]); NBPhoneNumber *mxMobile2 = [[NBPhoneNumber alloc] init]; mxMobile2.countryCode = @52; mxMobile2.nationalNumber = @15512345678; - XCTAssertEqualObjects(@"045 55 1234 5678", [_aUtil format:mxMobile2 numberFormat:NBEPhoneNumberFormatNATIONAL]); - XCTAssertEqualObjects(@"+52 1 55 1234 5678", [_aUtil format:mxMobile2 numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); - XCTAssertEqualObjects(@"+5215512345678", [_aUtil format:mxMobile2 numberFormat:NBEPhoneNumberFormatE164]); - XCTAssertEqualObjects(@"01 33 1234 5678", [_aUtil format:self.mxNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); - XCTAssertEqualObjects(@"+52 33 1234 5678", [_aUtil format:self.mxNumber numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); - XCTAssertEqualObjects(@"+523312345678", [_aUtil format:self.mxNumber numberFormat:NBEPhoneNumberFormatE164]); + XCTAssertEqualObjects(@"045 55 1234 5678", + [_aUtil format:mxMobile2 numberFormat:NBEPhoneNumberFormatNATIONAL]); + XCTAssertEqualObjects(@"+52 1 55 1234 5678", + [_aUtil format:mxMobile2 numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); + XCTAssertEqualObjects(@"+5215512345678", + [_aUtil format:mxMobile2 numberFormat:NBEPhoneNumberFormatE164]); + XCTAssertEqualObjects(@"01 33 1234 5678", + [_aUtil format:self.mxNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); + XCTAssertEqualObjects(@"+52 33 1234 5678", [_aUtil format:self.mxNumber + numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); + XCTAssertEqualObjects(@"+523312345678", + [_aUtil format:self.mxNumber numberFormat:NBEPhoneNumberFormatE164]); NBPhoneNumber *mxNumber2 = [[NBPhoneNumber alloc] init]; mxNumber2.countryCode = @52; mxNumber2.nationalNumber = @8211234567; - XCTAssertEqualObjects(@"01 821 123 4567", [_aUtil format:mxNumber2 numberFormat:NBEPhoneNumberFormatNATIONAL]); - XCTAssertEqualObjects(@"+52 821 123 4567", [_aUtil format:mxNumber2 numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); - XCTAssertEqualObjects(@"+528211234567", [_aUtil format:mxNumber2 numberFormat:NBEPhoneNumberFormatE164]); + XCTAssertEqualObjects(@"01 821 123 4567", + [_aUtil format:mxNumber2 numberFormat:NBEPhoneNumberFormatNATIONAL]); + XCTAssertEqualObjects(@"+52 821 123 4567", + [_aUtil format:mxNumber2 numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); + XCTAssertEqualObjects(@"+528211234567", + [_aUtil format:mxNumber2 numberFormat:NBEPhoneNumberFormatE164]); } - (void)testFormatOutOfCountryCallingNumber { - XCTAssertEqualObjects(@"00 1 900 253 0000", [_aUtil formatOutOfCountryCallingNumber:self.usPremiumNumber regionCallingFrom:@"DE"]); - XCTAssertEqualObjects(@"1 650 253 0000", [_aUtil formatOutOfCountryCallingNumber:self.usNumber regionCallingFrom:@"BS"]); - XCTAssertEqualObjects(@"00 1 650 253 0000", [_aUtil formatOutOfCountryCallingNumber:self.usNumber regionCallingFrom:@"PL"]); - XCTAssertEqualObjects(@"011 44 7912 345 678", [_aUtil formatOutOfCountryCallingNumber:self.gbMobile regionCallingFrom:@"US"]); - XCTAssertEqualObjects(@"00 49 1234", [_aUtil formatOutOfCountryCallingNumber:self.deShortNumber regionCallingFrom:@"GB"]); + XCTAssertEqualObjects( + @"00 1 900 253 0000", + [_aUtil formatOutOfCountryCallingNumber:self.usPremiumNumber regionCallingFrom:@"DE"]); + XCTAssertEqualObjects(@"1 650 253 0000", [_aUtil formatOutOfCountryCallingNumber:self.usNumber + regionCallingFrom:@"BS"]); + XCTAssertEqualObjects(@"00 1 650 253 0000", [_aUtil formatOutOfCountryCallingNumber:self.usNumber + regionCallingFrom:@"PL"]); + XCTAssertEqualObjects( + @"011 44 7912 345 678", + [_aUtil formatOutOfCountryCallingNumber:self.gbMobile regionCallingFrom:@"US"]); + XCTAssertEqualObjects(@"00 49 1234", [_aUtil formatOutOfCountryCallingNumber:self.deShortNumber + regionCallingFrom:@"GB"]); // Note this number is correctly formatted without national prefix. Most of // the numbers that are treated as invalid numbers by the library are short // numbers, and they are usually not dialed with national prefix. - XCTAssertEqualObjects(@"1234", [_aUtil formatOutOfCountryCallingNumber:self.deShortNumber regionCallingFrom:@"DE"]); - XCTAssertEqualObjects(@"011 39 02 3661 8300", [_aUtil formatOutOfCountryCallingNumber:self.itNumber regionCallingFrom:@"US"]); - XCTAssertEqualObjects(@"02 3661 8300", [_aUtil formatOutOfCountryCallingNumber:self.itNumber regionCallingFrom:@"IT"]); - XCTAssertEqualObjects(@"+39 02 3661 8300", [_aUtil formatOutOfCountryCallingNumber:self.itNumber regionCallingFrom:@"SG"]); - XCTAssertEqualObjects(@"6521 8000", [_aUtil formatOutOfCountryCallingNumber:self.sgNumber regionCallingFrom:@"SG"]); - XCTAssertEqualObjects(@"011 54 9 11 8765 4321", [_aUtil formatOutOfCountryCallingNumber:self.arMobile regionCallingFrom:@"US"]); - XCTAssertEqualObjects(@"011 800 1234 5678", [_aUtil formatOutOfCountryCallingNumber:self.internationalTollFreeNumber regionCallingFrom:@"US"]); - + XCTAssertEqualObjects( + @"1234", [_aUtil formatOutOfCountryCallingNumber:self.deShortNumber regionCallingFrom:@"DE"]); + XCTAssertEqualObjects( + @"011 39 02 3661 8300", + [_aUtil formatOutOfCountryCallingNumber:self.itNumber regionCallingFrom:@"US"]); + XCTAssertEqualObjects(@"02 3661 8300", [_aUtil formatOutOfCountryCallingNumber:self.itNumber + regionCallingFrom:@"IT"]); + XCTAssertEqualObjects(@"+39 02 3661 8300", [_aUtil formatOutOfCountryCallingNumber:self.itNumber + regionCallingFrom:@"SG"]); + XCTAssertEqualObjects( + @"6521 8000", [_aUtil formatOutOfCountryCallingNumber:self.sgNumber regionCallingFrom:@"SG"]); + XCTAssertEqualObjects( + @"011 54 9 11 8765 4321", + [_aUtil formatOutOfCountryCallingNumber:self.arMobile regionCallingFrom:@"US"]); + XCTAssertEqualObjects(@"011 800 1234 5678", + [_aUtil formatOutOfCountryCallingNumber:self.internationalTollFreeNumber + regionCallingFrom:@"US"]); + id arNumberWithExtn = self.arMobile; [arNumberWithExtn setExtension:@"1234"]; - XCTAssertEqualObjects(@"011 54 9 11 8765 4321 ext. 1234", [_aUtil formatOutOfCountryCallingNumber:arNumberWithExtn regionCallingFrom:@"US"]); - XCTAssertEqualObjects(@"0011 54 9 11 8765 4321 ext. 1234", [_aUtil formatOutOfCountryCallingNumber:arNumberWithExtn regionCallingFrom:@"AU"]); - XCTAssertEqualObjects(@"011 15 8765-4321 ext. 1234", [_aUtil formatOutOfCountryCallingNumber:arNumberWithExtn regionCallingFrom:@"AR"]); + XCTAssertEqualObjects( + @"011 54 9 11 8765 4321 ext. 1234", + [_aUtil formatOutOfCountryCallingNumber:arNumberWithExtn regionCallingFrom:@"US"]); + XCTAssertEqualObjects( + @"0011 54 9 11 8765 4321 ext. 1234", + [_aUtil formatOutOfCountryCallingNumber:arNumberWithExtn regionCallingFrom:@"AU"]); + XCTAssertEqualObjects( + @"011 15 8765-4321 ext. 1234", + [_aUtil formatOutOfCountryCallingNumber:arNumberWithExtn regionCallingFrom:@"AR"]); } - (void)testFormatOutOfCountryWithInvalidRegion { // AQ/Antarctica isn't a valid region code for phone number formatting, // so this falls back to intl formatting. - XCTAssertEqualObjects(@"+1 650 253 0000", [_aUtil formatOutOfCountryCallingNumber:self.usNumber regionCallingFrom:@"AQ"]); + XCTAssertEqualObjects(@"+1 650 253 0000", [_aUtil formatOutOfCountryCallingNumber:self.usNumber + regionCallingFrom:@"AQ"]); // For region code 001, the out-of-country format always turns into the // international format. - XCTAssertEqualObjects(@"+1 650 253 0000", [_aUtil formatOutOfCountryCallingNumber:self.usNumber regionCallingFrom:@"001"]); + XCTAssertEqualObjects(@"+1 650 253 0000", [_aUtil formatOutOfCountryCallingNumber:self.usNumber + regionCallingFrom:@"001"]); } - (void)testFormatOutOfCountryWithPreferredIntlPrefix { // This should use 0011, since that is the preferred international prefix // (both 0011 and 0012 are accepted as possible international prefixes in our // test metadta.) - XCTAssertEqualObjects(@"0011 39 02 3661 8300", [_aUtil formatOutOfCountryCallingNumber:self.itNumber regionCallingFrom:@"AU"]); + XCTAssertEqualObjects( + @"0011 39 02 3661 8300", + [_aUtil formatOutOfCountryCallingNumber:self.itNumber regionCallingFrom:@"AU"]); } - (void)testFormatOutOfCountryKeepingAlphaChars { @@ -754,390 +884,583 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat [alphaNumericNumber setCountryCode:@1]; [alphaNumericNumber setNationalNumber:@8007493524]; [alphaNumericNumber setRawInput:@"1800 six-flag"]; - XCTAssertEqualObjects(@"0011 1 800 SIX-FLAG", [_aUtil formatOutOfCountryKeepingAlphaChars:alphaNumericNumber regionCallingFrom:@"AU"]); - + XCTAssertEqualObjects( + @"0011 1 800 SIX-FLAG", + [_aUtil formatOutOfCountryKeepingAlphaChars:alphaNumericNumber regionCallingFrom:@"AU"]); + [alphaNumericNumber setRawInput:@"1-800-SIX-flag"]; - XCTAssertEqualObjects(@"0011 1 800-SIX-FLAG", [_aUtil formatOutOfCountryKeepingAlphaChars:alphaNumericNumber regionCallingFrom:@"AU"]); - + XCTAssertEqualObjects( + @"0011 1 800-SIX-FLAG", + [_aUtil formatOutOfCountryKeepingAlphaChars:alphaNumericNumber regionCallingFrom:@"AU"]); + [alphaNumericNumber setRawInput:@"Call us from UK: 00 1 800 SIX-flag"]; - XCTAssertEqualObjects(@"0011 1 800 SIX-FLAG", [_aUtil formatOutOfCountryKeepingAlphaChars:alphaNumericNumber regionCallingFrom:@"AU"]); - + XCTAssertEqualObjects( + @"0011 1 800 SIX-FLAG", + [_aUtil formatOutOfCountryKeepingAlphaChars:alphaNumericNumber regionCallingFrom:@"AU"]); + [alphaNumericNumber setRawInput:@"800 SIX-flag"]; - XCTAssertEqualObjects(@"0011 1 800 SIX-FLAG", [_aUtil formatOutOfCountryKeepingAlphaChars:alphaNumericNumber regionCallingFrom:@"AU"]); - + XCTAssertEqualObjects( + @"0011 1 800 SIX-FLAG", + [_aUtil formatOutOfCountryKeepingAlphaChars:alphaNumericNumber regionCallingFrom:@"AU"]); + // Formatting from within the NANPA region. - XCTAssertEqualObjects(@"1 800 SIX-FLAG", [_aUtil formatOutOfCountryKeepingAlphaChars:alphaNumericNumber regionCallingFrom:@"US"]); - XCTAssertEqualObjects(@"1 800 SIX-FLAG", [_aUtil formatOutOfCountryKeepingAlphaChars:alphaNumericNumber regionCallingFrom:@"BS"]); - + XCTAssertEqualObjects( + @"1 800 SIX-FLAG", + [_aUtil formatOutOfCountryKeepingAlphaChars:alphaNumericNumber regionCallingFrom:@"US"]); + XCTAssertEqualObjects( + @"1 800 SIX-FLAG", + [_aUtil formatOutOfCountryKeepingAlphaChars:alphaNumericNumber regionCallingFrom:@"BS"]); + // Testing that if the raw input doesn't exist, it is formatted using // formatOutOfCountryCallingNumber. [alphaNumericNumber setRawInput:nil]; - XCTAssertEqualObjects(@"00 1 800 749 3524", [_aUtil formatOutOfCountryKeepingAlphaChars:alphaNumericNumber regionCallingFrom:@"DE"]); - + XCTAssertEqualObjects( + @"00 1 800 749 3524", + [_aUtil formatOutOfCountryKeepingAlphaChars:alphaNumericNumber regionCallingFrom:@"DE"]); + // Testing AU alpha number formatted from Australia. [alphaNumericNumber setCountryCode:@61]; [alphaNumericNumber setNationalNumber:@827493524]; [alphaNumericNumber setRawInput:@"+61 82749-FLAG"]; // This number should have the national prefix fixed. - XCTAssertEqualObjects(@"082749-FLAG", [_aUtil formatOutOfCountryKeepingAlphaChars:alphaNumericNumber regionCallingFrom:@"AU"]); - + XCTAssertEqualObjects( + @"082749-FLAG", + [_aUtil formatOutOfCountryKeepingAlphaChars:alphaNumericNumber regionCallingFrom:@"AU"]); + [alphaNumericNumber setRawInput:@"082749-FLAG"]; - XCTAssertEqualObjects(@"082749-FLAG", [_aUtil formatOutOfCountryKeepingAlphaChars:alphaNumericNumber regionCallingFrom:@"AU"]); - + XCTAssertEqualObjects( + @"082749-FLAG", + [_aUtil formatOutOfCountryKeepingAlphaChars:alphaNumericNumber regionCallingFrom:@"AU"]); + [alphaNumericNumber setNationalNumber:@18007493524]; [alphaNumericNumber setRawInput:@"1-800-SIX-flag"]; // This number should not have the national prefix prefixed, in accordance // with the override for this specific formatting rule. - XCTAssertEqualObjects(@"1-800-SIX-FLAG", [_aUtil formatOutOfCountryKeepingAlphaChars:alphaNumericNumber regionCallingFrom:@"AU"]); - + XCTAssertEqualObjects( + @"1-800-SIX-FLAG", + [_aUtil formatOutOfCountryKeepingAlphaChars:alphaNumericNumber regionCallingFrom:@"AU"]); + // The metadata should not be permanently changed, since we copied it before // modifying patterns. Here we check this. [alphaNumericNumber setNationalNumber:@1800749352]; - XCTAssertEqualObjects(@"1800 749 352", [_aUtil formatOutOfCountryCallingNumber:alphaNumericNumber regionCallingFrom:@"AU"]); - + XCTAssertEqualObjects(@"1800 749 352", [_aUtil formatOutOfCountryCallingNumber:alphaNumericNumber + regionCallingFrom:@"AU"]); + // Testing a region with multiple international prefixes. - XCTAssertEqualObjects(@"+61 1-800-SIX-FLAG", [_aUtil formatOutOfCountryKeepingAlphaChars:alphaNumericNumber regionCallingFrom:@"SG"]); + XCTAssertEqualObjects( + @"+61 1-800-SIX-FLAG", + [_aUtil formatOutOfCountryKeepingAlphaChars:alphaNumericNumber regionCallingFrom:@"SG"]); // Testing the case of calling from a non-supported region. - XCTAssertEqualObjects(@"+61 1-800-SIX-FLAG", [_aUtil formatOutOfCountryKeepingAlphaChars:alphaNumericNumber regionCallingFrom:@"AQ"]); - + XCTAssertEqualObjects( + @"+61 1-800-SIX-FLAG", + [_aUtil formatOutOfCountryKeepingAlphaChars:alphaNumericNumber regionCallingFrom:@"AQ"]); + // Testing the case with an invalid country calling code. [alphaNumericNumber setCountryCode:0]; [alphaNumericNumber setNationalNumber:@18007493524]; [alphaNumericNumber setRawInput:@"1-800-SIX-flag"]; // Uses the raw input only. - XCTAssertEqualObjects(@"1-800-SIX-flag", [_aUtil formatOutOfCountryKeepingAlphaChars:alphaNumericNumber regionCallingFrom:@"DE"]); - + XCTAssertEqualObjects( + @"1-800-SIX-flag", + [_aUtil formatOutOfCountryKeepingAlphaChars:alphaNumericNumber regionCallingFrom:@"DE"]); + // Testing the case of an invalid alpha number. [alphaNumericNumber setCountryCode:@1]; [alphaNumericNumber setNationalNumber:@80749]; [alphaNumericNumber setRawInput:@"180-SIX"]; // No country-code stripping can be done. - XCTAssertEqualObjects(@"00 1 180-SIX", [_aUtil formatOutOfCountryKeepingAlphaChars:alphaNumericNumber regionCallingFrom:@"DE"]); - + XCTAssertEqualObjects( + @"00 1 180-SIX", + [_aUtil formatOutOfCountryKeepingAlphaChars:alphaNumericNumber regionCallingFrom:@"DE"]); + // Testing the case of calling from a non-supported region. [alphaNumericNumber setCountryCode:@1]; [alphaNumericNumber setNationalNumber:@80749]; [alphaNumericNumber setRawInput:@"180-SIX"]; // No country-code stripping can be done since the number is invalid. - XCTAssertEqualObjects(@"+1 180-SIX", [_aUtil formatOutOfCountryKeepingAlphaChars:alphaNumericNumber regionCallingFrom:@"AQ"]); + XCTAssertEqualObjects( + @"+1 180-SIX", + [_aUtil formatOutOfCountryKeepingAlphaChars:alphaNumericNumber regionCallingFrom:@"AQ"]); } - (void)testFormatWithCarrierCod { // We only support this for AR in our test metadata, and only for mobile // numbers starting with certain values. - + NBPhoneNumber *arMobile = [[NBPhoneNumber alloc] init]; [arMobile setCountryCode:@54]; [arMobile setNationalNumber:@92234654321]; - XCTAssertEqualObjects(@"02234 65-4321", [_aUtil format:arMobile numberFormat:NBEPhoneNumberFormatNATIONAL]); + XCTAssertEqualObjects(@"02234 65-4321", + [_aUtil format:arMobile numberFormat:NBEPhoneNumberFormatNATIONAL]); // Here we force 14 as the carrier code. - XCTAssertEqualObjects(@"02234 14 65-4321", [_aUtil formatNationalNumberWithCarrierCode:arMobile carrierCode:@"14"]); + XCTAssertEqualObjects(@"02234 14 65-4321", + [_aUtil formatNationalNumberWithCarrierCode:arMobile carrierCode:@"14"]); // Here we force the number to be shown with no carrier code. - XCTAssertEqualObjects(@"02234 65-4321", [_aUtil formatNationalNumberWithCarrierCode:arMobile carrierCode:@""]); + XCTAssertEqualObjects(@"02234 65-4321", + [_aUtil formatNationalNumberWithCarrierCode:arMobile carrierCode:@""]); // Here the international rule is used, so no carrier code should be present. - XCTAssertEqualObjects(@"+5492234654321", [_aUtil format:arMobile numberFormat:NBEPhoneNumberFormatE164]); + XCTAssertEqualObjects(@"+5492234654321", + [_aUtil format:arMobile numberFormat:NBEPhoneNumberFormatE164]); // We don't support this for the US so there should be no change. - XCTAssertEqualObjects(@"650 253 0000", [_aUtil formatNationalNumberWithCarrierCode:self.usNumber carrierCode:@"15"]); + XCTAssertEqualObjects(@"650 253 0000", [_aUtil formatNationalNumberWithCarrierCode:self.usNumber + carrierCode:@"15"]); // Invalid country code should just get the NSN. - XCTAssertEqualObjects(@"12345", [_aUtil formatNationalNumberWithCarrierCode:self.unknownCountryCodeNoRawInput carrierCode:@"89"]); + XCTAssertEqualObjects( + @"12345", [_aUtil formatNationalNumberWithCarrierCode:self.unknownCountryCodeNoRawInput + carrierCode:@"89"]); } - (void)testFormatWithPreferredCarrierCode { // We only support this for AR in our test metadata. - + NBPhoneNumber *arNumber = [[NBPhoneNumber alloc] init]; [arNumber setCountryCode:@54]; [arNumber setNationalNumber:@91234125678]; // Test formatting with no preferred carrier code stored in the number itself. - XCTAssertEqualObjects(@"01234 15 12-5678", [_aUtil formatNationalNumberWithPreferredCarrierCode:arNumber fallbackCarrierCode:@"15"]); - XCTAssertEqualObjects(@"01234 12-5678", [_aUtil formatNationalNumberWithPreferredCarrierCode:arNumber fallbackCarrierCode:@""]); + XCTAssertEqualObjects( + @"01234 15 12-5678", + [_aUtil formatNationalNumberWithPreferredCarrierCode:arNumber fallbackCarrierCode:@"15"]); + XCTAssertEqualObjects( + @"01234 12-5678", + [_aUtil formatNationalNumberWithPreferredCarrierCode:arNumber fallbackCarrierCode:@""]); // Test formatting with preferred carrier code present. [arNumber setPreferredDomesticCarrierCode:@"19"]; - XCTAssertEqualObjects(@"01234 12-5678", [_aUtil format:arNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); - XCTAssertEqualObjects(@"01234 19 12-5678", [_aUtil formatNationalNumberWithPreferredCarrierCode:arNumber fallbackCarrierCode:@"15"]); - XCTAssertEqualObjects(@"01234 19 12-5678", [_aUtil formatNationalNumberWithPreferredCarrierCode:arNumber fallbackCarrierCode:@""]); + XCTAssertEqualObjects(@"01234 12-5678", + [_aUtil format:arNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); + XCTAssertEqualObjects( + @"01234 19 12-5678", + [_aUtil formatNationalNumberWithPreferredCarrierCode:arNumber fallbackCarrierCode:@"15"]); + XCTAssertEqualObjects( + @"01234 19 12-5678", + [_aUtil formatNationalNumberWithPreferredCarrierCode:arNumber fallbackCarrierCode:@""]); // When the preferred_domestic_carrier_code is present (even when it contains // an empty string), use it instead of the default carrier code passed in. [arNumber setPreferredDomesticCarrierCode:@""]; - XCTAssertEqualObjects(@"01234 12-5678", [_aUtil formatNationalNumberWithPreferredCarrierCode:arNumber fallbackCarrierCode:@"15"]); + XCTAssertEqualObjects( + @"01234 12-5678", + [_aUtil formatNationalNumberWithPreferredCarrierCode:arNumber fallbackCarrierCode:@"15"]); // We don't support this for the US so there should be no change. - + NBPhoneNumber *usNumber = [[NBPhoneNumber alloc] init]; [usNumber setCountryCode:@1]; [usNumber setNationalNumber:@4241231234]; [usNumber setPreferredDomesticCarrierCode:@"99"]; - XCTAssertEqualObjects(@"424 123 1234", [_aUtil format:usNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); - XCTAssertEqualObjects(@"424 123 1234", [_aUtil formatNationalNumberWithPreferredCarrierCode:usNumber fallbackCarrierCode:@"15"]); + XCTAssertEqualObjects(@"424 123 1234", + [_aUtil format:usNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); + XCTAssertEqualObjects( + @"424 123 1234", + [_aUtil formatNationalNumberWithPreferredCarrierCode:usNumber fallbackCarrierCode:@"15"]); } - (void)testFormatNumberForMobileDialing { // Numbers are normally dialed in national format in-country, and // international format from outside the country. - XCTAssertEqualObjects(@"030123456", [_aUtil formatNumberForMobileDialing:self.deNumber regionCallingFrom:@"DE" withFormatting:NO]); - XCTAssertEqualObjects(@"+4930123456", [_aUtil formatNumberForMobileDialing:self.deNumber regionCallingFrom:@"CH" withFormatting:NO]); + XCTAssertEqualObjects(@"030123456", [_aUtil formatNumberForMobileDialing:self.deNumber + regionCallingFrom:@"DE" + withFormatting:NO]); + XCTAssertEqualObjects(@"+4930123456", [_aUtil formatNumberForMobileDialing:self.deNumber + regionCallingFrom:@"CH" + withFormatting:NO]); id deNumberWithExtn = self.deNumber; [deNumberWithExtn setExtension:@"1234"]; - XCTAssertEqualObjects(@"030123456", [_aUtil formatNumberForMobileDialing:deNumberWithExtn regionCallingFrom:@"DE" withFormatting:NO]); - XCTAssertEqualObjects(@"+4930123456", [_aUtil formatNumberForMobileDialing:deNumberWithExtn regionCallingFrom:@"CH" withFormatting:NO]); - + XCTAssertEqualObjects(@"030123456", [_aUtil formatNumberForMobileDialing:deNumberWithExtn + regionCallingFrom:@"DE" + withFormatting:NO]); + XCTAssertEqualObjects(@"+4930123456", [_aUtil formatNumberForMobileDialing:deNumberWithExtn + regionCallingFrom:@"CH" + withFormatting:NO]); + // US toll free numbers are marked as noInternationalDialling in the test // metadata for testing purposes. - XCTAssertEqualObjects(@"800 253 0000", [_aUtil formatNumberForMobileDialing:self.usTollFreeNumber regionCallingFrom:@"US" withFormatting:YES]); - XCTAssertEqualObjects(@"", [_aUtil formatNumberForMobileDialing:self.usTollFreeNumber regionCallingFrom:@"CN" withFormatting:YES]); - XCTAssertEqualObjects(@"+1 650 253 0000", [_aUtil formatNumberForMobileDialing:self.usNumber regionCallingFrom:@"US" withFormatting:YES]); - + XCTAssertEqualObjects(@"800 253 0000", [_aUtil formatNumberForMobileDialing:self.usTollFreeNumber + regionCallingFrom:@"US" + withFormatting:YES]); + XCTAssertEqualObjects(@"", [_aUtil formatNumberForMobileDialing:self.usTollFreeNumber + regionCallingFrom:@"CN" + withFormatting:YES]); + XCTAssertEqualObjects(@"+1 650 253 0000", [_aUtil formatNumberForMobileDialing:self.usNumber + regionCallingFrom:@"US" + withFormatting:YES]); + id usNumberWithExtn = self.usNumber; [usNumberWithExtn setExtension:@"1234"]; - XCTAssertEqualObjects(@"+1 650 253 0000", [_aUtil formatNumberForMobileDialing:usNumberWithExtn regionCallingFrom:@"US" withFormatting:YES]); - XCTAssertEqualObjects(@"8002530000", [_aUtil formatNumberForMobileDialing:self.usTollFreeNumber regionCallingFrom:@"US" withFormatting:NO]); - XCTAssertEqualObjects(@"", [_aUtil formatNumberForMobileDialing:self.usTollFreeNumber regionCallingFrom:@"CN" withFormatting:NO]); - XCTAssertEqualObjects(@"+16502530000", [_aUtil formatNumberForMobileDialing:self.usNumber regionCallingFrom:@"US" withFormatting:NO]); - XCTAssertEqualObjects(@"+16502530000", [_aUtil formatNumberForMobileDialing:usNumberWithExtn regionCallingFrom:@"US" withFormatting:NO]); - + XCTAssertEqualObjects(@"+1 650 253 0000", [_aUtil formatNumberForMobileDialing:usNumberWithExtn + regionCallingFrom:@"US" + withFormatting:YES]); + XCTAssertEqualObjects(@"8002530000", [_aUtil formatNumberForMobileDialing:self.usTollFreeNumber + regionCallingFrom:@"US" + withFormatting:NO]); + XCTAssertEqualObjects(@"", [_aUtil formatNumberForMobileDialing:self.usTollFreeNumber + regionCallingFrom:@"CN" + withFormatting:NO]); + XCTAssertEqualObjects(@"+16502530000", [_aUtil formatNumberForMobileDialing:self.usNumber + regionCallingFrom:@"US" + withFormatting:NO]); + XCTAssertEqualObjects(@"+16502530000", [_aUtil formatNumberForMobileDialing:usNumberWithExtn + regionCallingFrom:@"US" + withFormatting:NO]); + // An invalid US number, which is one digit too long. - XCTAssertEqualObjects(@"+165025300001", [_aUtil formatNumberForMobileDialing:self.usTooLongNumber regionCallingFrom:@"US" withFormatting:NO]); - XCTAssertEqualObjects(@"+1 65025300001", [_aUtil formatNumberForMobileDialing:self.usTooLongNumber regionCallingFrom:@"US" withFormatting:YES]); - + XCTAssertEqualObjects(@"+165025300001", [_aUtil formatNumberForMobileDialing:self.usTooLongNumber + regionCallingFrom:@"US" + withFormatting:NO]); + XCTAssertEqualObjects(@"+1 65025300001", [_aUtil formatNumberForMobileDialing:self.usTooLongNumber + regionCallingFrom:@"US" + withFormatting:YES]); + // Star numbers. In real life they appear in Israel, but we have them in JP // in our test metadata. NBPhoneNumber *jpStarNumber = [[NBPhoneNumber alloc] init]; jpStarNumber.countryCode = @81; jpStarNumber.nationalNumber = @2345; - XCTAssertEqualObjects(@"*2345", [_aUtil formatNumberForMobileDialing:jpStarNumber regionCallingFrom:@"JP" withFormatting:NO]); - XCTAssertEqualObjects(@"*2345", [_aUtil formatNumberForMobileDialing:jpStarNumber regionCallingFrom:@"JP" withFormatting:YES]); - XCTAssertEqualObjects(@"+80012345678", [_aUtil formatNumberForMobileDialing:self.internationalTollFreeNumber regionCallingFrom:@"JP" withFormatting:NO]); - XCTAssertEqualObjects(@"+800 1234 5678", [_aUtil formatNumberForMobileDialing:self.internationalTollFreeNumber regionCallingFrom:@"JP" withFormatting:YES]); - + XCTAssertEqualObjects( + @"*2345", + [_aUtil formatNumberForMobileDialing:jpStarNumber regionCallingFrom:@"JP" withFormatting:NO]); + XCTAssertEqualObjects(@"*2345", [_aUtil formatNumberForMobileDialing:jpStarNumber + regionCallingFrom:@"JP" + withFormatting:YES]); + XCTAssertEqualObjects(@"+80012345678", + [_aUtil formatNumberForMobileDialing:self.internationalTollFreeNumber + regionCallingFrom:@"JP" + withFormatting:NO]); + XCTAssertEqualObjects(@"+800 1234 5678", + [_aUtil formatNumberForMobileDialing:self.internationalTollFreeNumber + regionCallingFrom:@"JP" + withFormatting:YES]); + // UAE numbers beginning with 600 (classified as UAN) need to be dialled // without +971 locally. NBPhoneNumber *aeUAN = [[NBPhoneNumber alloc] init]; aeUAN.countryCode = @971; aeUAN.nationalNumber = @600123456; - XCTAssertEqualObjects(@"+971600123456", [_aUtil formatNumberForMobileDialing:aeUAN regionCallingFrom:@"JP" withFormatting:NO]); - XCTAssertEqualObjects(@"600123456", [_aUtil formatNumberForMobileDialing:aeUAN regionCallingFrom:@"AE" withFormatting:NO]); - XCTAssertEqualObjects(@"+523312345678", - [_aUtil formatNumberForMobileDialing:self.mxNumber regionCallingFrom:@"MX" withFormatting:NO]); - XCTAssertEqualObjects(@"+523312345678", - [_aUtil formatNumberForMobileDialing:self.mxNumber regionCallingFrom:@"US" withFormatting:NO]); - + XCTAssertEqualObjects( + @"+971600123456", + [_aUtil formatNumberForMobileDialing:aeUAN regionCallingFrom:@"JP" withFormatting:NO]); + XCTAssertEqualObjects( + @"600123456", + [_aUtil formatNumberForMobileDialing:aeUAN regionCallingFrom:@"AE" withFormatting:NO]); + XCTAssertEqualObjects(@"+523312345678", [_aUtil formatNumberForMobileDialing:self.mxNumber + regionCallingFrom:@"MX" + withFormatting:NO]); + XCTAssertEqualObjects(@"+523312345678", [_aUtil formatNumberForMobileDialing:self.mxNumber + regionCallingFrom:@"US" + withFormatting:NO]); + // Non-geographical numbers should always be dialed in international format. - XCTAssertEqualObjects(@"+80012345678", [_aUtil formatNumberForMobileDialing:self.internationalTollFreeNumber regionCallingFrom:@"US" withFormatting:NO]); - XCTAssertEqualObjects(@"+80012345678", [_aUtil formatNumberForMobileDialing:self.internationalTollFreeNumber regionCallingFrom:@"UN001" withFormatting:NO]); - + XCTAssertEqualObjects(@"+80012345678", + [_aUtil formatNumberForMobileDialing:self.internationalTollFreeNumber + regionCallingFrom:@"US" + withFormatting:NO]); + XCTAssertEqualObjects(@"+80012345678", + [_aUtil formatNumberForMobileDialing:self.internationalTollFreeNumber + regionCallingFrom:@"UN001" + withFormatting:NO]); } - (void)testFormatByPattern { NBNumberFormat *newNumFormat = [[NBNumberFormat alloc] init]; [newNumFormat setPattern:@"(\\d{3})(\\d{3})(\\d{4})"]; [newNumFormat setFormat:@"($1) $2-$3"]; - - XCTAssertEqualObjects(@"(650) 253-0000", [_aUtil formatByPattern:self.usNumber numberFormat:NBEPhoneNumberFormatNATIONAL userDefinedFormats:@[newNumFormat]]); - - XCTAssertEqualObjects(@"+1 (650) 253-0000", [_aUtil formatByPattern:self.usNumber numberFormat:NBEPhoneNumberFormatINTERNATIONAL userDefinedFormats:@[newNumFormat]]); - XCTAssertEqualObjects(@"tel:+1-650-253-0000", [_aUtil formatByPattern:self.usNumber numberFormat:NBEPhoneNumberFormatRFC3966 userDefinedFormats:@[newNumFormat]]); - + + XCTAssertEqualObjects(@"(650) 253-0000", [_aUtil formatByPattern:self.usNumber + numberFormat:NBEPhoneNumberFormatNATIONAL + userDefinedFormats:@[ newNumFormat ]]); + + XCTAssertEqualObjects(@"+1 (650) 253-0000", + [_aUtil formatByPattern:self.usNumber + numberFormat:NBEPhoneNumberFormatINTERNATIONAL + userDefinedFormats:@[ newNumFormat ]]); + XCTAssertEqualObjects(@"tel:+1-650-253-0000", [_aUtil formatByPattern:self.usNumber + numberFormat:NBEPhoneNumberFormatRFC3966 + userDefinedFormats:@[ newNumFormat ]]); + // $NP is set to '1' for the US. Here we check that for other NANPA countries // the US rules are followed. [newNumFormat setNationalPrefixFormattingRule:@"$NP ($FG)"]; [newNumFormat setFormat:@"$1 $2-$3"]; - XCTAssertEqualObjects(@"1 (242) 365-1234", [_aUtil formatByPattern:self.bsNumber numberFormat:NBEPhoneNumberFormatNATIONAL userDefinedFormats:@[newNumFormat]]); - XCTAssertEqualObjects(@"+1 242 365-1234", [_aUtil formatByPattern:self.bsNumber numberFormat:NBEPhoneNumberFormatINTERNATIONAL userDefinedFormats:@[newNumFormat]]); - + XCTAssertEqualObjects(@"1 (242) 365-1234", [_aUtil formatByPattern:self.bsNumber + numberFormat:NBEPhoneNumberFormatNATIONAL + userDefinedFormats:@[ newNumFormat ]]); + XCTAssertEqualObjects(@"+1 242 365-1234", + [_aUtil formatByPattern:self.bsNumber + numberFormat:NBEPhoneNumberFormatINTERNATIONAL + userDefinedFormats:@[ newNumFormat ]]); + [newNumFormat setPattern:@"(\\d{2})(\\d{5})(\\d{3})"]; [newNumFormat setFormat:@"$1-$2 $3"]; - - XCTAssertEqualObjects(@"02-36618 300", [_aUtil formatByPattern:self.itNumber numberFormat:NBEPhoneNumberFormatNATIONAL userDefinedFormats:@[newNumFormat]]); - XCTAssertEqualObjects(@"+39 02-36618 300", [_aUtil formatByPattern:self.itNumber numberFormat:NBEPhoneNumberFormatINTERNATIONAL userDefinedFormats:@[newNumFormat]]); - + + XCTAssertEqualObjects(@"02-36618 300", [_aUtil formatByPattern:self.itNumber + numberFormat:NBEPhoneNumberFormatNATIONAL + userDefinedFormats:@[ newNumFormat ]]); + XCTAssertEqualObjects(@"+39 02-36618 300", + [_aUtil formatByPattern:self.itNumber + numberFormat:NBEPhoneNumberFormatINTERNATIONAL + userDefinedFormats:@[ newNumFormat ]]); + [newNumFormat setNationalPrefixFormattingRule:@"$NP$FG"]; [newNumFormat setPattern:@"(\\d{2})(\\d{4})(\\d{4})"]; [newNumFormat setFormat:@"$1 $2 $3"]; NBPhoneNumber *gbNumber = self.gbNumber; - XCTAssertEqualObjects(@"020 7031 3000", [_aUtil formatByPattern:gbNumber numberFormat:NBEPhoneNumberFormatNATIONAL userDefinedFormats:@[newNumFormat]]); - + XCTAssertEqualObjects(@"020 7031 3000", [_aUtil formatByPattern:gbNumber + numberFormat:NBEPhoneNumberFormatNATIONAL + userDefinedFormats:@[ newNumFormat ]]); + [newNumFormat setNationalPrefixFormattingRule:@"($NP$FG)"]; - XCTAssertEqualObjects(@"(020) 7031 3000", [_aUtil formatByPattern:gbNumber numberFormat:NBEPhoneNumberFormatNATIONAL userDefinedFormats:@[newNumFormat]]); - + XCTAssertEqualObjects(@"(020) 7031 3000", [_aUtil formatByPattern:gbNumber + numberFormat:NBEPhoneNumberFormatNATIONAL + userDefinedFormats:@[ newNumFormat ]]); + [newNumFormat setNationalPrefixFormattingRule:@""]; - XCTAssertEqualObjects(@"20 7031 3000", [_aUtil formatByPattern:gbNumber numberFormat:NBEPhoneNumberFormatNATIONAL userDefinedFormats:@[newNumFormat]]); - XCTAssertEqualObjects(@"+44 20 7031 3000", [_aUtil formatByPattern:gbNumber numberFormat:NBEPhoneNumberFormatINTERNATIONAL userDefinedFormats:@[newNumFormat]]); + XCTAssertEqualObjects(@"20 7031 3000", [_aUtil formatByPattern:gbNumber + numberFormat:NBEPhoneNumberFormatNATIONAL + userDefinedFormats:@[ newNumFormat ]]); + XCTAssertEqualObjects(@"+44 20 7031 3000", + [_aUtil formatByPattern:gbNumber + numberFormat:NBEPhoneNumberFormatINTERNATIONAL + userDefinedFormats:@[ newNumFormat ]]); } - (void)testFormatE164Number { - XCTAssertEqualObjects(@"+16502530000", [_aUtil format:self.usNumber numberFormat:NBEPhoneNumberFormatE164]); - XCTAssertEqualObjects(@"+4930123456", [_aUtil format:self.deNumber numberFormat:NBEPhoneNumberFormatE164]); - XCTAssertEqualObjects(@"+80012345678", [_aUtil format:self.internationalTollFreeNumber numberFormat:NBEPhoneNumberFormatE164]); + XCTAssertEqualObjects(@"+16502530000", + [_aUtil format:self.usNumber numberFormat:NBEPhoneNumberFormatE164]); + XCTAssertEqualObjects(@"+4930123456", + [_aUtil format:self.deNumber numberFormat:NBEPhoneNumberFormatE164]); + XCTAssertEqualObjects(@"+80012345678", [_aUtil format:self.internationalTollFreeNumber + numberFormat:NBEPhoneNumberFormatE164]); } - (void)testFormatNumberWithExtension { NBPhoneNumber *nzNumber = [[NBPhoneNumber alloc] init]; nzNumber.countryCode = @64; nzNumber.nationalNumber = @33316005; - + [nzNumber setExtension:@"1234"]; // Uses default extension prefix: - XCTAssertEqualObjects(@"03-331 6005 ext. 1234", [_aUtil format:nzNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); + XCTAssertEqualObjects(@"03-331 6005 ext. 1234", + [_aUtil format:nzNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); // Uses RFC 3966 syntax. - XCTAssertEqualObjects(@"tel:+64-3-331-6005;ext=1234", [_aUtil format:nzNumber numberFormat:NBEPhoneNumberFormatRFC3966]); + XCTAssertEqualObjects(@"tel:+64-3-331-6005;ext=1234", + [_aUtil format:nzNumber numberFormat:NBEPhoneNumberFormatRFC3966]); // Extension prefix overridden in the territory information for the US: - + id usNumberWithExtension = self.usNumber; [usNumberWithExtension setExtension:@"4567"]; - XCTAssertEqualObjects(@"650 253 0000 extn. 4567", [_aUtil format:usNumberWithExtension numberFormat:NBEPhoneNumberFormatNATIONAL]); + XCTAssertEqualObjects(@"650 253 0000 extn. 4567", [_aUtil format:usNumberWithExtension + numberFormat:NBEPhoneNumberFormatNATIONAL]); } - (void)testFormatInOriginalFormat { NSError *anError = nil; - NBPhoneNumber *number1 = [_aUtil parseAndKeepRawInput:@"+442087654321" defaultRegion:@"GB" error:&anError]; - XCTAssertEqualObjects(@"+44 20 8765 4321", [_aUtil formatInOriginalFormat:number1 regionCallingFrom:@"GB"]); - - NBPhoneNumber *number2 = [_aUtil parseAndKeepRawInput:@"02087654321" defaultRegion:@"GB" error:&anError]; - XCTAssertEqualObjects(@"(020) 8765 4321", [_aUtil formatInOriginalFormat:number2 regionCallingFrom:@"GB"]); - - NBPhoneNumber *number3 = [_aUtil parseAndKeepRawInput:@"011442087654321" defaultRegion:@"US" error:&anError]; - XCTAssertEqualObjects(@"011 44 20 8765 4321", [_aUtil formatInOriginalFormat:number3 regionCallingFrom:@"US"]); - - NBPhoneNumber *number4 = [_aUtil parseAndKeepRawInput:@"442087654321" defaultRegion:@"GB" error:&anError]; - XCTAssertEqualObjects(@"44 20 8765 4321", [_aUtil formatInOriginalFormat:number4 regionCallingFrom:@"GB"]); - + NBPhoneNumber *number1 = + [_aUtil parseAndKeepRawInput:@"+442087654321" defaultRegion:@"GB" error:&anError]; + XCTAssertEqualObjects(@"+44 20 8765 4321", + [_aUtil formatInOriginalFormat:number1 regionCallingFrom:@"GB"]); + + NBPhoneNumber *number2 = + [_aUtil parseAndKeepRawInput:@"02087654321" defaultRegion:@"GB" error:&anError]; + XCTAssertEqualObjects(@"(020) 8765 4321", + [_aUtil formatInOriginalFormat:number2 regionCallingFrom:@"GB"]); + + NBPhoneNumber *number3 = + [_aUtil parseAndKeepRawInput:@"011442087654321" defaultRegion:@"US" error:&anError]; + XCTAssertEqualObjects(@"011 44 20 8765 4321", + [_aUtil formatInOriginalFormat:number3 regionCallingFrom:@"US"]); + + NBPhoneNumber *number4 = + [_aUtil parseAndKeepRawInput:@"442087654321" defaultRegion:@"GB" error:&anError]; + XCTAssertEqualObjects(@"44 20 8765 4321", + [_aUtil formatInOriginalFormat:number4 regionCallingFrom:@"GB"]); + NBPhoneNumber *number5 = [_aUtil parse:@"+442087654321" defaultRegion:@"GB" error:&anError]; - XCTAssertEqualObjects(@"(020) 8765 4321", [_aUtil formatInOriginalFormat:number5 regionCallingFrom:@"GB"]); - + XCTAssertEqualObjects(@"(020) 8765 4321", + [_aUtil formatInOriginalFormat:number5 regionCallingFrom:@"GB"]); + // Invalid numbers that we have a formatting pattern for should be formatted // properly. Note area codes starting with 7 are intentionally excluded in // the test metadata for testing purposes. - NBPhoneNumber *number6 = [_aUtil parseAndKeepRawInput:@"7345678901" defaultRegion:@"US" error:&anError]; - XCTAssertEqualObjects(@"734 567 8901", [_aUtil formatInOriginalFormat:number6 regionCallingFrom:@"US"]); - + NBPhoneNumber *number6 = + [_aUtil parseAndKeepRawInput:@"7345678901" defaultRegion:@"US" error:&anError]; + XCTAssertEqualObjects(@"734 567 8901", + [_aUtil formatInOriginalFormat:number6 regionCallingFrom:@"US"]); + // US is not a leading zero country, and the presence of the leading zero // leads us to format the number using raw_input. - NBPhoneNumber *number7 = [_aUtil parseAndKeepRawInput:@"0734567 8901" defaultRegion:@"US" error:&anError]; - XCTAssertEqualObjects(@"0734567 8901", [_aUtil formatInOriginalFormat:number7 regionCallingFrom:@"US"]); - + NBPhoneNumber *number7 = + [_aUtil parseAndKeepRawInput:@"0734567 8901" defaultRegion:@"US" error:&anError]; + XCTAssertEqualObjects(@"0734567 8901", + [_aUtil formatInOriginalFormat:number7 regionCallingFrom:@"US"]); + // This number is valid, but we don't have a formatting pattern for it. // Fall back to the raw input. - NBPhoneNumber *number8 = [_aUtil parseAndKeepRawInput:@"02-4567-8900" defaultRegion:@"KR" error:&anError]; - XCTAssertEqualObjects(@"02-4567-8900", [_aUtil formatInOriginalFormat:number8 regionCallingFrom:@"KR"]); - - NBPhoneNumber *number9 = [_aUtil parseAndKeepRawInput:@"01180012345678" defaultRegion:@"US" error:&anError]; - XCTAssertEqualObjects(@"011 800 1234 5678", [_aUtil formatInOriginalFormat:number9 regionCallingFrom:@"US"]); - - NBPhoneNumber *number10 = [_aUtil parseAndKeepRawInput:@"+80012345678" defaultRegion:@"KR" error:&anError]; - XCTAssertEqualObjects(@"+800 1234 5678", [_aUtil formatInOriginalFormat:number10 regionCallingFrom:@"KR"]); - + NBPhoneNumber *number8 = + [_aUtil parseAndKeepRawInput:@"02-4567-8900" defaultRegion:@"KR" error:&anError]; + XCTAssertEqualObjects(@"02-4567-8900", + [_aUtil formatInOriginalFormat:number8 regionCallingFrom:@"KR"]); + + NBPhoneNumber *number9 = + [_aUtil parseAndKeepRawInput:@"01180012345678" defaultRegion:@"US" error:&anError]; + XCTAssertEqualObjects(@"011 800 1234 5678", + [_aUtil formatInOriginalFormat:number9 regionCallingFrom:@"US"]); + + NBPhoneNumber *number10 = + [_aUtil parseAndKeepRawInput:@"+80012345678" defaultRegion:@"KR" error:&anError]; + XCTAssertEqualObjects(@"+800 1234 5678", + [_aUtil formatInOriginalFormat:number10 regionCallingFrom:@"KR"]); + // US local numbers are formatted correctly, as we have formatting patterns // for them. - NBPhoneNumber *localNumberUS = [_aUtil parseAndKeepRawInput:@"2530000" defaultRegion:@"US" error:&anError]; - XCTAssertEqualObjects(@"253 0000", [_aUtil formatInOriginalFormat:localNumberUS regionCallingFrom:@"US"]); - - NBPhoneNumber *numberWithNationalPrefixUS = [_aUtil parseAndKeepRawInput:@"18003456789" defaultRegion:@"US" error:&anError]; - XCTAssertEqualObjects(@"1 800 345 6789", [_aUtil formatInOriginalFormat:numberWithNationalPrefixUS regionCallingFrom:@"US"]); - - NBPhoneNumber *numberWithoutNationalPrefixGB = [_aUtil parseAndKeepRawInput:@"2087654321" defaultRegion:@"GB" error:&anError]; - XCTAssertEqualObjects(@"20 8765 4321", [_aUtil formatInOriginalFormat:numberWithoutNationalPrefixGB regionCallingFrom:@"GB"]); - + NBPhoneNumber *localNumberUS = + [_aUtil parseAndKeepRawInput:@"2530000" defaultRegion:@"US" error:&anError]; + XCTAssertEqualObjects(@"253 0000", + [_aUtil formatInOriginalFormat:localNumberUS regionCallingFrom:@"US"]); + + NBPhoneNumber *numberWithNationalPrefixUS = + [_aUtil parseAndKeepRawInput:@"18003456789" defaultRegion:@"US" error:&anError]; + XCTAssertEqualObjects(@"1 800 345 6789", [_aUtil formatInOriginalFormat:numberWithNationalPrefixUS + regionCallingFrom:@"US"]); + + NBPhoneNumber *numberWithoutNationalPrefixGB = + [_aUtil parseAndKeepRawInput:@"2087654321" defaultRegion:@"GB" error:&anError]; + XCTAssertEqualObjects( + @"20 8765 4321", + [_aUtil formatInOriginalFormat:numberWithoutNationalPrefixGB regionCallingFrom:@"GB"]); + // Make sure no metadata is modified as a result of the previous function // call. - XCTAssertEqualObjects(@"(020) 8765 4321", [_aUtil formatInOriginalFormat:number5 regionCallingFrom:@"GB" error:&anError]); - - NBPhoneNumber *numberWithNationalPrefixMX = [_aUtil parseAndKeepRawInput:@"013312345678" defaultRegion:@"MX" error:&anError]; - XCTAssertEqualObjects(@"01 33 1234 5678", [_aUtil formatInOriginalFormat:numberWithNationalPrefixMX regionCallingFrom:@"MX"]); - - NBPhoneNumber *numberWithoutNationalPrefixMX = [_aUtil parseAndKeepRawInput:@"3312345678" defaultRegion:@"MX" error:&anError]; - XCTAssertEqualObjects(@"33 1234 5678", [_aUtil formatInOriginalFormat:numberWithoutNationalPrefixMX regionCallingFrom:@"MX"]); - - NBPhoneNumber *italianFixedLineNumber = [_aUtil parseAndKeepRawInput:@"0212345678" defaultRegion:@"IT" error:&anError]; - XCTAssertEqualObjects(@"02 1234 5678", [_aUtil formatInOriginalFormat:italianFixedLineNumber regionCallingFrom:@"IT"]); - - NBPhoneNumber *numberWithNationalPrefixJP = [_aUtil parseAndKeepRawInput:@"00777012" defaultRegion:@"JP" error:&anError]; - XCTAssertEqualObjects(@"0077-7012", [_aUtil formatInOriginalFormat:numberWithNationalPrefixJP regionCallingFrom:@"JP"]); - - NBPhoneNumber *numberWithoutNationalPrefixJP = [_aUtil parseAndKeepRawInput:@"0777012" defaultRegion:@"JP" error:&anError]; - XCTAssertEqualObjects(@"0777012", [_aUtil formatInOriginalFormat:numberWithoutNationalPrefixJP regionCallingFrom:@"JP"]); - - NBPhoneNumber *numberWithCarrierCodeBR = [_aUtil parseAndKeepRawInput:@"012 3121286979" defaultRegion:@"BR" error:&anError]; - XCTAssertEqualObjects(@"012 3121286979", [_aUtil formatInOriginalFormat:numberWithCarrierCodeBR regionCallingFrom:@"BR"]); - + XCTAssertEqualObjects( + @"(020) 8765 4321", + [_aUtil formatInOriginalFormat:number5 regionCallingFrom:@"GB" error:&anError]); + + NBPhoneNumber *numberWithNationalPrefixMX = + [_aUtil parseAndKeepRawInput:@"013312345678" defaultRegion:@"MX" error:&anError]; + XCTAssertEqualObjects( + @"01 33 1234 5678", + [_aUtil formatInOriginalFormat:numberWithNationalPrefixMX regionCallingFrom:@"MX"]); + + NBPhoneNumber *numberWithoutNationalPrefixMX = + [_aUtil parseAndKeepRawInput:@"3312345678" defaultRegion:@"MX" error:&anError]; + XCTAssertEqualObjects( + @"33 1234 5678", + [_aUtil formatInOriginalFormat:numberWithoutNationalPrefixMX regionCallingFrom:@"MX"]); + + NBPhoneNumber *italianFixedLineNumber = + [_aUtil parseAndKeepRawInput:@"0212345678" defaultRegion:@"IT" error:&anError]; + XCTAssertEqualObjects(@"02 1234 5678", [_aUtil formatInOriginalFormat:italianFixedLineNumber + regionCallingFrom:@"IT"]); + + NBPhoneNumber *numberWithNationalPrefixJP = + [_aUtil parseAndKeepRawInput:@"00777012" defaultRegion:@"JP" error:&anError]; + XCTAssertEqualObjects(@"0077-7012", [_aUtil formatInOriginalFormat:numberWithNationalPrefixJP + regionCallingFrom:@"JP"]); + + NBPhoneNumber *numberWithoutNationalPrefixJP = + [_aUtil parseAndKeepRawInput:@"0777012" defaultRegion:@"JP" error:&anError]; + XCTAssertEqualObjects(@"0777012", [_aUtil formatInOriginalFormat:numberWithoutNationalPrefixJP + regionCallingFrom:@"JP"]); + + NBPhoneNumber *numberWithCarrierCodeBR = + [_aUtil parseAndKeepRawInput:@"012 3121286979" defaultRegion:@"BR" error:&anError]; + XCTAssertEqualObjects(@"012 3121286979", [_aUtil formatInOriginalFormat:numberWithCarrierCodeBR + regionCallingFrom:@"BR"]); + // The default national prefix used in this case is 045. When a number with // national prefix 044 is entered, we return the raw input as we don't want to // change the number entered. - NBPhoneNumber *numberWithNationalPrefixMX1 = [_aUtil parseAndKeepRawInput:@"044(33)1234-5678" defaultRegion:@"MX" error:&anError]; - XCTAssertEqualObjects(@"044(33)1234-5678", [_aUtil formatInOriginalFormat:numberWithNationalPrefixMX1 regionCallingFrom:@"MX"]); - - NBPhoneNumber *numberWithNationalPrefixMX2 = [_aUtil parseAndKeepRawInput:@"045(33)1234-5678" defaultRegion:@"MX" error:&anError]; - XCTAssertEqualObjects(@"045 33 1234 5678", [_aUtil formatInOriginalFormat:numberWithNationalPrefixMX2 regionCallingFrom:@"MX"]); - + NBPhoneNumber *numberWithNationalPrefixMX1 = + [_aUtil parseAndKeepRawInput:@"044(33)1234-5678" defaultRegion:@"MX" error:&anError]; + XCTAssertEqualObjects( + @"044(33)1234-5678", + [_aUtil formatInOriginalFormat:numberWithNationalPrefixMX1 regionCallingFrom:@"MX"]); + + NBPhoneNumber *numberWithNationalPrefixMX2 = + [_aUtil parseAndKeepRawInput:@"045(33)1234-5678" defaultRegion:@"MX" error:&anError]; + XCTAssertEqualObjects( + @"045 33 1234 5678", + [_aUtil formatInOriginalFormat:numberWithNationalPrefixMX2 regionCallingFrom:@"MX"]); + // The default international prefix used in this case is 0011. When a number // with international prefix 0012 is entered, we return the raw input as we // don't want to change the number entered. - id outOfCountryNumberFromAU1 = [_aUtil parseAndKeepRawInput:@"0012 16502530000" defaultRegion:@"AU" error:&anError]; - XCTAssertEqualObjects(@"0012 16502530000", [_aUtil formatInOriginalFormat:outOfCountryNumberFromAU1 regionCallingFrom:@"AU"]); - - id outOfCountryNumberFromAU2 = [_aUtil parseAndKeepRawInput:@"0011 16502530000" defaultRegion:@"AU" error:&anError]; - XCTAssertEqualObjects(@"0011 1 650 253 0000", [_aUtil formatInOriginalFormat:outOfCountryNumberFromAU2 regionCallingFrom:@"AU"]); - + id outOfCountryNumberFromAU1 = + [_aUtil parseAndKeepRawInput:@"0012 16502530000" defaultRegion:@"AU" error:&anError]; + XCTAssertEqualObjects( + @"0012 16502530000", + [_aUtil formatInOriginalFormat:outOfCountryNumberFromAU1 regionCallingFrom:@"AU"]); + + id outOfCountryNumberFromAU2 = + [_aUtil parseAndKeepRawInput:@"0011 16502530000" defaultRegion:@"AU" error:&anError]; + XCTAssertEqualObjects( + @"0011 1 650 253 0000", + [_aUtil formatInOriginalFormat:outOfCountryNumberFromAU2 regionCallingFrom:@"AU"]); + // Test the star sign is not removed from or added to the original input by // this method. id starNumber = [_aUtil parseAndKeepRawInput:@"*1234" defaultRegion:@"JP" error:&anError]; - XCTAssertEqualObjects(@"*1234", [_aUtil formatInOriginalFormat:starNumber regionCallingFrom:@"JP"]); - - NBPhoneNumber *numberWithoutStar = [_aUtil parseAndKeepRawInput:@"1234" defaultRegion:@"JP" error:&anError]; - XCTAssertEqualObjects(@"1234", [_aUtil formatInOriginalFormat:numberWithoutStar regionCallingFrom:@"JP"]); - + XCTAssertEqualObjects(@"*1234", + [_aUtil formatInOriginalFormat:starNumber regionCallingFrom:@"JP"]); + + NBPhoneNumber *numberWithoutStar = + [_aUtil parseAndKeepRawInput:@"1234" defaultRegion:@"JP" error:&anError]; + XCTAssertEqualObjects(@"1234", + [_aUtil formatInOriginalFormat:numberWithoutStar regionCallingFrom:@"JP"]); + // Test an invalid national number without raw input is just formatted as the // national number. - XCTAssertEqualObjects(@"650253000", [_aUtil formatInOriginalFormat:self.usShortByOneNumber regionCallingFrom:@"US"]); + XCTAssertEqualObjects(@"650253000", [_aUtil formatInOriginalFormat:self.usShortByOneNumber + regionCallingFrom:@"US"]); } - (void)testIsPremiumRate { XCTAssertEqual(NBEPhoneNumberTypePREMIUM_RATE, [_aUtil getNumberType:self.usPremiumNumber]); - + NBPhoneNumber *premiumRateNumber = [[NBPhoneNumber alloc] init]; premiumRateNumber = [[NBPhoneNumber alloc] init]; [premiumRateNumber setCountryCode:@39]; [premiumRateNumber setNationalNumber:@892123]; XCTAssertEqual(NBEPhoneNumberTypePREMIUM_RATE, [_aUtil getNumberType:premiumRateNumber]); - + premiumRateNumber = [[NBPhoneNumber alloc] init]; [premiumRateNumber setCountryCode:@44]; [premiumRateNumber setNationalNumber:@9187654321]; XCTAssertEqual(NBEPhoneNumberTypePREMIUM_RATE, [_aUtil getNumberType:premiumRateNumber]); - + premiumRateNumber = [[NBPhoneNumber alloc] init]; [premiumRateNumber setCountryCode:@49]; [premiumRateNumber setNationalNumber:@9001654321]; XCTAssertEqual(NBEPhoneNumberTypePREMIUM_RATE, [_aUtil getNumberType:premiumRateNumber]); - + premiumRateNumber = [[NBPhoneNumber alloc] init]; [premiumRateNumber setCountryCode:@49]; [premiumRateNumber setNationalNumber:@90091234567]; XCTAssertEqual(NBEPhoneNumberTypePREMIUM_RATE, [_aUtil getNumberType:premiumRateNumber]); - XCTAssertEqual(NBEPhoneNumberTypePREMIUM_RATE, [_aUtil getNumberType:self.universalPremiumRateNumber]); + XCTAssertEqual(NBEPhoneNumberTypePREMIUM_RATE, + [_aUtil getNumberType:self.universalPremiumRateNumber]); } - (void)testIsTollFree { NBPhoneNumber *tollFreeNumber = [[NBPhoneNumber alloc] init]; - + [tollFreeNumber setCountryCode:@1]; [tollFreeNumber setNationalNumber:@8881234567]; XCTAssertEqual(NBEPhoneNumberTypeTOLL_FREE, [_aUtil getNumberType:tollFreeNumber]); - + tollFreeNumber = [[NBPhoneNumber alloc] init]; [tollFreeNumber setCountryCode:@39]; [tollFreeNumber setNationalNumber:@803123]; XCTAssertEqual(NBEPhoneNumberTypeTOLL_FREE, [_aUtil getNumberType:tollFreeNumber]); - + tollFreeNumber = [[NBPhoneNumber alloc] init]; [tollFreeNumber setCountryCode:@44]; [tollFreeNumber setNationalNumber:@8012345678]; XCTAssertEqual(NBEPhoneNumberTypeTOLL_FREE, [_aUtil getNumberType:tollFreeNumber]); - + tollFreeNumber = [[NBPhoneNumber alloc] init]; [tollFreeNumber setCountryCode:@49]; [tollFreeNumber setNationalNumber:@8001234567]; XCTAssertEqual(NBEPhoneNumberTypeTOLL_FREE, [_aUtil getNumberType:tollFreeNumber]); - - XCTAssertEqual(NBEPhoneNumberTypeTOLL_FREE, [_aUtil getNumberType:self.internationalTollFreeNumber]); + + XCTAssertEqual(NBEPhoneNumberTypeTOLL_FREE, + [_aUtil getNumberType:self.internationalTollFreeNumber]); } - (void)testIsMobile { @@ -1145,7 +1468,7 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat XCTAssertEqual(NBEPhoneNumberTypeMOBILE, [_aUtil getNumberType:self.gbMobile]); XCTAssertEqual(NBEPhoneNumberTypeMOBILE, [_aUtil getNumberType:self.itMobile]); XCTAssertEqual(NBEPhoneNumberTypeMOBILE, [_aUtil getNumberType:self.arMobile]); - + NBPhoneNumber *mobileNumber = [[NBPhoneNumber alloc] init]; [mobileNumber setCountryCode:@49]; [mobileNumber setNationalNumber:@15123456789]; @@ -1161,11 +1484,12 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat - (void)testIsFixedLineAndMobile { XCTAssertEqual(NBEPhoneNumberTypeFIXED_LINE_OR_MOBILE, [_aUtil getNumberType:self.usNumber]); - + NBPhoneNumber *fixedLineAndMobileNumber = [[NBPhoneNumber alloc] init]; [fixedLineAndMobileNumber setCountryCode:@54]; [fixedLineAndMobileNumber setNationalNumber:@1987654321]; - XCTAssertEqual(NBEPhoneNumberTypeFIXED_LINE_OR_MOBILE, [_aUtil getNumberType:fixedLineAndMobileNumber]); + XCTAssertEqual(NBEPhoneNumberTypeFIXED_LINE_OR_MOBILE, + [_aUtil getNumberType:fixedLineAndMobileNumber]); } - (void)testIsSharedCost { @@ -1208,45 +1532,46 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat XCTAssertTrue([_aUtil isValidNumber:self.bsNumber]); XCTAssertTrue([_aUtil isValidNumberForRegion:self.bsNumber regionCode:@"BS"]); XCTAssertFalse([_aUtil isValidNumberForRegion:self.bsNumber regionCode:@"US"]); - + NBPhoneNumber *bsInvalidNumber = [[NBPhoneNumber alloc] init]; [bsInvalidNumber setCountryCode:@1]; [bsInvalidNumber setNationalNumber:@2421232345]; // This number is no longer valid. XCTAssertFalse([_aUtil isValidNumber:bsInvalidNumber]); - + // La Mayotte and Reunion use 'leadingDigits' to differentiate them. - + NBPhoneNumber *reNumber = [[NBPhoneNumber alloc] init]; [reNumber setCountryCode:@262]; [reNumber setNationalNumber:@262123456]; XCTAssertTrue([_aUtil isValidNumber:reNumber]); XCTAssertTrue([_aUtil isValidNumberForRegion:reNumber regionCode:@"RE"]); XCTAssertFalse([_aUtil isValidNumberForRegion:reNumber regionCode:@"YT"]); - + // Now change the number to be a number for La Mayotte. [reNumber setNationalNumber:@269601234]; XCTAssertTrue([_aUtil isValidNumberForRegion:reNumber regionCode:@"YT"]); XCTAssertFalse([_aUtil isValidNumberForRegion:reNumber regionCode:@"RE"]); - + // This number is no longer valid for La Reunion. [reNumber setNationalNumber:@269123456]; XCTAssertFalse([_aUtil isValidNumberForRegion:reNumber regionCode:@"YT"]); XCTAssertFalse([_aUtil isValidNumberForRegion:reNumber regionCode:@"RE"]); XCTAssertFalse([_aUtil isValidNumber:reNumber]); - + // However, it should be recognised as from La Mayotte, since it is valid for // this region. XCTAssertEqualObjects(@"YT", [_aUtil getRegionCodeForNumber:reNumber]); - + // This number is valid in both places. [reNumber setNationalNumber:@800123456]; XCTAssertTrue([_aUtil isValidNumberForRegion:reNumber regionCode:@"YT"]); XCTAssertTrue([_aUtil isValidNumberForRegion:reNumber regionCode:@"RE"]); XCTAssertTrue([_aUtil isValidNumberForRegion:self.internationalTollFreeNumber regionCode:@"001"]); XCTAssertFalse([_aUtil isValidNumberForRegion:self.internationalTollFreeNumber regionCode:@"US"]); - XCTAssertFalse([_aUtil isValidNumberForRegion:self.internationalTollFreeNumber regionCode:NB_UNKNOWN_REGION]); - + XCTAssertFalse([_aUtil isValidNumberForRegion:self.internationalTollFreeNumber + regionCode:NB_UNKNOWN_REGION]); + NBPhoneNumber *invalidNumber = [[NBPhoneNumber alloc] init]; // Invalid country calling codes. [invalidNumber setCountryCode:@3923]; @@ -1259,28 +1584,28 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat } - (void)testIsNotValidNumber { XCTAssertFalse([_aUtil isValidNumber:self.usLocalNumber]); - + NBPhoneNumber *invalidNumber = [[NBPhoneNumber alloc] init]; [invalidNumber setCountryCode:@39]; [invalidNumber setNationalNumber:@23661830000]; [invalidNumber setItalianLeadingZero:YES]; XCTAssertFalse([_aUtil isValidNumber:invalidNumber]); - + invalidNumber = [[NBPhoneNumber alloc] init]; [invalidNumber setCountryCode:@44]; [invalidNumber setNationalNumber:@791234567]; XCTAssertFalse([_aUtil isValidNumber:invalidNumber]); - + invalidNumber = [[NBPhoneNumber alloc] init]; [invalidNumber setCountryCode:@0]; [invalidNumber setNationalNumber:@1234]; XCTAssertFalse([_aUtil isValidNumber:invalidNumber]); - + invalidNumber = [[NBPhoneNumber alloc] init]; [invalidNumber setCountryCode:@64]; [invalidNumber setNationalNumber:@3316005]; XCTAssertFalse([_aUtil isValidNumber:invalidNumber]); - + invalidNumber = [[NBPhoneNumber alloc] init]; // Invalid country calling codes. [invalidNumber setCountryCode:@3923]; @@ -1288,7 +1613,7 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat XCTAssertFalse([_aUtil isValidNumber:invalidNumber]); [invalidNumber setCountryCode:@0]; XCTAssertFalse([_aUtil isValidNumber:invalidNumber]); - + XCTAssertFalse([_aUtil isValidNumber:self.internationalTollFreeTooLongNumber]); } @@ -1331,21 +1656,21 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat - (void)testGetNationalDiallingPrefixForRegion { XCTAssertEqualObjects(@"1", [_aUtil getNddPrefixForRegion:@"US" stripNonDigits:NO]); - + // Test non-main country to see it gets the national dialling prefix for the // main country with that country calling code. XCTAssertEqualObjects(@"1", [_aUtil getNddPrefixForRegion:@"BS" stripNonDigits:NO]); XCTAssertEqualObjects(@"0", [_aUtil getNddPrefixForRegion:@"NZ" stripNonDigits:NO]); - + // Test case with non digit in the national prefix. XCTAssertEqualObjects(@"0~0", [_aUtil getNddPrefixForRegion:@"AO" stripNonDigits:NO]); XCTAssertEqualObjects(@"00", [_aUtil getNddPrefixForRegion:@"AO" stripNonDigits:YES]); - + // Test cases with invalid regions. XCTAssertNil([_aUtil getNddPrefixForRegion:nil stripNonDigits:NO]); XCTAssertNil([_aUtil getNddPrefixForRegion:NB_UNKNOWN_REGION stripNonDigits:NO]); XCTAssertNil([_aUtil getNddPrefixForRegion:@"001" stripNonDigits:NO]); - + // CS is already deprecated so the library doesn't support it. XCTAssertNil([_aUtil getNddPrefixForRegion:@"CS" stripNonDigits:NO]); } @@ -1364,63 +1689,78 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat XCTAssertTrue([_aUtil isPossibleNumber:self.usLocalNumber]); XCTAssertTrue([_aUtil isPossibleNumber:self.gbNumber]); XCTAssertTrue([_aUtil isPossibleNumber:self.internationalTollFreeNumber]); - - XCTAssertTrue([_aUtil isPossibleNumberString:@"+1 650 253 0000" regionDialingFrom:@"US" error:nil]); - XCTAssertTrue([_aUtil isPossibleNumberString:@"+1 650 GOO OGLE" regionDialingFrom:@"US" error:nil]); - XCTAssertTrue([_aUtil isPossibleNumberString:@"(650) 253-0000" regionDialingFrom:@"US" error:nil]); + + XCTAssertTrue( + [_aUtil isPossibleNumberString:@"+1 650 253 0000" regionDialingFrom:@"US" error:nil]); + XCTAssertTrue( + [_aUtil isPossibleNumberString:@"+1 650 GOO OGLE" regionDialingFrom:@"US" error:nil]); + XCTAssertTrue( + [_aUtil isPossibleNumberString:@"(650) 253-0000" regionDialingFrom:@"US" error:nil]); XCTAssertTrue([_aUtil isPossibleNumberString:@"253-0000" regionDialingFrom:@"US" error:nil]); - XCTAssertTrue([_aUtil isPossibleNumberString:@"+1 650 253 0000" regionDialingFrom:@"GB" error:nil]); - XCTAssertTrue([_aUtil isPossibleNumberString:@"+44 20 7031 3000" regionDialingFrom:@"GB" error:nil]); - XCTAssertTrue([_aUtil isPossibleNumberString:@"(020) 7031 3000" regionDialingFrom:@"GB" error:nil]); + XCTAssertTrue( + [_aUtil isPossibleNumberString:@"+1 650 253 0000" regionDialingFrom:@"GB" error:nil]); + XCTAssertTrue( + [_aUtil isPossibleNumberString:@"+44 20 7031 3000" regionDialingFrom:@"GB" error:nil]); + XCTAssertTrue( + [_aUtil isPossibleNumberString:@"(020) 7031 3000" regionDialingFrom:@"GB" error:nil]); XCTAssertTrue([_aUtil isPossibleNumberString:@"7031 3000" regionDialingFrom:@"GB" error:nil]); XCTAssertTrue([_aUtil isPossibleNumberString:@"3331 6005" regionDialingFrom:@"NZ" error:nil]); - XCTAssertTrue([_aUtil isPossibleNumberString:@"+800 1234 5678" regionDialingFrom:@"001" error:nil]); + XCTAssertTrue( + [_aUtil isPossibleNumberString:@"+800 1234 5678" regionDialingFrom:@"001" error:nil]); } - (void)testIsPossibleNumberWithReason { // National numbers for country calling code +1 that are within 7 to 10 digits // are possible. XCTAssertEqual(NBEValidationResultIS_POSSIBLE, [_aUtil isPossibleNumberWithReason:self.usNumber]); - XCTAssertEqual(NBEValidationResultIS_POSSIBLE, [_aUtil isPossibleNumberWithReason:self.usLocalNumber]); - XCTAssertEqual(NBEValidationResultTOO_LONG, [_aUtil isPossibleNumberWithReason:self.usTooLongNumber]); - + XCTAssertEqual(NBEValidationResultIS_POSSIBLE, + [_aUtil isPossibleNumberWithReason:self.usLocalNumber]); + XCTAssertEqual(NBEValidationResultTOO_LONG, + [_aUtil isPossibleNumberWithReason:self.usTooLongNumber]); + NBPhoneNumber *number = [[NBPhoneNumber alloc] init]; [number setCountryCode:@0]; [number setNationalNumber:@2530000]; - XCTAssertEqual(NBEValidationResultINVALID_COUNTRY_CODE, [_aUtil isPossibleNumberWithReason:number]); - + XCTAssertEqual(NBEValidationResultINVALID_COUNTRY_CODE, + [_aUtil isPossibleNumberWithReason:number]); + number = [[NBPhoneNumber alloc] init]; [number setCountryCode:@1]; [number setNationalNumber:@253000]; XCTAssertEqual(NBEValidationResultTOO_SHORT, [_aUtil isPossibleNumberWithReason:number]); - + number = [[NBPhoneNumber alloc] init]; [number setCountryCode:@65]; [number setNationalNumber:@1234567890]; XCTAssertEqual(NBEValidationResultIS_POSSIBLE, [_aUtil isPossibleNumberWithReason:number]); - XCTAssertEqual(NBEValidationResultTOO_LONG, [_aUtil isPossibleNumberWithReason:self.internationalTollFreeTooLongNumber]); + XCTAssertEqual(NBEValidationResultTOO_LONG, + [_aUtil isPossibleNumberWithReason:self.internationalTollFreeTooLongNumber]); } - (void)testIsNotPossibleNumber { XCTAssertFalse([_aUtil isPossibleNumber:self.usTooLongNumber]); XCTAssertFalse([_aUtil isPossibleNumber:self.internationalTollFreeTooLongNumber]); - + NBPhoneNumber *number = [[NBPhoneNumber alloc] init]; [number setCountryCode:@1]; [number setNationalNumber:@253000]; XCTAssertFalse([_aUtil isPossibleNumber:number]); - + number = [[NBPhoneNumber alloc] init]; [number setCountryCode:@44]; [number setNationalNumber:@300]; XCTAssertFalse([_aUtil isPossibleNumber:number]); - XCTAssertFalse([_aUtil isPossibleNumberString:@"+1 650 253 00000" regionDialingFrom:@"US" error:nil]); - XCTAssertFalse([_aUtil isPossibleNumberString:@"(650) 253-00000" regionDialingFrom:@"US" error:nil]); - XCTAssertFalse([_aUtil isPossibleNumberString:@"I want a Pizza" regionDialingFrom:@"US" error:nil]); + XCTAssertFalse( + [_aUtil isPossibleNumberString:@"+1 650 253 00000" regionDialingFrom:@"US" error:nil]); + XCTAssertFalse( + [_aUtil isPossibleNumberString:@"(650) 253-00000" regionDialingFrom:@"US" error:nil]); + XCTAssertFalse( + [_aUtil isPossibleNumberString:@"I want a Pizza" regionDialingFrom:@"US" error:nil]); XCTAssertFalse([_aUtil isPossibleNumberString:@"253-000" regionDialingFrom:@"US" error:nil]); XCTAssertFalse([_aUtil isPossibleNumberString:@"1 3000" regionDialingFrom:@"GB" error:nil]); XCTAssertFalse([_aUtil isPossibleNumberString:@"+44 300" regionDialingFrom:@"GB" error:nil]); - XCTAssertFalse([_aUtil isPossibleNumberString:@"+800 1234 5678 9" regionDialingFrom:@"001" error:nil]); + XCTAssertFalse( + [_aUtil isPossibleNumberString:@"+800 1234 5678 9" regionDialingFrom:@"001" error:nil]); } - (void)testTruncateTooLongNumber { @@ -1428,60 +1768,60 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat NBPhoneNumber *tooLongNumber = [[NBPhoneNumber alloc] init]; [tooLongNumber setCountryCode:@44]; [tooLongNumber setNationalNumber:@80123456780123]; - + NBPhoneNumber *validNumber = [[NBPhoneNumber alloc] init]; [validNumber setCountryCode:@44]; [validNumber setNationalNumber:@8012345678]; XCTAssertTrue([_aUtil truncateTooLongNumber:tooLongNumber]); XCTAssertTrue([validNumber isEqual:tooLongNumber]); - + // IT number 022 3456 7890, but entered with 3 extra digits at the end. tooLongNumber = [[NBPhoneNumber alloc] init]; [tooLongNumber setCountryCode:@39]; [tooLongNumber setNationalNumber:@2234567890123]; [tooLongNumber setItalianLeadingZero:YES]; - + validNumber = [[NBPhoneNumber alloc] init]; [validNumber setCountryCode:@39]; [validNumber setNationalNumber:@2234567890]; [validNumber setItalianLeadingZero:YES]; XCTAssertTrue([_aUtil truncateTooLongNumber:tooLongNumber]); XCTAssertTrue([validNumber isEqual:tooLongNumber]); - + // US number 650-253-0000, but entered with one additional digit at the end. tooLongNumber = self.usTooLongNumber; XCTAssertTrue([_aUtil truncateTooLongNumber:tooLongNumber]); XCTAssertTrue([self.usNumber isEqual:tooLongNumber]); - + tooLongNumber = self.internationalTollFreeTooLongNumber; XCTAssertTrue([_aUtil truncateTooLongNumber:tooLongNumber]); XCTAssertTrue([self.internationalTollFreeNumber isEqual:tooLongNumber]); - + // Tests what happens when a valid number is passed in. - + NBPhoneNumber *validNumberCopy = [validNumber copy]; XCTAssertTrue([_aUtil truncateTooLongNumber:validNumber]); // Tests the number is not modified. XCTAssertTrue([validNumber isEqual:validNumberCopy]); - + // Tests what happens when a number with invalid prefix is passed in. - + NBPhoneNumber *numberWithInvalidPrefix = [[NBPhoneNumber alloc] init]; // The test metadata says US numbers cannot have prefix 240. [numberWithInvalidPrefix setCountryCode:@1]; [numberWithInvalidPrefix setNationalNumber:@2401234567]; - + NBPhoneNumber *invalidNumberCopy = [numberWithInvalidPrefix copy]; XCTAssertFalse([_aUtil truncateTooLongNumber:numberWithInvalidPrefix]); // Tests the number is not modified. XCTAssertTrue([numberWithInvalidPrefix isEqual:invalidNumberCopy]); - + // Tests what happens when a too short number is passed in. - + NBPhoneNumber *tooShortNumber = [[NBPhoneNumber alloc] init]; [tooShortNumber setCountryCode:@1]; [tooShortNumber setNationalNumber:@1234]; - + NBPhoneNumber *tooShortNumberCopy = [tooShortNumber copy]; XCTAssertFalse([_aUtil truncateTooLongNumber:tooShortNumber]); // Tests the number is not modified. @@ -1524,14 +1864,16 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat // Should not remove plus sign XCTAssertEqualObjects(@"+800-345-600", [_aUtil extractPossibleNumber:@"Tel:+800-345-600"]); // Should recognise wide digits as possible start values. - XCTAssertEqualObjects(@"\uFF10\uFF12\uFF13", [_aUtil extractPossibleNumber:@"\uFF10\uFF12\uFF13"]); + XCTAssertEqualObjects(@"\uFF10\uFF12\uFF13", + [_aUtil extractPossibleNumber:@"\uFF10\uFF12\uFF13"]); // Dashes are not possible start values and should be removed. - XCTAssertEqualObjects(@"\uFF11\uFF12\uFF13", [_aUtil extractPossibleNumber:@"Num-\uFF11\uFF12\uFF13"]); + XCTAssertEqualObjects(@"\uFF11\uFF12\uFF13", + [_aUtil extractPossibleNumber:@"Num-\uFF11\uFF12\uFF13"]); // If not possible number present, return empty string. XCTAssertEqualObjects(@"", [_aUtil extractPossibleNumber:@"Num-...."]); // Leading brackets are stripped - these are not used when parsing. XCTAssertEqualObjects(@"650) 253-0000", [_aUtil extractPossibleNumber:@"(650) 253-0000"]); - + // Trailing non-alpha-numeric characters should be removed. XCTAssertEqualObjects(@"650) 253-0000", [_aUtil extractPossibleNumber:@"(650) 253-0000..- .."]); XCTAssertEqualObjects(@"650) 253-0000", [_aUtil extractPossibleNumber:@"(650) 253-0000."]); @@ -1545,44 +1887,55 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat NSArray *entry = PhoneNumberDescEntryForNationalNumberPattern(@"\\d{4,8}"); NBPhoneNumberDesc *generalDesc = [[NBPhoneNumberDesc alloc] initWithEntry:entry]; [metadata setGeneralDesc:generalDesc]; - + NBPhoneNumber *numberToStrip = [[NBPhoneNumber alloc] init]; [numberToStrip setRawInput:@"34356778"]; - + NSString *strippedNumber = @"356778"; NSString *rawInput = numberToStrip.rawInput; - XCTAssertTrue([_aUtil maybeStripNationalPrefixAndCarrierCode:&rawInput metadata:metadata carrierCode:nil]); + XCTAssertTrue( + [_aUtil maybeStripNationalPrefixAndCarrierCode:&rawInput metadata:metadata carrierCode:nil]); XCTAssertEqualObjects(strippedNumber, rawInput, @"Should have had national prefix stripped."); - + // Retry stripping - now the number should not start with the national prefix, // so no more stripping should occur. - XCTAssertFalse([_aUtil maybeStripNationalPrefixAndCarrierCode:&rawInput metadata:metadata carrierCode:nil]); - XCTAssertEqualObjects(strippedNumber, rawInput, @"Should have had no change - no national prefix present."); - + XCTAssertFalse( + [_aUtil maybeStripNationalPrefixAndCarrierCode:&rawInput metadata:metadata carrierCode:nil]); + XCTAssertEqualObjects(strippedNumber, rawInput, + @"Should have had no change - no national prefix present."); + // Some countries have no national prefix. Repeat test with none specified. [metadata setNationalPrefixForParsing:@""]; - XCTAssertFalse([_aUtil maybeStripNationalPrefixAndCarrierCode:&rawInput metadata:metadata carrierCode:nil]); - XCTAssertEqualObjects(strippedNumber, rawInput, @"Should not strip anything with empty national prefix."); - + XCTAssertFalse( + [_aUtil maybeStripNationalPrefixAndCarrierCode:&rawInput metadata:metadata carrierCode:nil]); + XCTAssertEqualObjects(strippedNumber, rawInput, + @"Should not strip anything with empty national prefix."); + // If the resultant number doesn't match the national rule, it shouldn't be // stripped. [metadata setNationalPrefixForParsing:@"3"]; numberToStrip.rawInput = @"3123"; rawInput = numberToStrip.rawInput; strippedNumber = @"3123"; - XCTAssertFalse([_aUtil maybeStripNationalPrefixAndCarrierCode:&rawInput metadata:metadata carrierCode:nil]); - XCTAssertEqualObjects(strippedNumber, rawInput, @"Should have had no change - after stripping, it would not have matched the national rule."); - + XCTAssertFalse( + [_aUtil maybeStripNationalPrefixAndCarrierCode:&rawInput metadata:metadata carrierCode:nil]); + XCTAssertEqualObjects( + strippedNumber, rawInput, + @"Should have had no change - after stripping, it would not have matched the national rule."); + // Test extracting carrier selection code. [metadata setNationalPrefixForParsing:@"0(81)?"]; numberToStrip.rawInput = @"08122123456"; strippedNumber = @"22123456"; rawInput = numberToStrip.rawInput; NSString *carrierCode = @""; - XCTAssertTrue([_aUtil maybeStripNationalPrefixAndCarrierCode:&rawInput metadata:metadata carrierCode:&carrierCode]); + XCTAssertTrue([_aUtil maybeStripNationalPrefixAndCarrierCode:&rawInput + metadata:metadata + carrierCode:&carrierCode]); XCTAssertEqualObjects(@"81", carrierCode); - XCTAssertEqualObjects(strippedNumber, rawInput, @"Should have had national prefix and carrier code stripped."); - + XCTAssertEqualObjects(strippedNumber, rawInput, + @"Should have had national prefix and carrier code stripped."); + // If there was a transform rule, check it was applied. [metadata setNationalPrefixTransformRule:@"5$15"]; // Note that a capturing group is present here. @@ -1590,268 +1943,368 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat numberToStrip.rawInput = @"031123"; rawInput = numberToStrip.rawInput; NSString *transformedNumber = @"5315123"; - XCTAssertTrue([_aUtil maybeStripNationalPrefixAndCarrierCode:&rawInput metadata:metadata carrierCode:nil]); + XCTAssertTrue( + [_aUtil maybeStripNationalPrefixAndCarrierCode:&rawInput metadata:metadata carrierCode:nil]); XCTAssertEqualObjects(transformedNumber, rawInput, @"Should transform the 031 to a 5315."); } - (void)testMaybeStripInternationalPrefix { NSString *internationalPrefix = @"00[39]"; - + NSString *numberToStripPrefix = @"0034567700-3898003"; - + // Note the dash is removed as part of the normalization. NSString *strippedNumberString = @"45677003898003"; - XCTAssertEqual(NBECountryCodeSourceFROM_NUMBER_WITH_IDD, [_aUtil maybeStripInternationalPrefixAndNormalize:&numberToStripPrefix - possibleIddPrefix:internationalPrefix]); - XCTAssertEqualObjects(strippedNumberString, numberToStripPrefix, @"The number supplied was not stripped of its international prefix."); + XCTAssertEqual(NBECountryCodeSourceFROM_NUMBER_WITH_IDD, + [_aUtil maybeStripInternationalPrefixAndNormalize:&numberToStripPrefix + possibleIddPrefix:internationalPrefix]); + XCTAssertEqualObjects(strippedNumberString, numberToStripPrefix, + @"The number supplied was not stripped of its international prefix."); // Now the number no longer starts with an IDD prefix, so it should now report // FROM_DEFAULT_COUNTRY. - XCTAssertEqual(NBECountryCodeSourceFROM_DEFAULT_COUNTRY, [_aUtil maybeStripInternationalPrefixAndNormalize:&numberToStripPrefix - possibleIddPrefix:internationalPrefix]); - + XCTAssertEqual(NBECountryCodeSourceFROM_DEFAULT_COUNTRY, + [_aUtil maybeStripInternationalPrefixAndNormalize:&numberToStripPrefix + possibleIddPrefix:internationalPrefix]); + numberToStripPrefix = @"00945677003898003"; - XCTAssertEqual(NBECountryCodeSourceFROM_NUMBER_WITH_IDD, [_aUtil maybeStripInternationalPrefixAndNormalize:&numberToStripPrefix - possibleIddPrefix:internationalPrefix]); - XCTAssertEqualObjects(strippedNumberString, numberToStripPrefix, @"The number supplied was not stripped of its international prefix."); + XCTAssertEqual(NBECountryCodeSourceFROM_NUMBER_WITH_IDD, + [_aUtil maybeStripInternationalPrefixAndNormalize:&numberToStripPrefix + possibleIddPrefix:internationalPrefix]); + XCTAssertEqualObjects(strippedNumberString, numberToStripPrefix, + @"The number supplied was not stripped of its international prefix."); // Test it works when the international prefix is broken up by spaces. numberToStripPrefix = @"00 9 45677003898003"; - XCTAssertEqual(NBECountryCodeSourceFROM_NUMBER_WITH_IDD, [_aUtil maybeStripInternationalPrefixAndNormalize:&numberToStripPrefix - possibleIddPrefix:internationalPrefix]); - XCTAssertEqualObjects(strippedNumberString, numberToStripPrefix, @"The number supplied was not stripped of its international prefix."); + XCTAssertEqual(NBECountryCodeSourceFROM_NUMBER_WITH_IDD, + [_aUtil maybeStripInternationalPrefixAndNormalize:&numberToStripPrefix + possibleIddPrefix:internationalPrefix]); + XCTAssertEqualObjects(strippedNumberString, numberToStripPrefix, + @"The number supplied was not stripped of its international prefix."); // Now the number no longer starts with an IDD prefix, so it should now report // FROM_DEFAULT_COUNTRY. - XCTAssertEqual(NBECountryCodeSourceFROM_DEFAULT_COUNTRY, [_aUtil maybeStripInternationalPrefixAndNormalize:&numberToStripPrefix - possibleIddPrefix:internationalPrefix]); - + XCTAssertEqual(NBECountryCodeSourceFROM_DEFAULT_COUNTRY, + [_aUtil maybeStripInternationalPrefixAndNormalize:&numberToStripPrefix + possibleIddPrefix:internationalPrefix]); + // Test the + symbol is also recognised and stripped. numberToStripPrefix = @"+45677003898003"; strippedNumberString = @"45677003898003"; - XCTAssertEqual(NBECountryCodeSourceFROM_NUMBER_WITH_PLUS_SIGN, [_aUtil maybeStripInternationalPrefixAndNormalize:&numberToStripPrefix - possibleIddPrefix:internationalPrefix]); - XCTAssertEqualObjects(strippedNumberString, numberToStripPrefix, @"The number supplied was not stripped of the plus symbol."); - + XCTAssertEqual(NBECountryCodeSourceFROM_NUMBER_WITH_PLUS_SIGN, + [_aUtil maybeStripInternationalPrefixAndNormalize:&numberToStripPrefix + possibleIddPrefix:internationalPrefix]); + XCTAssertEqualObjects(strippedNumberString, numberToStripPrefix, + @"The number supplied was not stripped of the plus symbol."); + // If the number afterwards is a zero, we should not strip this - no country // calling code begins with 0. numberToStripPrefix = @"0090112-3123"; strippedNumberString = @"00901123123"; - XCTAssertEqual(NBECountryCodeSourceFROM_DEFAULT_COUNTRY, [_aUtil maybeStripInternationalPrefixAndNormalize:&numberToStripPrefix - possibleIddPrefix:internationalPrefix]); - XCTAssertEqualObjects(strippedNumberString, numberToStripPrefix, @"The number supplied had a 0 after the match so should not be stripped."); + XCTAssertEqual(NBECountryCodeSourceFROM_DEFAULT_COUNTRY, + [_aUtil maybeStripInternationalPrefixAndNormalize:&numberToStripPrefix + possibleIddPrefix:internationalPrefix]); + XCTAssertEqualObjects(strippedNumberString, numberToStripPrefix, + @"The number supplied had a 0 after the match so should not be stripped."); // Here the 0 is separated by a space from the IDD. numberToStripPrefix = @"009 0-112-3123"; - XCTAssertEqual(NBECountryCodeSourceFROM_DEFAULT_COUNTRY, [_aUtil maybeStripInternationalPrefixAndNormalize:&numberToStripPrefix - possibleIddPrefix:internationalPrefix]); + XCTAssertEqual(NBECountryCodeSourceFROM_DEFAULT_COUNTRY, + [_aUtil maybeStripInternationalPrefixAndNormalize:&numberToStripPrefix + possibleIddPrefix:internationalPrefix]); } - (void)testMaybeExtractCountryCode { NBPhoneNumber *number = [[NBPhoneNumber alloc] init]; NBPhoneMetaData *metadata = [self.helper getMetadataForRegion:@"US"]; - + // Note that for the US, the IDD is 011. NSString *phoneNumber = @"011112-3456789"; NSString *strippedNumber = @"123456789"; NSNumber *countryCallingCode = @1; - + NSString *numberToFill = @""; - + { NSError *anError = nil; - XCTAssertEqualObjects(countryCallingCode, [_aUtil maybeExtractCountryCode:phoneNumber metadata:metadata - nationalNumber:&numberToFill keepRawInput:YES phoneNumber:&number error:&anError]); - XCTAssertEqual(NBECountryCodeSourceFROM_NUMBER_WITH_IDD, [number.countryCodeSource integerValue]); + XCTAssertEqualObjects(countryCallingCode, [_aUtil maybeExtractCountryCode:phoneNumber + metadata:metadata + nationalNumber:&numberToFill + keepRawInput:YES + phoneNumber:&number + error:&anError]); + XCTAssertEqual(NBECountryCodeSourceFROM_NUMBER_WITH_IDD, + [number.countryCodeSource integerValue]); // Should strip and normalize national significant number. XCTAssertEqualObjects(strippedNumber, numberToFill); - if (anError) - XCTFail(@"Should not have thrown an exception: %@", anError.description); + if (anError) XCTFail(@"Should not have thrown an exception: %@", anError.description); } - XCTAssertEqual(NBECountryCodeSourceFROM_NUMBER_WITH_IDD, [number.countryCodeSource integerValue], @"Did not figure out CountryCodeSource correctly"); + XCTAssertEqual(NBECountryCodeSourceFROM_NUMBER_WITH_IDD, [number.countryCodeSource integerValue], + @"Did not figure out CountryCodeSource correctly"); // Should strip and normalize national significant number. - XCTAssertEqualObjects(strippedNumber, numberToFill, @"Did not strip off the country calling code correctly."); - + XCTAssertEqualObjects(strippedNumber, numberToFill, + @"Did not strip off the country calling code correctly."); + number = [[NBPhoneNumber alloc] init]; phoneNumber = @"+6423456789"; countryCallingCode = @64; numberToFill = @""; - XCTAssertEqualObjects(countryCallingCode, [_aUtil maybeExtractCountryCode:phoneNumber metadata:metadata - nationalNumber:&numberToFill keepRawInput:YES phoneNumber:&number error:nil]); - XCTAssertEqual(NBECountryCodeSourceFROM_NUMBER_WITH_PLUS_SIGN, [number.countryCodeSource integerValue], @"Did not figure out CountryCodeSource correctly"); - + XCTAssertEqualObjects(countryCallingCode, [_aUtil maybeExtractCountryCode:phoneNumber + metadata:metadata + nationalNumber:&numberToFill + keepRawInput:YES + phoneNumber:&number + error:nil]); + XCTAssertEqual(NBECountryCodeSourceFROM_NUMBER_WITH_PLUS_SIGN, + [number.countryCodeSource integerValue], + @"Did not figure out CountryCodeSource correctly"); + number = [[NBPhoneNumber alloc] init]; phoneNumber = @"+80012345678"; countryCallingCode = @800; numberToFill = @""; - XCTAssertEqualObjects(countryCallingCode, [_aUtil maybeExtractCountryCode:phoneNumber metadata:metadata - nationalNumber:&numberToFill keepRawInput:YES phoneNumber:&number error:nil]); - XCTAssertEqual(NBECountryCodeSourceFROM_NUMBER_WITH_PLUS_SIGN, [number.countryCodeSource integerValue], @"Did not figure out CountryCodeSource correctly"); - + XCTAssertEqualObjects(countryCallingCode, [_aUtil maybeExtractCountryCode:phoneNumber + metadata:metadata + nationalNumber:&numberToFill + keepRawInput:YES + phoneNumber:&number + error:nil]); + XCTAssertEqual(NBECountryCodeSourceFROM_NUMBER_WITH_PLUS_SIGN, + [number.countryCodeSource integerValue], + @"Did not figure out CountryCodeSource correctly"); + number = [[NBPhoneNumber alloc] init]; phoneNumber = @"2345-6789"; numberToFill = @""; - XCTAssertEqual(@0, [_aUtil maybeExtractCountryCode:phoneNumber metadata:metadata - nationalNumber:&numberToFill keepRawInput:YES phoneNumber:&number error:nil]); - XCTAssertEqual(NBECountryCodeSourceFROM_DEFAULT_COUNTRY, [number.countryCodeSource integerValue], @"Did not figure out CountryCodeSource correctly"); - - + XCTAssertEqual(@0, [_aUtil maybeExtractCountryCode:phoneNumber + metadata:metadata + nationalNumber:&numberToFill + keepRawInput:YES + phoneNumber:&number + error:nil]); + XCTAssertEqual(NBECountryCodeSourceFROM_DEFAULT_COUNTRY, [number.countryCodeSource integerValue], + @"Did not figure out CountryCodeSource correctly"); + number = [[NBPhoneNumber alloc] init]; phoneNumber = @"0119991123456789"; numberToFill = @""; { NSError *anError = nil; - [_aUtil maybeExtractCountryCode:phoneNumber metadata:metadata - nationalNumber:&numberToFill keepRawInput:YES phoneNumber:&number error:&anError]; + [_aUtil maybeExtractCountryCode:phoneNumber + metadata:metadata + nationalNumber:&numberToFill + keepRawInput:YES + phoneNumber:&number + error:&anError]; if (anError == nil) XCTFail(@"Should have thrown an exception, no valid country calling code present."); - else // Expected. + else // Expected. XCTAssertEqualObjects(@"INVALID_COUNTRY_CODE", anError.domain); } - + number = [[NBPhoneNumber alloc] init]; phoneNumber = @"(1 610) 619 4466"; countryCallingCode = @1; numberToFill = @""; { NSError *anError = nil; - XCTAssertEqualObjects(countryCallingCode, [_aUtil maybeExtractCountryCode:phoneNumber metadata:metadata - nationalNumber:&numberToFill keepRawInput:YES phoneNumber:&number error:&anError], - @"Should have extracted the country calling code of the region passed in"); - XCTAssertEqual(NBECountryCodeSourceFROM_NUMBER_WITHOUT_PLUS_SIGN, [number.countryCodeSource integerValue], @"Did not figure out CountryCodeSource correctly"); + XCTAssertEqualObjects( + countryCallingCode, + [_aUtil maybeExtractCountryCode:phoneNumber + metadata:metadata + nationalNumber:&numberToFill + keepRawInput:YES + phoneNumber:&number + error:&anError], + @"Should have extracted the country calling code of the region passed in"); + XCTAssertEqual(NBECountryCodeSourceFROM_NUMBER_WITHOUT_PLUS_SIGN, + [number.countryCodeSource integerValue], + @"Did not figure out CountryCodeSource correctly"); } - + number = [[NBPhoneNumber alloc] init]; phoneNumber = @"(1 610) 619 4466"; countryCallingCode = @1; numberToFill = @""; { NSError *anError = nil; - XCTAssertEqualObjects(countryCallingCode, [_aUtil maybeExtractCountryCode:phoneNumber metadata:metadata - nationalNumber:&numberToFill keepRawInput:NO phoneNumber:&number error:&anError]); + XCTAssertEqualObjects(countryCallingCode, [_aUtil maybeExtractCountryCode:phoneNumber + metadata:metadata + nationalNumber:&numberToFill + keepRawInput:NO + phoneNumber:&number + error:&anError]); } - + number = [[NBPhoneNumber alloc] init]; phoneNumber = @"(1 610) 619 446"; numberToFill = @""; { NSError *anError = nil; - XCTAssertEqualObjects(@0, [_aUtil maybeExtractCountryCode:phoneNumber metadata:metadata - nationalNumber:&numberToFill keepRawInput:NO phoneNumber:&number error:&anError]); + XCTAssertEqualObjects(@0, [_aUtil maybeExtractCountryCode:phoneNumber + metadata:metadata + nationalNumber:&numberToFill + keepRawInput:NO + phoneNumber:&number + error:&anError]); XCTAssertFalse(number.countryCodeSource != nil, @"Should not contain CountryCodeSource."); } - + number = [[NBPhoneNumber alloc] init]; phoneNumber = @"(1 610) 619"; numberToFill = @""; { NSError *anError = nil; - XCTAssertEqual(@0, [_aUtil maybeExtractCountryCode:phoneNumber metadata:metadata - nationalNumber:&numberToFill keepRawInput:YES phoneNumber:&number error:&anError]); - XCTAssertEqual(NBECountryCodeSourceFROM_DEFAULT_COUNTRY, [number.countryCodeSource integerValue]); + XCTAssertEqual(@0, [_aUtil maybeExtractCountryCode:phoneNumber + metadata:metadata + nationalNumber:&numberToFill + keepRawInput:YES + phoneNumber:&number + error:&anError]); + XCTAssertEqual(NBECountryCodeSourceFROM_DEFAULT_COUNTRY, + [number.countryCodeSource integerValue]); } } - - (void)testParseNationalNumber { NSError *anError; // National prefix attached. - XCTAssertTrue([self.nzNumber isEqual:[_aUtil parse:@"033316005" defaultRegion:@"NZ" error:&anError]]); - XCTAssertTrue([self.nzNumber isEqual:[_aUtil parse:@"33316005" defaultRegion:@"NZ" error:&anError]]); - + XCTAssertTrue( + [self.nzNumber isEqual:[_aUtil parse:@"033316005" defaultRegion:@"NZ" error:&anError]]); + XCTAssertTrue( + [self.nzNumber isEqual:[_aUtil parse:@"33316005" defaultRegion:@"NZ" error:&anError]]); + // National prefix attached and some formatting present. - XCTAssertTrue([self.nzNumber isEqual:[_aUtil parse:@"03-331 6005" defaultRegion:@"NZ" error:&anError]]); - XCTAssertTrue([self.nzNumber isEqual:[_aUtil parse:@"03 331 6005" defaultRegion:@"NZ" error:&anError]]); - + XCTAssertTrue( + [self.nzNumber isEqual:[_aUtil parse:@"03-331 6005" defaultRegion:@"NZ" error:&anError]]); + XCTAssertTrue( + [self.nzNumber isEqual:[_aUtil parse:@"03 331 6005" defaultRegion:@"NZ" error:&anError]]); + // Test parsing RFC3966 format with a phone context. - XCTAssertTrue([self.nzNumber isEqual:[_aUtil parse:@"tel:03-331-6005;phone-context=+64" defaultRegion:@"NZ" error:&anError]]); - XCTAssertTrue([self.nzNumber isEqual:[_aUtil parse:@"tel:331-6005;phone-context=+64-3" defaultRegion:@"NZ" error:&anError]]); - XCTAssertTrue([self.nzNumber isEqual:[_aUtil parse:@"tel:331-6005;phone-context=+64-3" defaultRegion:@"US" error:&anError]]); - + XCTAssertTrue([self.nzNumber isEqual:[_aUtil parse:@"tel:03-331-6005;phone-context=+64" + defaultRegion:@"NZ" + error:&anError]]); + XCTAssertTrue([self.nzNumber isEqual:[_aUtil parse:@"tel:331-6005;phone-context=+64-3" + defaultRegion:@"NZ" + error:&anError]]); + XCTAssertTrue([self.nzNumber isEqual:[_aUtil parse:@"tel:331-6005;phone-context=+64-3" + defaultRegion:@"US" + error:&anError]]); + // Test parsing RFC3966 format with optional user-defined parameters. The // parameters will appear after the context if present. - XCTAssertTrue([self.nzNumber isEqual:[_aUtil parse:@"tel:03-331-6005;phone-context=+64;a=%A1" defaultRegion:@"NZ" error:&anError]]); - + XCTAssertTrue([self.nzNumber isEqual:[_aUtil parse:@"tel:03-331-6005;phone-context=+64;a=%A1" + defaultRegion:@"NZ" + error:&anError]]); + // Test parsing RFC3966 with an ISDN subaddress. - XCTAssertTrue([self.nzNumber isEqual:[_aUtil parse:@"tel:03-331-6005;isub=12345;phone-context=+64" defaultRegion:@"NZ" error:&anError]]); - XCTAssertTrue([self.nzNumber isEqual:[_aUtil parse:@"tel:+64-3-331-6005;isub=12345" defaultRegion:@"NZ" error:&anError]]); - + XCTAssertTrue([self.nzNumber isEqual:[_aUtil parse:@"tel:03-331-6005;isub=12345;phone-context=+64" + defaultRegion:@"NZ" + error:&anError]]); + XCTAssertTrue([self.nzNumber + isEqual:[_aUtil parse:@"tel:+64-3-331-6005;isub=12345" defaultRegion:@"NZ" error:&anError]]); + // Testing international prefixes. // Should strip country calling code. - XCTAssertTrue([self.nzNumber isEqual:[_aUtil parse:@"0064 3 331 6005" defaultRegion:@"NZ" error:&anError]]); - + XCTAssertTrue( + [self.nzNumber isEqual:[_aUtil parse:@"0064 3 331 6005" defaultRegion:@"NZ" error:&anError]]); + // Try again, but this time we have an international number with Region Code // US. It should recognise the country calling code and parse accordingly. - XCTAssertTrue([self.nzNumber isEqual:[_aUtil parse:@"01164 3 331 6005" defaultRegion:@"US" error:&anError]]); - XCTAssertTrue([self.nzNumber isEqual:[_aUtil parse:@"+64 3 331 6005" defaultRegion:@"US" error:&anError]]); + XCTAssertTrue([self.nzNumber + isEqual:[_aUtil parse:@"01164 3 331 6005" defaultRegion:@"US" error:&anError]]); + XCTAssertTrue( + [self.nzNumber isEqual:[_aUtil parse:@"+64 3 331 6005" defaultRegion:@"US" error:&anError]]); // We should ignore the leading plus here, since it is not followed by a valid // country code but instead is followed by the IDD for the US. - XCTAssertTrue([self.nzNumber isEqual:[_aUtil parse:@"+01164 3 331 6005" defaultRegion:@"US" error:&anError]]); - XCTAssertTrue([self.nzNumber isEqual:[_aUtil parse:@"+0064 3 331 6005" defaultRegion:@"NZ" error:&anError]]); - XCTAssertTrue([self.nzNumber isEqual:[_aUtil parse:@"+ 00 64 3 331 6005" defaultRegion:@"NZ" error:&anError]]); - - XCTAssertTrue([self.usLocalNumber isEqual:[_aUtil parse:@"tel:253-0000;phone-context=www.google.com" defaultRegion:@"US" error:&anError]]); - XCTAssertTrue([self.usLocalNumber isEqual:[_aUtil parse:@"tel:253-0000;isub=12345;phone-context=www.google.com" defaultRegion:@"US" error:&anError]]); + XCTAssertTrue([self.nzNumber + isEqual:[_aUtil parse:@"+01164 3 331 6005" defaultRegion:@"US" error:&anError]]); + XCTAssertTrue([self.nzNumber + isEqual:[_aUtil parse:@"+0064 3 331 6005" defaultRegion:@"NZ" error:&anError]]); + XCTAssertTrue([self.nzNumber + isEqual:[_aUtil parse:@"+ 00 64 3 331 6005" defaultRegion:@"NZ" error:&anError]]); + + XCTAssertTrue( + [self.usLocalNumber isEqual:[_aUtil parse:@"tel:253-0000;phone-context=www.google.com" + defaultRegion:@"US" + error:&anError]]); + XCTAssertTrue([self.usLocalNumber + isEqual:[_aUtil parse:@"tel:253-0000;isub=12345;phone-context=www.google.com" + defaultRegion:@"US" + error:&anError]]); // This is invalid because no "+" sign is present as part of phone-context. // The phone context is simply ignored in this case just as if it contains a // domain. - XCTAssertTrue([self.usLocalNumber isEqual:[_aUtil parse:@"tel:2530000;isub=12345;phone-context=1-650" defaultRegion:@"US" error:&anError]]); - XCTAssertTrue([self.usLocalNumber isEqual:[_aUtil parse:@"tel:2530000;isub=12345;phone-context=1234.com" defaultRegion:@"US" error:&anError]]); - + XCTAssertTrue( + [self.usLocalNumber isEqual:[_aUtil parse:@"tel:2530000;isub=12345;phone-context=1-650" + defaultRegion:@"US" + error:&anError]]); + XCTAssertTrue( + [self.usLocalNumber isEqual:[_aUtil parse:@"tel:2530000;isub=12345;phone-context=1234.com" + defaultRegion:@"US" + error:&anError]]); + NBPhoneNumber *nzNumber = [[NBPhoneNumber alloc] init]; [nzNumber setCountryCode:@64]; [nzNumber setNationalNumber:@64123456]; - XCTAssertTrue([nzNumber isEqual:[_aUtil parse:@"64(0)64123456" defaultRegion:@"NZ" error:&anError]]); + XCTAssertTrue( + [nzNumber isEqual:[_aUtil parse:@"64(0)64123456" defaultRegion:@"NZ" error:&anError]]); // Check that using a '/' is fine in a phone number. - XCTAssertTrue([self.deNumber isEqual:[_aUtil parse:@"301/23456" defaultRegion:@"DE" error:&anError]]); - + XCTAssertTrue( + [self.deNumber isEqual:[_aUtil parse:@"301/23456" defaultRegion:@"DE" error:&anError]]); + NBPhoneNumber *usNumber = [[NBPhoneNumber alloc] init]; // Check it doesn't use the '1' as a country calling code when parsing if the // phone number was already possible. [usNumber setCountryCode:@1]; [usNumber setNationalNumber:@1234567890]; - XCTAssertTrue([usNumber isEqual:[_aUtil parse:@"123-456-7890" defaultRegion:@"US" error:&anError]]); - + XCTAssertTrue( + [usNumber isEqual:[_aUtil parse:@"123-456-7890" defaultRegion:@"US" error:&anError]]); + // Test star numbers. Although this is not strictly valid, we would like to // make sure we can parse the output we produce when formatting the number. NBPhoneNumber *jpStarNumber = [[NBPhoneNumber alloc] init]; jpStarNumber.countryCode = @81; jpStarNumber.nationalNumber = @2345; - XCTAssertTrue([jpStarNumber isEqual:[_aUtil parse:@"+81 *2345" defaultRegion:@"JP" error:&anError]]); - + XCTAssertTrue( + [jpStarNumber isEqual:[_aUtil parse:@"+81 *2345" defaultRegion:@"JP" error:&anError]]); + NBPhoneNumber *shortNumber = [[NBPhoneNumber alloc] init]; [shortNumber setCountryCode:@64]; [shortNumber setNationalNumber:@12]; XCTAssertTrue([shortNumber isEqual:[_aUtil parse:@"12" defaultRegion:@"NZ" error:&anError]]); } - - (void)testParseNumberWithAlphaCharacters { NSError *anError; // Test case with alpha characters. NBPhoneNumber *tollfreeNumber = [[NBPhoneNumber alloc] init]; [tollfreeNumber setCountryCode:@64]; [tollfreeNumber setNationalNumber:@800332005]; - XCTAssertTrue([tollfreeNumber isEqual:[_aUtil parse:@"0800 DDA 005" defaultRegion:@"NZ" error:&anError]]); - + XCTAssertTrue( + [tollfreeNumber isEqual:[_aUtil parse:@"0800 DDA 005" defaultRegion:@"NZ" error:&anError]]); + NBPhoneNumber *premiumNumber = [[NBPhoneNumber alloc] init]; [premiumNumber setCountryCode:@64]; [premiumNumber setNationalNumber:@9003326005]; - XCTAssertTrue([premiumNumber isEqual:[_aUtil parse:@"0900 DDA 6005" defaultRegion:@"NZ" error:&anError]]); + XCTAssertTrue( + [premiumNumber isEqual:[_aUtil parse:@"0900 DDA 6005" defaultRegion:@"NZ" error:&anError]]); // Not enough alpha characters for them to be considered intentional, so they // are stripped. - XCTAssertTrue([premiumNumber isEqual:[_aUtil parse:@"0900 332 6005a" defaultRegion:@"NZ" error:&anError]]); - XCTAssertTrue([premiumNumber isEqual:[_aUtil parse:@"0900 332 600a5" defaultRegion:@"NZ" error:&anError]]); - XCTAssertTrue([premiumNumber isEqual:[_aUtil parse:@"0900 332 600A5" defaultRegion:@"NZ" error:&anError]]); - XCTAssertTrue([premiumNumber isEqual:[_aUtil parse:@"0900 a332 600A5" defaultRegion:@"NZ" error:&anError]]); + XCTAssertTrue( + [premiumNumber isEqual:[_aUtil parse:@"0900 332 6005a" defaultRegion:@"NZ" error:&anError]]); + XCTAssertTrue( + [premiumNumber isEqual:[_aUtil parse:@"0900 332 600a5" defaultRegion:@"NZ" error:&anError]]); + XCTAssertTrue( + [premiumNumber isEqual:[_aUtil parse:@"0900 332 600A5" defaultRegion:@"NZ" error:&anError]]); + XCTAssertTrue( + [premiumNumber isEqual:[_aUtil parse:@"0900 a332 600A5" defaultRegion:@"NZ" error:&anError]]); } - - (void)testParseMaliciousInput { // Lots of leading + signs before the possible number. - + NSString *maliciousNumber = @""; - for (int i=0; i<6000; i++) - { + for (int i = 0; i < 6000; i++) { maliciousNumber = [maliciousNumber stringByAppendingString:@"+"]; } - + maliciousNumber = [maliciousNumber stringByAppendingString:@"12222-33-244 extensioB 343+"]; { NSError *anError = nil; @@ -1862,58 +2315,74 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat XCTAssertEqualObjects(@"TOO_LONG", anError.domain, @"Wrong error type stored in exception."); } } - + NSString *maliciousNumberWithAlmostExt = @""; - for (int i=0; i<350; i++) - { + for (int i = 0; i < 350; i++) { maliciousNumberWithAlmostExt = [maliciousNumberWithAlmostExt stringByAppendingString:@"200"]; } - + [maliciousNumberWithAlmostExt stringByAppendingString:@" extensiOB 345"]; - + { NSError *anError = nil; [_aUtil parse:maliciousNumberWithAlmostExt defaultRegion:@"US" error:&anError]; if (anError == nil) { - XCTFail(@"This should not parse without throwing an exception %@", maliciousNumberWithAlmostExt); + XCTFail(@"This should not parse without throwing an exception %@", + maliciousNumberWithAlmostExt); } else { XCTAssertEqualObjects(@"TOO_LONG", anError.domain, @"Wrong error type stored in exception."); } } } - - (void)testParseWithInternationalPrefixes { NSError *anError = nil; - XCTAssertTrue([self.usNumber isEqual:[_aUtil parse:@"+1 (650) 253-0000" defaultRegion:@"NZ" error:&anError]]); - XCTAssertTrue([self.internationalTollFreeNumber isEqual:[_aUtil parse:@"011 800 1234 5678" defaultRegion:@"US" error:&anError]]); - XCTAssertTrue([self.usNumber isEqual:[_aUtil parse:@"1-650-253-0000" defaultRegion:@"US" error:&anError]]); + XCTAssertTrue([self.usNumber + isEqual:[_aUtil parse:@"+1 (650) 253-0000" defaultRegion:@"NZ" error:&anError]]); + XCTAssertTrue([self.internationalTollFreeNumber + isEqual:[_aUtil parse:@"011 800 1234 5678" defaultRegion:@"US" error:&anError]]); + XCTAssertTrue( + [self.usNumber isEqual:[_aUtil parse:@"1-650-253-0000" defaultRegion:@"US" error:&anError]]); // Calling the US number from Singapore by using different service providers // 1st test: calling using SingTel IDD service (IDD is 001) - XCTAssertTrue([self.usNumber isEqual:[_aUtil parse:@"0011-650-253-0000" defaultRegion:@"SG" error:&anError]]); + XCTAssertTrue([self.usNumber + isEqual:[_aUtil parse:@"0011-650-253-0000" defaultRegion:@"SG" error:&anError]]); // 2nd test: calling using StarHub IDD service (IDD is 008) - XCTAssertTrue([self.usNumber isEqual:[_aUtil parse:@"0081-650-253-0000" defaultRegion:@"SG" error:&anError]]); + XCTAssertTrue([self.usNumber + isEqual:[_aUtil parse:@"0081-650-253-0000" defaultRegion:@"SG" error:&anError]]); // 3rd test: calling using SingTel V019 service (IDD is 019) - XCTAssertTrue([self.usNumber isEqual:[_aUtil parse:@"0191-650-253-0000" defaultRegion:@"SG" error:&anError]]); + XCTAssertTrue([self.usNumber + isEqual:[_aUtil parse:@"0191-650-253-0000" defaultRegion:@"SG" error:&anError]]); // Calling the US number from Poland - XCTAssertTrue([self.usNumber isEqual:[_aUtil parse:@"0~01-650-253-0000" defaultRegion:@"PL" error:&anError]]); + XCTAssertTrue([self.usNumber + isEqual:[_aUtil parse:@"0~01-650-253-0000" defaultRegion:@"PL" error:&anError]]); // Using '++' at the start. - XCTAssertTrue([self.usNumber isEqual:[_aUtil parse:@"++1 (650) 253-0000" defaultRegion:@"PL" error:&anError]]); + XCTAssertTrue([self.usNumber + isEqual:[_aUtil parse:@"++1 (650) 253-0000" defaultRegion:@"PL" error:&anError]]); } - - (void)testParseNonAscii { NSError *anError = nil; // Using a full-width plus sign. - XCTAssertTrue([self.usNumber isEqual:[_aUtil parse:@"\uFF0B1 (650) 253-0000" defaultRegion:@"SG" error:&anError]]); + XCTAssertTrue([self.usNumber + isEqual:[_aUtil parse:@"\uFF0B1 (650) 253-0000" defaultRegion:@"SG" error:&anError]]); // Using a soft hyphen U+00AD. - XCTAssertTrue([self.usNumber isEqual:[_aUtil parse:@"1 (650) 253\u00AD-0000" defaultRegion:@"US" error:&anError]]); + XCTAssertTrue([self.usNumber + isEqual:[_aUtil parse:@"1 (650) 253\u00AD-0000" defaultRegion:@"US" error:&anError]]); // The whole number, including punctuation, is here represented in full-width // form. - XCTAssertTrue([self.usNumber isEqual:[_aUtil parse:@"\uFF0B\uFF11\u3000\uFF08\uFF16\uFF15\uFF10\uFF09\u3000\uFF12\uFF15\uFF13\uFF0D\uFF10\uFF10\uFF10\uFF10" defaultRegion:@"SG" error:&anError]]); + XCTAssertTrue( + [self.usNumber isEqual:[_aUtil parse:@"\uFF0B\uFF11\u3000\uFF08\uFF16\uFF15\uFF10\uFF09\u3000" + @"\uFF12\uFF15\uFF13\uFF0D\uFF10\uFF10\uFF10\uFF10" + defaultRegion:@"SG" + error:&anError]]); // Using U+30FC dash instead. - XCTAssertTrue([self.usNumber isEqual:[_aUtil parse:@"\uFF0B\uFF11\u3000\uFF08\uFF16\uFF15\uFF10\uFF09\u3000\uFF12\uFF15\uFF13\u30FC\uFF10\uFF10\uFF10\uFF10" defaultRegion:@"SG" error:&anError]]); - + XCTAssertTrue( + [self.usNumber isEqual:[_aUtil parse:@"\uFF0B\uFF11\u3000\uFF08\uFF16\uFF15\uFF10\uFF09\u3000" + @"\uFF12\uFF15\uFF13\u30FC\uFF10\uFF10\uFF10\uFF10" + defaultRegion:@"SG" + error:&anError]]); + // Using a very strange decimal digit range (Mongolian digits). // TODO(user): Support Mongolian digits // STAssertTrue(self.usNumber isEqual: @@ -1921,57 +2390,73 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat // '\u1812\u1815\u1813 \u1810\u1810\u1810\u1810" defaultRegion:@"US"], nil); } - - (void)testParseWithLeadingZero { NSError *anError = nil; - XCTAssertTrue([self.itNumber isEqual:[_aUtil parse:@"+39 02-36618 300" defaultRegion:@"NZ" error:&anError]]); - XCTAssertTrue([self.itNumber isEqual:[_aUtil parse:@"02-36618 300" defaultRegion:@"IT" error:&anError]]); - XCTAssertTrue([self.itMobile isEqual:[_aUtil parse:@"345 678 901" defaultRegion:@"IT" error:&anError]]); + XCTAssertTrue([self.itNumber + isEqual:[_aUtil parse:@"+39 02-36618 300" defaultRegion:@"NZ" error:&anError]]); + XCTAssertTrue( + [self.itNumber isEqual:[_aUtil parse:@"02-36618 300" defaultRegion:@"IT" error:&anError]]); + XCTAssertTrue( + [self.itMobile isEqual:[_aUtil parse:@"345 678 901" defaultRegion:@"IT" error:&anError]]); } - - (void)testParseNationalNumberArgentina { NSError *anError = nil; // Test parsing mobile numbers of Argentina. NBPhoneNumber *arNumber = [[NBPhoneNumber alloc] init]; [arNumber setCountryCode:@54]; [arNumber setNationalNumber:@93435551212]; - XCTAssertTrue([arNumber isEqual:[_aUtil parse:@"+54 9 343 555 1212" defaultRegion:@"AR" error:&anError]]); - XCTAssertTrue([arNumber isEqual:[_aUtil parse:@"0343 15 555 1212" defaultRegion:@"AR" error:&anError]]); - + XCTAssertTrue( + [arNumber isEqual:[_aUtil parse:@"+54 9 343 555 1212" defaultRegion:@"AR" error:&anError]]); + XCTAssertTrue( + [arNumber isEqual:[_aUtil parse:@"0343 15 555 1212" defaultRegion:@"AR" error:&anError]]); + arNumber = [[NBPhoneNumber alloc] init]; [arNumber setCountryCode:@54]; [arNumber setNationalNumber:@93715654320]; - XCTAssertTrue([arNumber isEqual:[_aUtil parse:@"+54 9 3715 65 4320" defaultRegion:@"AR" error:&anError]]); - XCTAssertTrue([arNumber isEqual:[_aUtil parse:@"03715 15 65 4320" defaultRegion:@"AR" error:&anError]]); - XCTAssertTrue([self.arMobile isEqual:[_aUtil parse:@"911 876 54321" defaultRegion:@"AR" error:&anError]]); - + XCTAssertTrue( + [arNumber isEqual:[_aUtil parse:@"+54 9 3715 65 4320" defaultRegion:@"AR" error:&anError]]); + XCTAssertTrue( + [arNumber isEqual:[_aUtil parse:@"03715 15 65 4320" defaultRegion:@"AR" error:&anError]]); + XCTAssertTrue( + [self.arMobile isEqual:[_aUtil parse:@"911 876 54321" defaultRegion:@"AR" error:&anError]]); + // Test parsing fixed-line numbers of Argentina. - XCTAssertTrue([self.arNumber isEqual:[_aUtil parse:@"+54 11 8765 4321" defaultRegion:@"AR" error:&anError]]); - XCTAssertTrue([self.arNumber isEqual:[_aUtil parse:@"011 8765 4321" defaultRegion:@"AR" error:&anError]]); - + XCTAssertTrue([self.arNumber + isEqual:[_aUtil parse:@"+54 11 8765 4321" defaultRegion:@"AR" error:&anError]]); + XCTAssertTrue( + [self.arNumber isEqual:[_aUtil parse:@"011 8765 4321" defaultRegion:@"AR" error:&anError]]); + arNumber = [[NBPhoneNumber alloc] init]; [arNumber setCountryCode:@54]; [arNumber setNationalNumber:@3715654321]; - XCTAssertTrue([arNumber isEqual:[_aUtil parse:@"+54 3715 65 4321" defaultRegion:@"AR" error:&anError]]); - XCTAssertTrue([arNumber isEqual:[_aUtil parse:@"03715 65 4321" defaultRegion:@"AR" error:&anError]]); - + XCTAssertTrue( + [arNumber isEqual:[_aUtil parse:@"+54 3715 65 4321" defaultRegion:@"AR" error:&anError]]); + XCTAssertTrue( + [arNumber isEqual:[_aUtil parse:@"03715 65 4321" defaultRegion:@"AR" error:&anError]]); + arNumber = [[NBPhoneNumber alloc] init]; [arNumber setCountryCode:@54]; [arNumber setNationalNumber:@2312340000]; - XCTAssertTrue([arNumber isEqual:[_aUtil parse:@"+54 23 1234 0000" defaultRegion:@"AR" error:&anError]]); - XCTAssertTrue([arNumber isEqual:[_aUtil parse:@"023 1234 0000" defaultRegion:@"AR" error:&anError]]); + XCTAssertTrue( + [arNumber isEqual:[_aUtil parse:@"+54 23 1234 0000" defaultRegion:@"AR" error:&anError]]); + XCTAssertTrue( + [arNumber isEqual:[_aUtil parse:@"023 1234 0000" defaultRegion:@"AR" error:&anError]]); } - (void)testParseWithXInNumber { NSError *anError = nil; // Test that having an 'x' in the phone number at the start is ok and that it // just gets removed. - XCTAssertTrue([self.arNumber isEqual:[_aUtil parse:@"01187654321" defaultRegion:@"AR" error:&anError]]); - XCTAssertTrue([self.arNumber isEqual:[_aUtil parse:@"(0) 1187654321" defaultRegion:@"AR" error:&anError]]); - XCTAssertTrue([self.arNumber isEqual:[_aUtil parse:@"0 1187654321" defaultRegion:@"AR" error:&anError]]); - XCTAssertTrue([self.arNumber isEqual:[_aUtil parse:@"(0xx) 1187654321" defaultRegion:@"AR" error:&anError]]); - + XCTAssertTrue( + [self.arNumber isEqual:[_aUtil parse:@"01187654321" defaultRegion:@"AR" error:&anError]]); + XCTAssertTrue( + [self.arNumber isEqual:[_aUtil parse:@"(0) 1187654321" defaultRegion:@"AR" error:&anError]]); + XCTAssertTrue( + [self.arNumber isEqual:[_aUtil parse:@"0 1187654321" defaultRegion:@"AR" error:&anError]]); + XCTAssertTrue([self.arNumber + isEqual:[_aUtil parse:@"(0xx) 1187654321" defaultRegion:@"AR" error:&anError]]); + id arFromUs = [[NBPhoneNumber alloc] init]; [arFromUs setCountryCode:@54]; [arFromUs setNationalNumber:@81429712]; @@ -1980,103 +2465,113 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat // extension, as we allow extensions up to 7 digits. This assumption is okay // for now as all the countries where a carrier selection code is written in // the form of xx have a national significant number of length larger than 7. - XCTAssertTrue([arFromUs isEqual:[_aUtil parse:@"011xx5481429712" defaultRegion:@"US" error:&anError]]); + XCTAssertTrue( + [arFromUs isEqual:[_aUtil parse:@"011xx5481429712" defaultRegion:@"US" error:&anError]]); } - - (void)testParseNumbersMexico { NSError *anError = nil; // Test parsing fixed-line numbers of Mexico. - + id mxNumber = [[NBPhoneNumber alloc] init]; [mxNumber setCountryCode:@52]; [mxNumber setNationalNumber:@4499780001]; - XCTAssertTrue([mxNumber isEqual:[_aUtil parse:@"+52 (449)978-0001" defaultRegion:@"MX" error:&anError]]); - XCTAssertTrue([mxNumber isEqual:[_aUtil parse:@"01 (449)978-0001" defaultRegion:@"MX" error:&anError]]); - XCTAssertTrue([mxNumber isEqual:[_aUtil parse:@"(449)978-0001" defaultRegion:@"MX" error:&anError]]); - + XCTAssertTrue( + [mxNumber isEqual:[_aUtil parse:@"+52 (449)978-0001" defaultRegion:@"MX" error:&anError]]); + XCTAssertTrue( + [mxNumber isEqual:[_aUtil parse:@"01 (449)978-0001" defaultRegion:@"MX" error:&anError]]); + XCTAssertTrue( + [mxNumber isEqual:[_aUtil parse:@"(449)978-0001" defaultRegion:@"MX" error:&anError]]); + // Test parsing mobile numbers of Mexico. mxNumber = [[NBPhoneNumber alloc] init]; [mxNumber setCountryCode:@52]; [mxNumber setNationalNumber:@13312345678]; - XCTAssertTrue([mxNumber isEqual:[_aUtil parse:@"+52 1 33 1234-5678" defaultRegion:@"MX" error:&anError]]); - XCTAssertTrue([mxNumber isEqual:[_aUtil parse:@"044 (33) 1234-5678" defaultRegion:@"MX" error:&anError]]); - XCTAssertTrue([mxNumber isEqual:[_aUtil parse:@"045 33 1234-5678" defaultRegion:@"MX" error:&anError]]); + XCTAssertTrue( + [mxNumber isEqual:[_aUtil parse:@"+52 1 33 1234-5678" defaultRegion:@"MX" error:&anError]]); + XCTAssertTrue( + [mxNumber isEqual:[_aUtil parse:@"044 (33) 1234-5678" defaultRegion:@"MX" error:&anError]]); + XCTAssertTrue( + [mxNumber isEqual:[_aUtil parse:@"045 33 1234-5678" defaultRegion:@"MX" error:&anError]]); } - - (void)testFailedParseOnInvalidNumbers { { NSError *anError = nil; NSString *sentencePhoneNumber = @"This is not a phone number"; [_aUtil parse:sentencePhoneNumber defaultRegion:@"NZ" error:&anError]; - + if (anError == nil) XCTFail(@"This should not parse without throwing an exception %@", sentencePhoneNumber); else // Expected this exception. - XCTAssertEqualObjects(@"NOT_A_NUMBER", anError.domain ,@"Wrong error type stored in exception."); + XCTAssertEqualObjects(@"NOT_A_NUMBER", anError.domain, + @"Wrong error type stored in exception."); } { NSError *anError = nil; NSString *sentencePhoneNumber = @"1 Still not a number"; [_aUtil parse:sentencePhoneNumber defaultRegion:@"NZ" error:&anError]; - + if (anError == nil) XCTFail(@"This should not parse without throwing an exception %@", sentencePhoneNumber); else // Expected this exception. - XCTAssertEqualObjects(@"NOT_A_NUMBER", anError.domain, @"Wrong error type stored in exception."); + XCTAssertEqualObjects(@"NOT_A_NUMBER", anError.domain, + @"Wrong error type stored in exception."); } - + { NSError *anError = nil; NSString *sentencePhoneNumber = @"1 MICROSOFT"; [_aUtil parse:sentencePhoneNumber defaultRegion:@"NZ" error:&anError]; - + if (anError == nil) XCTFail(@"This should not parse without throwing an exception %@", sentencePhoneNumber); else // Expected this exception. - XCTAssertEqualObjects(@"NOT_A_NUMBER", anError.domain, @"Wrong error type stored in exception."); + XCTAssertEqualObjects(@"NOT_A_NUMBER", anError.domain, + @"Wrong error type stored in exception."); } - + { NSError *anError = nil; NSString *sentencePhoneNumber = @"12 MICROSOFT"; [_aUtil parse:sentencePhoneNumber defaultRegion:@"NZ" error:&anError]; - + if (anError == nil) XCTFail(@"This should not parse without throwing an exception %@", sentencePhoneNumber); else // Expected this exception. - XCTAssertEqualObjects(@"NOT_A_NUMBER", anError.domain, @"Wrong error type stored in exception."); + XCTAssertEqualObjects(@"NOT_A_NUMBER", anError.domain, + @"Wrong error type stored in exception."); } - + { NSError *anError = nil; NSString *tooLongPhoneNumber = @"01495 72553301873 810104"; [_aUtil parse:tooLongPhoneNumber defaultRegion:@"GB" error:&anError]; - + if (anError == nil) XCTFail(@"This should not parse without throwing an exception %@", tooLongPhoneNumber); else // Expected this exception. XCTAssertEqualObjects(@"TOO_LONG", anError.domain, @"Wrong error type stored in exception."); } - + { NSError *anError = nil; NSString *plusMinusPhoneNumber = @"+---"; [_aUtil parse:plusMinusPhoneNumber defaultRegion:@"DE" error:&anError]; - + if (anError == nil) XCTFail(@"This should not parse without throwing an exception %@", plusMinusPhoneNumber); else // Expected this exception. - XCTAssertEqualObjects(@"NOT_A_NUMBER", anError.domain, @"Wrong error type stored in exception."); + XCTAssertEqualObjects(@"NOT_A_NUMBER", anError.domain, + @"Wrong error type stored in exception."); } - + { NSError *anError = nil; NSString *plusStar = @"+***"; @@ -2085,9 +2580,10 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat XCTFail(@"This should not parse without throwing an exception %@", plusStar); else // Expected this exception. - XCTAssertEqualObjects(@"NOT_A_NUMBER", anError.domain, @"Wrong error type stored in exception."); + XCTAssertEqualObjects(@"NOT_A_NUMBER", anError.domain, + @"Wrong error type stored in exception."); } - + { NSError *anError = nil; NSString *plusStarPhoneNumber = @"+*******91"; @@ -2096,9 +2592,10 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat XCTFail(@"This should not parse without throwing an exception %@", plusStarPhoneNumber); else // Expected this exception. - XCTAssertEqualObjects(@"NOT_A_NUMBER", anError.domain, @"Wrong error type stored in exception."); + XCTAssertEqualObjects(@"NOT_A_NUMBER", anError.domain, + @"Wrong error type stored in exception."); } - + { NSError *anError = nil; NSString *tooShortPhoneNumber = @"+49 0"; @@ -2107,9 +2604,10 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat XCTFail(@"This should not parse without throwing an exception %@", tooShortPhoneNumber); else // Expected this exception. - XCTAssertEqualObjects(@"TOO_SHORT_NSN", anError.domain, @"Wrong error type stored in exception."); + XCTAssertEqualObjects(@"TOO_SHORT_NSN", anError.domain, + @"Wrong error type stored in exception."); } - + { NSError *anError = nil; NSString *invalidcountryCode = @"+210 3456 56789"; @@ -2118,9 +2616,10 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat XCTFail(@"This is not a recognised region code: should fail: %@", invalidcountryCode); else // Expected this exception. - XCTAssertEqualObjects(@"INVALID_COUNTRY_CODE", anError.domain, @"Wrong error type stored in exception."); + XCTAssertEqualObjects(@"INVALID_COUNTRY_CODE", anError.domain, + @"Wrong error type stored in exception."); } - + { NSError *anError = nil; NSString *plusAndIddAndInvalidcountryCode = @"+ 00 210 3 331 6005"; @@ -2130,10 +2629,11 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat else { // Expected this exception. 00 is a correct IDD, but 210 is not a valid // country code. - XCTAssertEqualObjects(@"INVALID_COUNTRY_CODE", anError.domain, @"Wrong error type stored in exception."); + XCTAssertEqualObjects(@"INVALID_COUNTRY_CODE", anError.domain, + @"Wrong error type stored in exception."); } } - + { NSError *anError = nil; NSString *someNumber = @"123 456 7890"; @@ -2142,9 +2642,10 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat XCTFail(@"Unknown region code not allowed: should fail."); else // Expected this exception. - XCTAssertEqualObjects(@"INVALID_COUNTRY_CODE", anError.domain, @"Wrong error type stored in exception."); + XCTAssertEqualObjects(@"INVALID_COUNTRY_CODE", anError.domain, + @"Wrong error type stored in exception."); } - + { NSError *anError = nil; NSString *someNumber = @"123 456 7890"; @@ -2153,9 +2654,10 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat XCTFail(@"Deprecated region code not allowed: should fail."); else // Expected this exception. - XCTAssertEqualObjects(@"INVALID_COUNTRY_CODE", anError.domain, @"Wrong error type stored in exception."); + XCTAssertEqualObjects(@"INVALID_COUNTRY_CODE", anError.domain, + @"Wrong error type stored in exception."); } - + { NSError *anError = nil; NSString *someNumber = @"123 456 7890"; @@ -2164,10 +2666,10 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat XCTFail(@"nil region code not allowed: should fail."); else // Expected this exception. - XCTAssertEqualObjects(@"INVALID_COUNTRY_CODE", anError.domain, @"Wrong error type stored in exception."); + XCTAssertEqualObjects(@"INVALID_COUNTRY_CODE", anError.domain, + @"Wrong error type stored in exception."); } - - + { NSError *anError = nil; NSString *someNumber = @"0044------"; @@ -2176,9 +2678,10 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat XCTFail(@"No number provided, only region code: should fail"); else // Expected this exception. - XCTAssertEqualObjects(@"TOO_SHORT_AFTER_IDD", anError.domain, @"Wrong error type stored in exception."); + XCTAssertEqualObjects(@"TOO_SHORT_AFTER_IDD", anError.domain, + @"Wrong error type stored in exception."); } - + { NSError *anError = nil; NSString *someNumber = @"0044"; @@ -2187,9 +2690,10 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat XCTFail(@"No number provided, only region code: should fail"); else // Expected this exception. - XCTAssertEqualObjects(@"TOO_SHORT_AFTER_IDD", anError.domain, @"Wrong error type stored in exception."); + XCTAssertEqualObjects(@"TOO_SHORT_AFTER_IDD", anError.domain, + @"Wrong error type stored in exception."); } - + { NSError *anError = nil; NSString *someNumber = @"011"; @@ -2198,9 +2702,10 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat XCTFail(@"Only IDD provided - should fail."); else // Expected this exception. - XCTAssertEqualObjects(@"TOO_SHORT_AFTER_IDD", anError.domain, @"Wrong error type stored in exception."); + XCTAssertEqualObjects(@"TOO_SHORT_AFTER_IDD", anError.domain, + @"Wrong error type stored in exception."); } - + { NSError *anError = nil; NSString *someNumber = @"0119"; @@ -2209,9 +2714,10 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat XCTFail(@"Only IDD provided and then 9 - should fail."); else // Expected this exception. - XCTAssertEqualObjects(@"TOO_SHORT_AFTER_IDD", anError.domain, @"Wrong error type stored in exception."); + XCTAssertEqualObjects(@"TOO_SHORT_AFTER_IDD", anError.domain, + @"Wrong error type stored in exception."); } - + { NSError *anError = nil; NSString *emptyNumber = @""; @@ -2221,9 +2727,10 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat XCTFail(@"Empty string - should fail."); else // Expected this exception. - XCTAssertEqualObjects(@"NOT_A_NUMBER", anError.domain, @"Wrong error type stored in exception."); + XCTAssertEqualObjects(@"NOT_A_NUMBER", anError.domain, + @"Wrong error type stored in exception."); } - + { NSError *anError = nil; // Invalid region. @@ -2232,9 +2739,10 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat XCTFail(@"nil string - should fail."); else // Expected this exception. - XCTAssertEqualObjects(@"NOT_A_NUMBER", anError.domain, @"Wrong error type stored in exception."); + XCTAssertEqualObjects(@"NOT_A_NUMBER", anError.domain, + @"Wrong error type stored in exception."); } - + { NSError *anError = nil; [_aUtil parse:nil defaultRegion:@"US" error:&anError]; @@ -2242,9 +2750,10 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat XCTFail(@"nil string - should fail."); else // Expected this exception. - XCTAssertEqualObjects(@"NOT_A_NUMBER", anError.domain, @"Wrong error type stored in exception."); + XCTAssertEqualObjects(@"NOT_A_NUMBER", anError.domain, + @"Wrong error type stored in exception."); } - + { NSError *anError = nil; NSString *domainRfcPhoneContext = @"tel:555-1234;phone-context=www.google.com"; @@ -2253,166 +2762,234 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat XCTFail(@"Unknown region code not allowed: should fail."); else // Expected this exception. - XCTAssertEqualObjects(@"INVALID_COUNTRY_CODE", anError.domain, @"Wrong error type stored in exception."); + XCTAssertEqualObjects(@"INVALID_COUNTRY_CODE", anError.domain, + @"Wrong error type stored in exception."); } - + { NSError *anError = nil; // This is invalid because no '+' sign is present as part of phone-context. // This should not succeed in being parsed. - + NSString *invalidRfcPhoneContext = @"tel:555-1234;phone-context=1-331"; [_aUtil parse:invalidRfcPhoneContext defaultRegion:NB_UNKNOWN_REGION error:&anError]; if (anError == nil) XCTFail(@"Unknown region code not allowed: should fail."); else // Expected this exception. - XCTAssertEqualObjects(@"INVALID_COUNTRY_CODE", anError.domain, @"Wrong error type stored in exception."); + XCTAssertEqualObjects(@"INVALID_COUNTRY_CODE", anError.domain, + @"Wrong error type stored in exception."); } } - - (void)testParseNumbersWithPlusWithNoRegion { NSError *anError; // @"ZZ is allowed only if the number starts with a '+' - then the // country calling code can be calculated. - XCTAssertTrue([self.nzNumber isEqual:[_aUtil parse:@"+64 3 331 6005" defaultRegion:NB_UNKNOWN_REGION error:&anError]]); + XCTAssertTrue([self.nzNumber + isEqual:[_aUtil parse:@"+64 3 331 6005" defaultRegion:NB_UNKNOWN_REGION error:&anError]]); // Test with full-width plus. - XCTAssertTrue([self.nzNumber isEqual:[_aUtil parse:@"\uFF0B64 3 331 6005" defaultRegion:NB_UNKNOWN_REGION error:&anError]]); + XCTAssertTrue([self.nzNumber isEqual:[_aUtil parse:@"\uFF0B64 3 331 6005" + defaultRegion:NB_UNKNOWN_REGION + error:&anError]]); // Test with normal plus but leading characters that need to be stripped. - XCTAssertTrue([self.nzNumber isEqual:[_aUtil parse:@"Tel: +64 3 331 6005" defaultRegion:NB_UNKNOWN_REGION error:&anError]]); - XCTAssertTrue([self.nzNumber isEqual:[_aUtil parse:@"+64 3 331 6005" defaultRegion:nil error:&anError]]); - XCTAssertTrue([self.internationalTollFreeNumber isEqual:[_aUtil parse:@"+800 1234 5678" defaultRegion:nil error:&anError]]); - XCTAssertTrue([self.universalPremiumRateNumber isEqual:[_aUtil parse:@"+979 123 456 789" defaultRegion:nil error:&anError]]); - + XCTAssertTrue([self.nzNumber isEqual:[_aUtil parse:@"Tel: +64 3 331 6005" + defaultRegion:NB_UNKNOWN_REGION + error:&anError]]); + XCTAssertTrue( + [self.nzNumber isEqual:[_aUtil parse:@"+64 3 331 6005" defaultRegion:nil error:&anError]]); + XCTAssertTrue([self.internationalTollFreeNumber + isEqual:[_aUtil parse:@"+800 1234 5678" defaultRegion:nil error:&anError]]); + XCTAssertTrue([self.universalPremiumRateNumber + isEqual:[_aUtil parse:@"+979 123 456 789" defaultRegion:nil error:&anError]]); + // Test parsing RFC3966 format with a phone context. - XCTAssertTrue([self.nzNumber isEqual:[_aUtil parse:@"tel:03-331-6005;phone-context=+64" defaultRegion:NB_UNKNOWN_REGION error:&anError]]); - XCTAssertTrue([self.nzNumber isEqual:[_aUtil parse:@" tel:03-331-6005;phone-context=+64" defaultRegion:NB_UNKNOWN_REGION error:&anError]]); - XCTAssertTrue([self.nzNumber isEqual:[_aUtil parse:@"tel:03-331-6005;isub=12345;phone-context=+64" defaultRegion:NB_UNKNOWN_REGION error:&anError]]); - + XCTAssertTrue([self.nzNumber isEqual:[_aUtil parse:@"tel:03-331-6005;phone-context=+64" + defaultRegion:NB_UNKNOWN_REGION + error:&anError]]); + XCTAssertTrue([self.nzNumber isEqual:[_aUtil parse:@" tel:03-331-6005;phone-context=+64" + defaultRegion:NB_UNKNOWN_REGION + error:&anError]]); + XCTAssertTrue([self.nzNumber isEqual:[_aUtil parse:@"tel:03-331-6005;isub=12345;phone-context=+64" + defaultRegion:NB_UNKNOWN_REGION + error:&anError]]); + // It is important that we set the carrier code to an empty string, since we // used ParseAndKeepRawInput and no carrier code was found. - + id nzNumberWithRawInput = self.nzNumber; [nzNumberWithRawInput setRawInput:@"+64 3 331 6005"]; - [nzNumberWithRawInput setCountryCodeSource:[NSNumber numberWithInteger:NBECountryCodeSourceFROM_NUMBER_WITH_PLUS_SIGN]]; + [nzNumberWithRawInput + setCountryCodeSource:[NSNumber + numberWithInteger:NBECountryCodeSourceFROM_NUMBER_WITH_PLUS_SIGN]]; [nzNumberWithRawInput setPreferredDomesticCarrierCode:@""]; - XCTAssertTrue([nzNumberWithRawInput isEqual:[_aUtil parseAndKeepRawInput:@"+64 3 331 6005" defaultRegion:NB_UNKNOWN_REGION error:&anError]]); + XCTAssertTrue([nzNumberWithRawInput isEqual:[_aUtil parseAndKeepRawInput:@"+64 3 331 6005" + defaultRegion:NB_UNKNOWN_REGION + error:&anError]]); // nil is also allowed for the region code in these cases. - XCTAssertTrue([nzNumberWithRawInput isEqual:[_aUtil parseAndKeepRawInput:@"+64 3 331 6005" defaultRegion:nil error:&anError]]); + XCTAssertTrue([nzNumberWithRawInput + isEqual:[_aUtil parseAndKeepRawInput:@"+64 3 331 6005" defaultRegion:nil error:&anError]]); } - - (void)testParseExtensions { NSError *anError = nil; NBPhoneNumber *nzNumber = [[NBPhoneNumber alloc] init]; [nzNumber setCountryCode:@64]; [nzNumber setNationalNumber:@33316005]; [nzNumber setExtension:@"3456"]; - XCTAssertTrue([nzNumber isEqual:[_aUtil parse:@"03 331 6005 ext 3456" defaultRegion:@"NZ" error:&anError]]); - XCTAssertTrue([nzNumber isEqual:[_aUtil parse:@"03-3316005x3456" defaultRegion:@"NZ" error:&anError]]); - XCTAssertTrue([nzNumber isEqual:[_aUtil parse:@"03-3316005 int.3456" defaultRegion:@"NZ" error:&anError]]); - XCTAssertTrue([nzNumber isEqual:[_aUtil parse:@"03 3316005 #3456" defaultRegion:@"NZ" error:&anError]]); - + XCTAssertTrue( + [nzNumber isEqual:[_aUtil parse:@"03 331 6005 ext 3456" defaultRegion:@"NZ" error:&anError]]); + XCTAssertTrue( + [nzNumber isEqual:[_aUtil parse:@"03-3316005x3456" defaultRegion:@"NZ" error:&anError]]); + XCTAssertTrue( + [nzNumber isEqual:[_aUtil parse:@"03-3316005 int.3456" defaultRegion:@"NZ" error:&anError]]); + XCTAssertTrue( + [nzNumber isEqual:[_aUtil parse:@"03 3316005 #3456" defaultRegion:@"NZ" error:&anError]]); + // Test the following do not extract extensions: - XCTAssertTrue([self.alphaNumbericNumber isEqual:[_aUtil parse:@"1800 six-flags" defaultRegion:@"US" error:&anError]]); - XCTAssertTrue([self.alphaNumbericNumber isEqual:[_aUtil parse:@"1800 SIX FLAGS" defaultRegion:@"US" error:&anError]]); - XCTAssertTrue([self.alphaNumbericNumber isEqual:[_aUtil parse:@"0~0 1800 7493 5247" defaultRegion:@"PL" error:&anError]]); - XCTAssertTrue([self.alphaNumbericNumber isEqual:[_aUtil parse:@"(1800) 7493.5247" defaultRegion:@"US" error:&anError]]); - + XCTAssertTrue([self.alphaNumbericNumber + isEqual:[_aUtil parse:@"1800 six-flags" defaultRegion:@"US" error:&anError]]); + XCTAssertTrue([self.alphaNumbericNumber + isEqual:[_aUtil parse:@"1800 SIX FLAGS" defaultRegion:@"US" error:&anError]]); + XCTAssertTrue([self.alphaNumbericNumber + isEqual:[_aUtil parse:@"0~0 1800 7493 5247" defaultRegion:@"PL" error:&anError]]); + XCTAssertTrue([self.alphaNumbericNumber + isEqual:[_aUtil parse:@"(1800) 7493.5247" defaultRegion:@"US" error:&anError]]); + // Check that the last instance of an extension token is matched. - + id extnNumber = self.alphaNumbericNumber; [extnNumber setExtension:@"1234"]; - XCTAssertTrue([extnNumber isEqual:[_aUtil parse:@"0~0 1800 7493 5247 ~1234" defaultRegion:@"PL" error:&anError]]); - + XCTAssertTrue([extnNumber + isEqual:[_aUtil parse:@"0~0 1800 7493 5247 ~1234" defaultRegion:@"PL" error:&anError]]); + // Verifying bug-fix where the last digit of a number was previously omitted // if it was a 0 when extracting the extension. Also verifying a few different // cases of extensions. - + id ukNumber = [[NBPhoneNumber alloc] init]; [ukNumber setCountryCode:@44]; [ukNumber setNationalNumber:@2034567890]; [ukNumber setExtension:@"456"]; - XCTAssertTrue([ukNumber isEqual:[_aUtil parse:@"+44 2034567890x456" defaultRegion:@"NZ" error:&anError]]); - XCTAssertTrue([ukNumber isEqual:[_aUtil parse:@"+44 2034567890x456" defaultRegion:@"GB" error:&anError]]); - XCTAssertTrue([ukNumber isEqual:[_aUtil parse:@"+44 2034567890 x456" defaultRegion:@"GB" error:&anError]]); - XCTAssertTrue([ukNumber isEqual:[_aUtil parse:@"+44 2034567890 X456" defaultRegion:@"GB" error:&anError]]); - XCTAssertTrue([ukNumber isEqual:[_aUtil parse:@"+44 2034567890 X 456" defaultRegion:@"GB" error:&anError]]); - XCTAssertTrue([ukNumber isEqual:[_aUtil parse:@"+44 2034567890 X 456" defaultRegion:@"GB" error:&anError]]); - XCTAssertTrue([ukNumber isEqual:[_aUtil parse:@"+44 2034567890 x 456 " defaultRegion:@"GB" error:&anError]]); - XCTAssertTrue([ukNumber isEqual:[_aUtil parse:@"+44 2034567890 X 456" defaultRegion:@"GB" error:&anError]]); - XCTAssertTrue([ukNumber isEqual:[_aUtil parse:@"+44-2034567890;ext=456" defaultRegion:@"GB" error:&anError]]); - XCTAssertTrue([ukNumber isEqual:[_aUtil parse:@"tel:2034567890;ext=456;phone-context=+44" defaultRegion:NB_UNKNOWN_REGION error:&anError]]); + XCTAssertTrue( + [ukNumber isEqual:[_aUtil parse:@"+44 2034567890x456" defaultRegion:@"NZ" error:&anError]]); + XCTAssertTrue( + [ukNumber isEqual:[_aUtil parse:@"+44 2034567890x456" defaultRegion:@"GB" error:&anError]]); + XCTAssertTrue( + [ukNumber isEqual:[_aUtil parse:@"+44 2034567890 x456" defaultRegion:@"GB" error:&anError]]); + XCTAssertTrue( + [ukNumber isEqual:[_aUtil parse:@"+44 2034567890 X456" defaultRegion:@"GB" error:&anError]]); + XCTAssertTrue( + [ukNumber isEqual:[_aUtil parse:@"+44 2034567890 X 456" defaultRegion:@"GB" error:&anError]]); + XCTAssertTrue([ukNumber + isEqual:[_aUtil parse:@"+44 2034567890 X 456" defaultRegion:@"GB" error:&anError]]); + XCTAssertTrue([ukNumber + isEqual:[_aUtil parse:@"+44 2034567890 x 456 " defaultRegion:@"GB" error:&anError]]); + XCTAssertTrue([ukNumber + isEqual:[_aUtil parse:@"+44 2034567890 X 456" defaultRegion:@"GB" error:&anError]]); + XCTAssertTrue([ukNumber + isEqual:[_aUtil parse:@"+44-2034567890;ext=456" defaultRegion:@"GB" error:&anError]]); + XCTAssertTrue([ukNumber isEqual:[_aUtil parse:@"tel:2034567890;ext=456;phone-context=+44" + defaultRegion:NB_UNKNOWN_REGION + error:&anError]]); // Full-width extension, @"extn' only. - XCTAssertTrue([ukNumber isEqual:[_aUtil parse:@"+442034567890\uFF45\uFF58\uFF54\uFF4E456" defaultRegion:@"GB" error:&anError]]); + XCTAssertTrue([ukNumber isEqual:[_aUtil parse:@"+442034567890\uFF45\uFF58\uFF54\uFF4E456" + defaultRegion:@"GB" + error:&anError]]); // 'xtn' only. - XCTAssertTrue([ukNumber isEqual:[_aUtil parse:@"+442034567890\uFF58\uFF54\uFF4E456" defaultRegion:@"GB" error:&anError]]); + XCTAssertTrue([ukNumber isEqual:[_aUtil parse:@"+442034567890\uFF58\uFF54\uFF4E456" + defaultRegion:@"GB" + error:&anError]]); // 'xt' only. - XCTAssertTrue([ukNumber isEqual:[_aUtil parse:@"+442034567890\uFF58\uFF54456" defaultRegion:@"GB" error:&anError]]); - + XCTAssertTrue([ukNumber + isEqual:[_aUtil parse:@"+442034567890\uFF58\uFF54456" defaultRegion:@"GB" error:&anError]]); + id usWithExtension = [[NBPhoneNumber alloc] init]; [usWithExtension setCountryCode:@1]; [usWithExtension setNationalNumber:@8009013355]; [usWithExtension setExtension:@"7246433"]; - XCTAssertTrue([usWithExtension isEqual:[_aUtil parse:@"(800) 901-3355 x 7246433" defaultRegion:@"US" error:&anError]]); - XCTAssertTrue([usWithExtension isEqual:[_aUtil parse:@"(800) 901-3355 , ext 7246433" defaultRegion:@"US" error:&anError]]); - XCTAssertTrue([usWithExtension isEqual:[_aUtil parse:@"(800) 901-3355 ,extension 7246433" defaultRegion:@"US" error:&anError]]); - XCTAssertTrue([usWithExtension isEqual:[_aUtil parse:@"(800) 901-3355 ,extensi\u00F3n 7246433" defaultRegion:@"US" error:&anError]]); - + XCTAssertTrue([usWithExtension + isEqual:[_aUtil parse:@"(800) 901-3355 x 7246433" defaultRegion:@"US" error:&anError]]); + XCTAssertTrue([usWithExtension + isEqual:[_aUtil parse:@"(800) 901-3355 , ext 7246433" defaultRegion:@"US" error:&anError]]); + XCTAssertTrue([usWithExtension isEqual:[_aUtil parse:@"(800) 901-3355 ,extension 7246433" + defaultRegion:@"US" + error:&anError]]); + XCTAssertTrue([usWithExtension isEqual:[_aUtil parse:@"(800) 901-3355 ,extensi\u00F3n 7246433" + defaultRegion:@"US" + error:&anError]]); + // Repeat with the small letter o with acute accent created by combining // characters. - XCTAssertTrue([usWithExtension isEqual:[_aUtil parse:@"(800) 901-3355 ,extensio\u0301n 7246433" defaultRegion:@"US" error:&anError]]); - XCTAssertTrue([usWithExtension isEqual:[_aUtil parse:@"(800) 901-3355 , 7246433" defaultRegion:@"US" error:&anError]]); - XCTAssertTrue([usWithExtension isEqual:[_aUtil parse:@"(800) 901-3355 ext: 7246433" defaultRegion:@"US" error:&anError]]); - + XCTAssertTrue([usWithExtension isEqual:[_aUtil parse:@"(800) 901-3355 ,extensio\u0301n 7246433" + defaultRegion:@"US" + error:&anError]]); + XCTAssertTrue([usWithExtension + isEqual:[_aUtil parse:@"(800) 901-3355 , 7246433" defaultRegion:@"US" error:&anError]]); + XCTAssertTrue([usWithExtension + isEqual:[_aUtil parse:@"(800) 901-3355 ext: 7246433" defaultRegion:@"US" error:&anError]]); + // Test that if a number has two extensions specified, we ignore the second. id usWithTwoExtensionsNumber = [[NBPhoneNumber alloc] init]; [usWithTwoExtensionsNumber setCountryCode:@1]; [usWithTwoExtensionsNumber setNationalNumber:@2121231234]; [usWithTwoExtensionsNumber setExtension:@"508"]; - XCTAssertTrue([usWithTwoExtensionsNumber isEqual:[_aUtil parse:@"(212)123-1234 x508/x1234" defaultRegion:@"US" error:&anError]]); - XCTAssertTrue([usWithTwoExtensionsNumber isEqual:[_aUtil parse:@"(212)123-1234 x508/ x1234" defaultRegion:@"US" error:&anError]]); - XCTAssertTrue([usWithTwoExtensionsNumber isEqual:[_aUtil parse:@"(212)123-1234 x508\\x1234" defaultRegion:@"US" error:&anError]]); - + XCTAssertTrue([usWithTwoExtensionsNumber + isEqual:[_aUtil parse:@"(212)123-1234 x508/x1234" defaultRegion:@"US" error:&anError]]); + XCTAssertTrue([usWithTwoExtensionsNumber + isEqual:[_aUtil parse:@"(212)123-1234 x508/ x1234" defaultRegion:@"US" error:&anError]]); + XCTAssertTrue([usWithTwoExtensionsNumber + isEqual:[_aUtil parse:@"(212)123-1234 x508\\x1234" defaultRegion:@"US" error:&anError]]); + // Test parsing numbers in the form (645) 123-1234-910# works, where the last // 3 digits before the # are an extension. usWithExtension = [[NBPhoneNumber alloc] init]; [usWithExtension setCountryCode:@1]; [usWithExtension setNationalNumber:@6451231234]; [usWithExtension setExtension:@"910"]; - XCTAssertTrue([usWithExtension isEqual:[_aUtil parse:@"+1 (645) 123 1234-910#" defaultRegion:@"US" error:&anError]]); + XCTAssertTrue([usWithExtension + isEqual:[_aUtil parse:@"+1 (645) 123 1234-910#" defaultRegion:@"US" error:&anError]]); // Retry with the same number in a slightly different format. - XCTAssertTrue([usWithExtension isEqual:[_aUtil parse:@"+1 (645) 123 1234 ext. 910#" defaultRegion:@"US" error:&anError]]); + XCTAssertTrue([usWithExtension + isEqual:[_aUtil parse:@"+1 (645) 123 1234 ext. 910#" defaultRegion:@"US" error:&anError]]); } - - (void)testParseAndKeepRaw { NSError *anError; NBPhoneNumber *alphaNumericNumber = self.alphaNumbericNumber; [alphaNumericNumber setRawInput:@"800 six-flags"]; - [alphaNumericNumber setCountryCodeSource:[NSNumber numberWithInteger:NBECountryCodeSourceFROM_DEFAULT_COUNTRY]]; + [alphaNumericNumber + setCountryCodeSource:[NSNumber numberWithInteger:NBECountryCodeSourceFROM_DEFAULT_COUNTRY]]; [alphaNumericNumber setPreferredDomesticCarrierCode:@""]; - XCTAssertTrue([alphaNumericNumber isEqual:[_aUtil parseAndKeepRawInput:@"800 six-flags" defaultRegion:@"US" error:&anError]]); - + XCTAssertTrue([alphaNumericNumber + isEqual:[_aUtil parseAndKeepRawInput:@"800 six-flags" defaultRegion:@"US" error:&anError]]); + id shorterAlphaNumber = [[NBPhoneNumber alloc] init]; [shorterAlphaNumber setCountryCode:@1]; [shorterAlphaNumber setNationalNumber:@8007493524]; [shorterAlphaNumber setRawInput:@"1800 six-flag"]; - [shorterAlphaNumber setCountryCodeSource:[NSNumber numberWithInteger:NBECountryCodeSourceFROM_NUMBER_WITHOUT_PLUS_SIGN]]; + [shorterAlphaNumber + setCountryCodeSource: + [NSNumber numberWithInteger:NBECountryCodeSourceFROM_NUMBER_WITHOUT_PLUS_SIGN]]; [shorterAlphaNumber setPreferredDomesticCarrierCode:@""]; - XCTAssertTrue([shorterAlphaNumber isEqual:[_aUtil parseAndKeepRawInput:@"1800 six-flag" defaultRegion:@"US" error:&anError]]); - + XCTAssertTrue([shorterAlphaNumber + isEqual:[_aUtil parseAndKeepRawInput:@"1800 six-flag" defaultRegion:@"US" error:&anError]]); + [shorterAlphaNumber setRawInput:@"+1800 six-flag"]; - [shorterAlphaNumber setCountryCodeSource:[NSNumber numberWithInteger:NBECountryCodeSourceFROM_NUMBER_WITH_PLUS_SIGN]]; - XCTAssertTrue([shorterAlphaNumber isEqual:[_aUtil parseAndKeepRawInput:@"+1800 six-flag" defaultRegion:@"NZ" error:&anError]]); - + [shorterAlphaNumber + setCountryCodeSource:[NSNumber + numberWithInteger:NBECountryCodeSourceFROM_NUMBER_WITH_PLUS_SIGN]]; + XCTAssertTrue([shorterAlphaNumber + isEqual:[_aUtil parseAndKeepRawInput:@"+1800 six-flag" defaultRegion:@"NZ" error:&anError]]); + [alphaNumericNumber setCountryCode:@1]; [alphaNumericNumber setNationalNumber:@8007493524]; [alphaNumericNumber setRawInput:@"001800 six-flag"]; - [alphaNumericNumber setCountryCodeSource:[NSNumber numberWithInteger:NBECountryCodeSourceFROM_NUMBER_WITH_IDD]]; - XCTAssertTrue([alphaNumericNumber isEqual:[_aUtil parseAndKeepRawInput:@"001800 six-flag" defaultRegion:@"NZ" error:&anError]]); - + [alphaNumericNumber + setCountryCodeSource:[NSNumber numberWithInteger:NBECountryCodeSourceFROM_NUMBER_WITH_IDD]]; + XCTAssertTrue([alphaNumericNumber + isEqual:[_aUtil parseAndKeepRawInput:@"001800 six-flag" defaultRegion:@"NZ" error:&anError]]); + // Invalid region code supplied. { [_aUtil parseAndKeepRawInput:@"123 456 7890" defaultRegion:@"CS" error:&anError]; @@ -2420,92 +2997,112 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat XCTFail(@"Deprecated region code not allowed: should fail."); else { // Expected this exception. - XCTAssertEqualObjects(@"INVALID_COUNTRY_CODE", anError.domain, @"Wrong error type stored in exception."); + XCTAssertEqualObjects(@"INVALID_COUNTRY_CODE", anError.domain, + @"Wrong error type stored in exception."); } } - + id koreanNumber = [[NBPhoneNumber alloc] init]; [koreanNumber setCountryCode:@82]; [koreanNumber setNationalNumber:@22123456]; [koreanNumber setRawInput:@"08122123456"]; - [koreanNumber setCountryCodeSource:[NSNumber numberWithInteger:NBECountryCodeSourceFROM_DEFAULT_COUNTRY]]; + [koreanNumber + setCountryCodeSource:[NSNumber numberWithInteger:NBECountryCodeSourceFROM_DEFAULT_COUNTRY]]; [koreanNumber setPreferredDomesticCarrierCode:@"81"]; - XCTAssertTrue([koreanNumber isEqual:[_aUtil parseAndKeepRawInput:@"08122123456" defaultRegion:@"KR" error:&anError]]); + XCTAssertTrue([koreanNumber + isEqual:[_aUtil parseAndKeepRawInput:@"08122123456" defaultRegion:@"KR" error:&anError]]); } - - (void)testCountryWithNoNumberDesc { // Andorra is a country where we don't have PhoneNumberDesc info in the // metadata. NBPhoneNumber *adNumber = [[NBPhoneNumber alloc] init]; [adNumber setCountryCode:@376]; [adNumber setNationalNumber:@12345]; - XCTAssertEqualObjects(@"+376 12345", [_aUtil format:adNumber numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); - XCTAssertEqualObjects(@"+37612345", [_aUtil format:adNumber numberFormat:NBEPhoneNumberFormatE164]); - XCTAssertEqualObjects(@"12345", [_aUtil format:adNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); + XCTAssertEqualObjects(@"+376 12345", + [_aUtil format:adNumber numberFormat:NBEPhoneNumberFormatINTERNATIONAL]); + XCTAssertEqualObjects(@"+37612345", + [_aUtil format:adNumber numberFormat:NBEPhoneNumberFormatE164]); + XCTAssertEqualObjects(@"12345", + [_aUtil format:adNumber numberFormat:NBEPhoneNumberFormatNATIONAL]); XCTAssertEqual(NBEPhoneNumberTypeUNKNOWN, [_aUtil getNumberType:adNumber]); XCTAssertFalse([_aUtil isValidNumber:adNumber]); - - // Test dialing a US number from within Andorra. - XCTAssertEqualObjects(@"00 1 650 253 0000", [_aUtil formatOutOfCountryCallingNumber:self.usNumber regionCallingFrom:@"AD"]); -} + // Test dialing a US number from within Andorra. + XCTAssertEqualObjects(@"00 1 650 253 0000", [_aUtil formatOutOfCountryCallingNumber:self.usNumber + regionCallingFrom:@"AD"]); +} - (void)testUnknownCountryCallingCode { XCTAssertFalse([_aUtil isValidNumber:self.unknownCountryCodeNoRawInput]); // It's not very well defined as to what the E164 representation for a number // with an invalid country calling code is, but just prefixing the country // code and national number is about the best we can do. - XCTAssertEqualObjects(@"+212345", [_aUtil format:self.unknownCountryCodeNoRawInput numberFormat:NBEPhoneNumberFormatE164]); + XCTAssertEqualObjects(@"+212345", [_aUtil format:self.unknownCountryCodeNoRawInput + numberFormat:NBEPhoneNumberFormatE164]); } - - (void)testIsNumberMatchMatches { // Test simple matches where formatting is different, or leading zeroes, // or country calling code has been specified. - + NSError *anError = nil; - + NBPhoneNumber *num1 = [_aUtil parse:@"+64 3 331 6005" defaultRegion:@"NZ" error:&anError]; NBPhoneNumber *num2 = [_aUtil parse:@"+64 03 331 6005" defaultRegion:@"NZ" error:&anError]; XCTAssertEqual(NBEMatchTypeEXACT_MATCH, [_aUtil isNumberMatch:num1 second:num2]); - XCTAssertEqual(NBEMatchTypeEXACT_MATCH, [_aUtil isNumberMatch:@"+64 3 331 6005" second:@"+64 03 331 6005"]); - XCTAssertEqual(NBEMatchTypeEXACT_MATCH, [_aUtil isNumberMatch:@"+800 1234 5678" second:@"+80012345678"]); - XCTAssertEqual(NBEMatchTypeEXACT_MATCH, [_aUtil isNumberMatch:@"+64 03 331-6005" second:@"+64 03331 6005"]); - XCTAssertEqual(NBEMatchTypeEXACT_MATCH, [_aUtil isNumberMatch:@"+643 331-6005" second:@"+64033316005"]); - XCTAssertEqual(NBEMatchTypeEXACT_MATCH, [_aUtil isNumberMatch:@"+643 331-6005" second:@"+6433316005"]); - XCTAssertEqual(NBEMatchTypeEXACT_MATCH, [_aUtil isNumberMatch:@"+64 3 331-6005" second:@"+6433316005"]); - XCTAssertEqual(NBEMatchTypeEXACT_MATCH, [_aUtil isNumberMatch:@"+64 3 331-6005" second:@"tel:+64-3-331-6005;isub=123"]); + XCTAssertEqual(NBEMatchTypeEXACT_MATCH, + [_aUtil isNumberMatch:@"+64 3 331 6005" second:@"+64 03 331 6005"]); + XCTAssertEqual(NBEMatchTypeEXACT_MATCH, + [_aUtil isNumberMatch:@"+800 1234 5678" second:@"+80012345678"]); + XCTAssertEqual(NBEMatchTypeEXACT_MATCH, + [_aUtil isNumberMatch:@"+64 03 331-6005" second:@"+64 03331 6005"]); + XCTAssertEqual(NBEMatchTypeEXACT_MATCH, + [_aUtil isNumberMatch:@"+643 331-6005" second:@"+64033316005"]); + XCTAssertEqual(NBEMatchTypeEXACT_MATCH, + [_aUtil isNumberMatch:@"+643 331-6005" second:@"+6433316005"]); + XCTAssertEqual(NBEMatchTypeEXACT_MATCH, + [_aUtil isNumberMatch:@"+64 3 331-6005" second:@"+6433316005"]); + XCTAssertEqual(NBEMatchTypeEXACT_MATCH, + [_aUtil isNumberMatch:@"+64 3 331-6005" second:@"tel:+64-3-331-6005;isub=123"]); // Test alpha numbers. - XCTAssertEqual(NBEMatchTypeEXACT_MATCH, [_aUtil isNumberMatch:@"+1800 siX-Flags" second:@"+1 800 7493 5247"]); + XCTAssertEqual(NBEMatchTypeEXACT_MATCH, + [_aUtil isNumberMatch:@"+1800 siX-Flags" second:@"+1 800 7493 5247"]); // Test numbers with extensions. - XCTAssertEqual(NBEMatchTypeEXACT_MATCH, [_aUtil isNumberMatch:@"+64 3 331-6005 extn 1234" second:@"+6433316005#1234"]); + XCTAssertEqual(NBEMatchTypeEXACT_MATCH, + [_aUtil isNumberMatch:@"+64 3 331-6005 extn 1234" second:@"+6433316005#1234"]); // Test proto buffers. - XCTAssertEqual(NBEMatchTypeEXACT_MATCH, [_aUtil isNumberMatch:self.nzNumber second:@"+6403 331 6005"]); - + XCTAssertEqual(NBEMatchTypeEXACT_MATCH, + [_aUtil isNumberMatch:self.nzNumber second:@"+6403 331 6005"]); + NBPhoneNumber *nzNumber = self.nzNumber; [nzNumber setExtension:@"3456"]; - XCTAssertEqual(NBEMatchTypeEXACT_MATCH, [_aUtil isNumberMatch:nzNumber second:@"+643 331 6005 ext 3456"]); + XCTAssertEqual(NBEMatchTypeEXACT_MATCH, + [_aUtil isNumberMatch:nzNumber second:@"+643 331 6005 ext 3456"]); // Check empty extensions are ignored. [nzNumber setExtension:@""]; XCTAssertEqual(NBEMatchTypeEXACT_MATCH, [_aUtil isNumberMatch:nzNumber second:@"+6403 331 6005"]); // Check variant with two proto buffers. - XCTAssertEqual(NBEMatchTypeEXACT_MATCH, [_aUtil isNumberMatch:nzNumber second:self.nzNumber], @"Numbers did not match"); - + XCTAssertEqual(NBEMatchTypeEXACT_MATCH, [_aUtil isNumberMatch:nzNumber second:self.nzNumber], + @"Numbers did not match"); + // Check raw_input, country_code_source and preferred_domestic_carrier_code // are ignored. - + NBPhoneNumber *brNumberOne = [[NBPhoneNumber alloc] init]; - + NBPhoneNumber *brNumberTwo = [[NBPhoneNumber alloc] init]; [brNumberOne setCountryCode:@55]; [brNumberOne setNationalNumber:@3121286979]; - [brNumberOne setCountryCodeSource:[NSNumber numberWithInteger:NBECountryCodeSourceFROM_NUMBER_WITH_PLUS_SIGN]]; + [brNumberOne + setCountryCodeSource:[NSNumber + numberWithInteger:NBECountryCodeSourceFROM_NUMBER_WITH_PLUS_SIGN]]; [brNumberOne setPreferredDomesticCarrierCode:@"12"]; [brNumberOne setRawInput:@"012 3121286979"]; [brNumberTwo setCountryCode:@55]; [brNumberTwo setNationalNumber:@3121286979]; - [brNumberTwo setCountryCodeSource:[NSNumber numberWithInteger:NBECountryCodeSourceFROM_DEFAULT_COUNTRY]]; + [brNumberTwo + setCountryCodeSource:[NSNumber numberWithInteger:NBECountryCodeSourceFROM_DEFAULT_COUNTRY]]; [brNumberTwo setPreferredDomesticCarrierCode:@"14"]; [brNumberTwo setRawInput:@"143121286979"]; XCTAssertEqual(NBEMatchTypeEXACT_MATCH, [_aUtil isNumberMatch:brNumberOne second:brNumberTwo]); @@ -2514,17 +3111,23 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat - (void)testIsNumberMatchNonMatches { // Non-matches. XCTAssertEqual(NBEMatchTypeNO_MATCH, [_aUtil isNumberMatch:@"03 331 6005" second:@"03 331 6006"]); - XCTAssertEqual(NBEMatchTypeNO_MATCH, [_aUtil isNumberMatch:@"+800 1234 5678" second:@"+1 800 1234 5678"]); + XCTAssertEqual(NBEMatchTypeNO_MATCH, + [_aUtil isNumberMatch:@"+800 1234 5678" second:@"+1 800 1234 5678"]); // Different country calling code, partial number match. - XCTAssertEqual(NBEMatchTypeNO_MATCH, [_aUtil isNumberMatch:@"+64 3 331-6005" second:@"+16433316005"]); + XCTAssertEqual(NBEMatchTypeNO_MATCH, + [_aUtil isNumberMatch:@"+64 3 331-6005" second:@"+16433316005"]); // Different country calling code, same number. - XCTAssertEqual(NBEMatchTypeNO_MATCH, [_aUtil isNumberMatch:@"+64 3 331-6005" second:@"+6133316005"]); + XCTAssertEqual(NBEMatchTypeNO_MATCH, + [_aUtil isNumberMatch:@"+64 3 331-6005" second:@"+6133316005"]); // Extension different, all else the same. - XCTAssertEqual(NBEMatchTypeNO_MATCH, [_aUtil isNumberMatch:@"+64 3 331-6005 extn 1234" second:@"0116433316005#1235"]); - XCTAssertEqual(NBEMatchTypeNO_MATCH, [_aUtil isNumberMatch:@"+64 3 331-6005 extn 1234" second:@"tel:+64-3-331-6005;ext=1235"]); + XCTAssertEqual(NBEMatchTypeNO_MATCH, + [_aUtil isNumberMatch:@"+64 3 331-6005 extn 1234" second:@"0116433316005#1235"]); + XCTAssertEqual(NBEMatchTypeNO_MATCH, [_aUtil isNumberMatch:@"+64 3 331-6005 extn 1234" + second:@"tel:+64-3-331-6005;ext=1235"]); // NSN matches, but extension is different - not the same number. - XCTAssertEqual(NBEMatchTypeNO_MATCH, [_aUtil isNumberMatch:@"+64 3 331-6005 ext.1235" second:@"3 331 6005#1234"]); - + XCTAssertEqual(NBEMatchTypeNO_MATCH, + [_aUtil isNumberMatch:@"+64 3 331-6005 ext.1235" second:@"3 331 6005#1234"]); + // Invalid numbers that can't be parsed. XCTAssertEqual(NBEMatchTypeNOT_A_NUMBER, [_aUtil isNumberMatch:@"4" second:@"3 331 6043"]); XCTAssertEqual(NBEMatchTypeNOT_A_NUMBER, [_aUtil isNumberMatch:@"+43" second:@"+64 3 331 6005"]); @@ -2532,94 +3135,116 @@ static NSArray *PhoneNumberDescEntryForNationalNumberPattern(NSString *numberPat XCTAssertEqual(NBEMatchTypeNOT_A_NUMBER, [_aUtil isNumberMatch:@"Dog" second:@"64 3 331 6005"]); } - - (void)testIsNumberMatchNsnMatches { // NSN matches. - XCTAssertEqual(NBEMatchTypeNSN_MATCH, [_aUtil isNumberMatch:@"+64 3 331-6005" second:@"03 331 6005"]); - XCTAssertEqual(NBEMatchTypeNSN_MATCH, [_aUtil isNumberMatch:@"+64 3 331-6005" second:@"tel:03-331-6005;isub=1234;phone-context=abc.nz"]); + XCTAssertEqual(NBEMatchTypeNSN_MATCH, + [_aUtil isNumberMatch:@"+64 3 331-6005" second:@"03 331 6005"]); + XCTAssertEqual(NBEMatchTypeNSN_MATCH, + [_aUtil isNumberMatch:@"+64 3 331-6005" + second:@"tel:03-331-6005;isub=1234;phone-context=abc.nz"]); XCTAssertEqual(NBEMatchTypeNSN_MATCH, [_aUtil isNumberMatch:self.nzNumber second:@"03 331 6005"]); // Here the second number possibly starts with the country calling code for // New Zealand, although we are unsure. - + NBPhoneNumber *unchangedNzNumber = self.nzNumber; - XCTAssertEqual(NBEMatchTypeNSN_MATCH, [_aUtil isNumberMatch:unchangedNzNumber second:@"(64-3) 331 6005"]); + XCTAssertEqual(NBEMatchTypeNSN_MATCH, + [_aUtil isNumberMatch:unchangedNzNumber second:@"(64-3) 331 6005"]); // Check the phone number proto was not edited during the method call. XCTAssertTrue([self.nzNumber isEqual:unchangedNzNumber]); - + // Here, the 1 might be a national prefix, if we compare it to the US number, // so the resultant match is an NSN match. - XCTAssertEqual(NBEMatchTypeNSN_MATCH, [_aUtil isNumberMatch:self.usNumber second:@"1-650-253-0000"]); + XCTAssertEqual(NBEMatchTypeNSN_MATCH, + [_aUtil isNumberMatch:self.usNumber second:@"1-650-253-0000"]); XCTAssertEqual(NBEMatchTypeNSN_MATCH, [_aUtil isNumberMatch:self.usNumber second:@"6502530000"]); - XCTAssertEqual(NBEMatchTypeNSN_MATCH, [_aUtil isNumberMatch:@"+1 650-253 0000" second:@"1 650 253 0000"]); - XCTAssertEqual(NBEMatchTypeNSN_MATCH, [_aUtil isNumberMatch:@"1 650-253 0000" second:@"1 650 253 0000"]); - XCTAssertEqual(NBEMatchTypeNSN_MATCH, [_aUtil isNumberMatch:@"1 650-253 0000" second:@"+1 650 253 0000"]); + XCTAssertEqual(NBEMatchTypeNSN_MATCH, + [_aUtil isNumberMatch:@"+1 650-253 0000" second:@"1 650 253 0000"]); + XCTAssertEqual(NBEMatchTypeNSN_MATCH, + [_aUtil isNumberMatch:@"1 650-253 0000" second:@"1 650 253 0000"]); + XCTAssertEqual(NBEMatchTypeNSN_MATCH, + [_aUtil isNumberMatch:@"1 650-253 0000" second:@"+1 650 253 0000"]); // For this case, the match will be a short NSN match, because we cannot // assume that the 1 might be a national prefix, so don't remove it when // parsing. - + NBPhoneNumber *randomNumber = [[NBPhoneNumber alloc] init]; [randomNumber setCountryCode:@41]; [randomNumber setNationalNumber:@6502530000]; - XCTAssertEqual(NBEMatchTypeSHORT_NSN_MATCH, [_aUtil isNumberMatch:randomNumber second:@"1-650-253-0000"]); + XCTAssertEqual(NBEMatchTypeSHORT_NSN_MATCH, + [_aUtil isNumberMatch:randomNumber second:@"1-650-253-0000"]); } - - (void)testIsNumberMatchShortNsnMatches { // Short NSN matches with the country not specified for either one or both // numbers. - XCTAssertEqual(NBEMatchTypeSHORT_NSN_MATCH, [_aUtil isNumberMatch:@"+64 3 331-6005" second:@"331 6005"]); - XCTAssertEqual(NBEMatchTypeSHORT_NSN_MATCH, [_aUtil isNumberMatch:@"+64 3 331-6005" second:@"tel:331-6005;phone-context=abc.nz"]); - XCTAssertEqual(NBEMatchTypeSHORT_NSN_MATCH, [_aUtil isNumberMatch:@"+64 3 331-6005" second:@"tel:331-6005;isub=1234;phone-context=abc.nz"]); - XCTAssertEqual(NBEMatchTypeSHORT_NSN_MATCH, [_aUtil isNumberMatch:@"+64 3 331-6005" second:@"tel:331-6005;isub=1234;phone-context=abc.nz;a=%A1"]); + XCTAssertEqual(NBEMatchTypeSHORT_NSN_MATCH, + [_aUtil isNumberMatch:@"+64 3 331-6005" second:@"331 6005"]); + XCTAssertEqual( + NBEMatchTypeSHORT_NSN_MATCH, + [_aUtil isNumberMatch:@"+64 3 331-6005" second:@"tel:331-6005;phone-context=abc.nz"]); + XCTAssertEqual(NBEMatchTypeSHORT_NSN_MATCH, + [_aUtil isNumberMatch:@"+64 3 331-6005" + second:@"tel:331-6005;isub=1234;phone-context=abc.nz"]); + XCTAssertEqual(NBEMatchTypeSHORT_NSN_MATCH, + [_aUtil isNumberMatch:@"+64 3 331-6005" + second:@"tel:331-6005;isub=1234;phone-context=abc.nz;a=%A1"]); // We did not know that the '0' was a national prefix since neither number has // a country code, so this is considered a SHORT_NSN_MATCH. - XCTAssertEqual(NBEMatchTypeSHORT_NSN_MATCH, [_aUtil isNumberMatch:@"3 331-6005" second:@"03 331 6005"]); - XCTAssertEqual(NBEMatchTypeSHORT_NSN_MATCH, [_aUtil isNumberMatch:@"3 331-6005" second:@"331 6005"]); - XCTAssertEqual(NBEMatchTypeSHORT_NSN_MATCH, [_aUtil isNumberMatch:@"3 331-6005" second:@"tel:331-6005;phone-context=abc.nz"]); - XCTAssertEqual(NBEMatchTypeSHORT_NSN_MATCH, [_aUtil isNumberMatch:@"3 331-6005" second:@"+64 331 6005"]); + XCTAssertEqual(NBEMatchTypeSHORT_NSN_MATCH, + [_aUtil isNumberMatch:@"3 331-6005" second:@"03 331 6005"]); + XCTAssertEqual(NBEMatchTypeSHORT_NSN_MATCH, + [_aUtil isNumberMatch:@"3 331-6005" second:@"331 6005"]); + XCTAssertEqual(NBEMatchTypeSHORT_NSN_MATCH, + [_aUtil isNumberMatch:@"3 331-6005" second:@"tel:331-6005;phone-context=abc.nz"]); + XCTAssertEqual(NBEMatchTypeSHORT_NSN_MATCH, + [_aUtil isNumberMatch:@"3 331-6005" second:@"+64 331 6005"]); // Short NSN match with the country specified. - XCTAssertEqual(NBEMatchTypeSHORT_NSN_MATCH, [_aUtil isNumberMatch:@"03 331-6005" second:@"331 6005"]); - XCTAssertEqual(NBEMatchTypeSHORT_NSN_MATCH, [_aUtil isNumberMatch:@"1 234 345 6789" second:@"345 6789"]); - XCTAssertEqual(NBEMatchTypeSHORT_NSN_MATCH, [_aUtil isNumberMatch:@"+1 (234) 345 6789" second:@"345 6789"]); + XCTAssertEqual(NBEMatchTypeSHORT_NSN_MATCH, + [_aUtil isNumberMatch:@"03 331-6005" second:@"331 6005"]); + XCTAssertEqual(NBEMatchTypeSHORT_NSN_MATCH, + [_aUtil isNumberMatch:@"1 234 345 6789" second:@"345 6789"]); + XCTAssertEqual(NBEMatchTypeSHORT_NSN_MATCH, + [_aUtil isNumberMatch:@"+1 (234) 345 6789" second:@"345 6789"]); // NSN matches, country calling code omitted for one number, extension missing // for one. - XCTAssertEqual(NBEMatchTypeSHORT_NSN_MATCH, [_aUtil isNumberMatch:@"+64 3 331-6005" second:@"3 331 6005#1234"]); + XCTAssertEqual(NBEMatchTypeSHORT_NSN_MATCH, + [_aUtil isNumberMatch:@"+64 3 331-6005" second:@"3 331 6005#1234"]); // One has Italian leading zero, one does not. - + NBPhoneNumber *italianNumberOne = [[NBPhoneNumber alloc] init]; [italianNumberOne setCountryCode:@39]; [italianNumberOne setNationalNumber:@1234]; [italianNumberOne setItalianLeadingZero:YES]; - + NBPhoneNumber *italianNumberTwo = [[NBPhoneNumber alloc] init]; [italianNumberTwo setCountryCode:@39]; [italianNumberTwo setNationalNumber:@1234]; - XCTAssertEqual(NBEMatchTypeSHORT_NSN_MATCH, [_aUtil isNumberMatch:italianNumberOne second:italianNumberTwo]); + XCTAssertEqual(NBEMatchTypeSHORT_NSN_MATCH, + [_aUtil isNumberMatch:italianNumberOne second:italianNumberTwo]); // One has an extension, the other has an extension of ''. [italianNumberOne setExtension:@"1234"]; italianNumberOne.italianLeadingZero = NO; [italianNumberTwo setExtension:@""]; - XCTAssertEqual(NBEMatchTypeSHORT_NSN_MATCH, [_aUtil isNumberMatch:italianNumberOne second:italianNumberTwo]); + XCTAssertEqual(NBEMatchTypeSHORT_NSN_MATCH, + [_aUtil isNumberMatch:italianNumberOne second:italianNumberTwo]); } - - (void)testCanBeInternationallyDialled { // We have no-international-dialling rules for the US in our test metadata // that say that toll-free numbers cannot be dialled internationally. XCTAssertFalse([_aUtil canBeInternationallyDialled:self.usTollFreeNumber]); - + // Normal US numbers can be internationally dialled. XCTAssertTrue([_aUtil canBeInternationallyDialled:self.usNumber]); - + // Invalid number. XCTAssertTrue([_aUtil canBeInternationallyDialled:self.usLocalNumber]); - + // We have no data for NZ - should return true. XCTAssertTrue([_aUtil canBeInternationallyDialled:self.nzNumber]); XCTAssertTrue([_aUtil canBeInternationallyDialled:self.internationalTollFreeNumber]); } - - (void)testIsAlphaNumber { XCTAssertTrue([_aUtil isAlphaNumber:@"1800 six-flags"]); XCTAssertTrue([_aUtil isAlphaNumber:@"1800 six-flags ext. 1234"]);