diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..31061c2 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = lf +indent_style = space +indent_size = 4 + diff --git a/.github/nginx/docs/403.html b/.github/nginx/docs/403.html new file mode 100644 index 0000000..237f5a0 --- /dev/null +++ b/.github/nginx/docs/403.html @@ -0,0 +1,10 @@ +<html> +<head> +<title>403</title> +</head> + +<body> +Forbidden 403 - custom error page. +</body> +</html> + diff --git a/.github/nginx/docs/data50k.json b/.github/nginx/docs/data50k.json new file mode 100644 index 0000000..bdb33d8 --- /dev/null +++ b/.github/nginx/docs/data50k.json @@ -0,0 +1,1712 @@ +[ + { + "_id": "678968892159bc07c5dd68ec", + "index": 0, + "guid": "61855db2-c9ab-4059-954f-f358095eeb5a", + "isActive": false, + "balance": "$3,147.81", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "blue", + "name": "Heath Leon", + "gender": "male", + "company": "LOCAZONE", + "email": "heathleon@locazone.com", + "phone": "+1 (858) 460-3584", + "address": "944 Bushwick Court, Hachita, Puerto Rico, 6039", + "about": "Minim deserunt nostrud duis deserunt. Tempor consequat duis eiusmod do consectetur non dolore et ut amet elit. Ut dolor esse sunt commodo velit do cillum id amet amet aliquip aliqua minim adipisicing. Quis laborum pariatur nulla aute ex ex ad Lorem.\r\n", + "registered": "2015-01-19T11:44:58 -01:00", + "latitude": -89.942481, + "longitude": 122.743374, + "tags": [ + "ipsum", + "nulla", + "et", + "ea", + "elit", + "labore", + "mollit" + ], + "friends": [ + { + "id": 0, + "name": "Johnnie Ramos" + }, + { + "id": 1, + "name": "Kathryn Mccarty" + }, + { + "id": 2, + "name": "Riley Tyler" + } + ], + "greeting": "Hello, Heath Leon! You have 10 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "67896889fb6f145b92cf3b7d", + "index": 1, + "guid": "39e6df63-d578-4383-9bcd-6aabaf1628a0", + "isActive": false, + "balance": "$2,007.17", + "picture": "http://placehold.it/32x32", + "age": 38, + "eyeColor": "brown", + "name": "Ochoa Dejesus", + "gender": "male", + "company": "ATGEN", + "email": "ochoadejesus@atgen.com", + "phone": "+1 (918) 496-3012", + "address": "334 Mill Street, Mayfair, Vermont, 1493", + "about": "Ipsum velit laboris laboris dolor cupidatat. Magna proident nisi dolore sunt. Laboris sint ut in fugiat magna aliqua labore amet in. Ipsum ea elit dolore minim laboris anim. Sint ad dolor velit nulla excepteur excepteur ad qui ad. Sint proident pariatur ullamco qui et in consequat quis magna voluptate enim nisi.\r\n", + "registered": "2019-09-12T12:11:44 -02:00", + "latitude": 86.586305, + "longitude": 103.229518, + "tags": [ + "voluptate", + "aute", + "non", + "exercitation", + "sit", + "id", + "ea" + ], + "friends": [ + { + "id": 0, + "name": "Margo Rosales" + }, + { + "id": 1, + "name": "Sharlene Blanchard" + }, + { + "id": 2, + "name": "Marquez Mathis" + } + ], + "greeting": "Hello, Ochoa Dejesus! You have 1 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "67896889e4ba3605e140b3aa", + "index": 2, + "guid": "ea66446a-3fc0-4a99-8f3d-88a479e7ea7d", + "isActive": false, + "balance": "$1,715.11", + "picture": "http://placehold.it/32x32", + "age": 36, + "eyeColor": "blue", + "name": "Dixie Tanner", + "gender": "female", + "company": "FUTURIS", + "email": "dixietanner@futuris.com", + "phone": "+1 (994) 411-2058", + "address": "413 Grand Avenue, Dodge, Marshall Islands, 3063", + "about": "Occaecat aute dolore anim id amet irure nostrud veniam cillum aliqua. Magna id do consectetur fugiat id voluptate enim in dolore reprehenderit laboris adipisicing duis occaecat. Cillum Lorem irure mollit cillum cillum ullamco. Sit duis enim magna in non irure sint qui irure nisi quis id deserunt. Dolor velit aliquip excepteur dolor mollit aliquip tempor in exercitation veniam sit cupidatat. Sunt deserunt consequat labore ullamco ex ad reprehenderit cupidatat id et pariatur qui.\r\n", + "registered": "2019-10-06T09:34:38 -02:00", + "latitude": 21.785702, + "longitude": -83.343646, + "tags": [ + "sint", + "ipsum", + "culpa", + "qui", + "laborum", + "velit", + "culpa" + ], + "friends": [ + { + "id": 0, + "name": "Ester Acevedo" + }, + { + "id": 1, + "name": "Young Bradshaw" + }, + { + "id": 2, + "name": "Kelly Craig" + } + ], + "greeting": "Hello, Dixie Tanner! You have 7 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "678968894d4042199706a8bb", + "index": 3, + "guid": "6740d244-a434-4b5b-a4df-975c57a8ce60", + "isActive": false, + "balance": "$1,613.16", + "picture": "http://placehold.it/32x32", + "age": 33, + "eyeColor": "brown", + "name": "Merritt Holder", + "gender": "male", + "company": "INVENTURE", + "email": "merrittholder@inventure.com", + "phone": "+1 (955) 542-3653", + "address": "283 Howard Avenue, Richford, Montana, 1277", + "about": "Aliqua est Lorem voluptate enim est sit commodo reprehenderit aliqua non. Minim eu cillum nulla excepteur magna enim labore deserunt irure labore tempor. Fugiat ullamco Lorem eu nostrud aliqua officia fugiat labore cillum mollit culpa reprehenderit.\r\n", + "registered": "2016-04-10T10:34:26 -02:00", + "latitude": -11.71265, + "longitude": 174.797694, + "tags": [ + "laboris", + "velit", + "labore", + "reprehenderit", + "quis", + "aliquip", + "eu" + ], + "friends": [ + { + "id": 0, + "name": "Kidd Contreras" + }, + { + "id": 1, + "name": "Roseann Robinson" + }, + { + "id": 2, + "name": "Glover Gaines" + } + ], + "greeting": "Hello, Merritt Holder! You have 8 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "678968896700542b1c631bea", + "index": 4, + "guid": "1b44442f-7e83-41bc-b3ea-396b0a745700", + "isActive": true, + "balance": "$2,560.70", + "picture": "http://placehold.it/32x32", + "age": 38, + "eyeColor": "blue", + "name": "Mia Ware", + "gender": "female", + "company": "ECRATIC", + "email": "miaware@ecratic.com", + "phone": "+1 (907) 418-2817", + "address": "811 Matthews Place, Jacksonburg, Massachusetts, 9759", + "about": "Non nulla dolore consectetur consequat veniam duis nisi. Do consequat anim dolore Lorem ad ipsum quis ad adipisicing et elit do consequat. Enim eiusmod laborum laboris culpa ut Lorem occaecat est laboris. Ipsum eiusmod enim et velit sunt nostrud eu laboris.\r\n", + "registered": "2018-07-03T05:47:54 -02:00", + "latitude": -47.378943, + "longitude": -64.173143, + "tags": [ + "est", + "et", + "enim", + "consequat", + "pariatur", + "commodo", + "eu" + ], + "friends": [ + { + "id": 0, + "name": "Graham Weaver" + }, + { + "id": 1, + "name": "Ivy Brock" + }, + { + "id": 2, + "name": "Rena Clemons" + } + ], + "greeting": "Hello, Mia Ware! You have 2 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "6789688948e7b16a4e48cd54", + "index": 5, + "guid": "f6985584-ac14-4ac5-a97a-d4fe265320a0", + "isActive": true, + "balance": "$3,811.15", + "picture": "http://placehold.it/32x32", + "age": 24, + "eyeColor": "brown", + "name": "Kathy Hull", + "gender": "female", + "company": "SENSATE", + "email": "kathyhull@sensate.com", + "phone": "+1 (833) 401-2573", + "address": "352 Cass Place, Beaverdale, Alabama, 3970", + "about": "Culpa veniam nostrud cillum sunt laborum dolor dolor aute ad id dolor duis adipisicing sunt. Nisi aliqua ut id esse. Proident quis id tempor enim officia proident cillum qui aute et esse nulla incididunt.\r\n", + "registered": "2023-01-11T03:51:38 -01:00", + "latitude": 25.499516, + "longitude": 127.561897, + "tags": [ + "quis", + "enim", + "reprehenderit", + "exercitation", + "magna", + "qui", + "nisi" + ], + "friends": [ + { + "id": 0, + "name": "Irma Bruce" + }, + { + "id": 1, + "name": "Shepherd Francis" + }, + { + "id": 2, + "name": "Clarice Buchanan" + } + ], + "greeting": "Hello, Kathy Hull! You have 10 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "6789688999c531b9cafae9bd", + "index": 6, + "guid": "b2b64d33-1f57-4fb3-9853-f91d5fe7fd15", + "isActive": false, + "balance": "$3,572.38", + "picture": "http://placehold.it/32x32", + "age": 38, + "eyeColor": "green", + "name": "Jody Barrett", + "gender": "female", + "company": "SUREMAX", + "email": "jodybarrett@suremax.com", + "phone": "+1 (997) 584-2940", + "address": "424 Coyle Street, Berlin, Missouri, 6564", + "about": "Occaecat fugiat reprehenderit mollit nostrud consequat consectetur ullamco excepteur officia veniam reprehenderit duis. Commodo excepteur eiusmod dolore sint enim. Nisi mollit minim aliquip eu aliquip occaecat do sunt aliqua exercitation.\r\n", + "registered": "2022-11-08T04:51:39 -01:00", + "latitude": -66.7021, + "longitude": 145.358944, + "tags": [ + "minim", + "laborum", + "id", + "aliquip", + "fugiat", + "mollit", + "reprehenderit" + ], + "friends": [ + { + "id": 0, + "name": "Robinson Zamora" + }, + { + "id": 1, + "name": "Delgado Figueroa" + }, + { + "id": 2, + "name": "Edwards Franco" + } + ], + "greeting": "Hello, Jody Barrett! You have 6 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "67896889270b96b8954dded2", + "index": 7, + "guid": "b3ddfc99-7423-477c-aa77-08abf8c6774f", + "isActive": true, + "balance": "$3,830.67", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "brown", + "name": "Kramer Lamb", + "gender": "male", + "company": "DIGIRANG", + "email": "kramerlamb@digirang.com", + "phone": "+1 (882) 506-2655", + "address": "467 Poplar Avenue, Fowlerville, District Of Columbia, 4834", + "about": "Ipsum tempor sint ad Lorem. Esse voluptate elit sint dolore velit. Et reprehenderit consequat quis velit sunt pariatur aliqua.\r\n", + "registered": "2016-03-13T07:32:45 -01:00", + "latitude": 62.041682, + "longitude": 168.188254, + "tags": [ + "aliquip", + "occaecat", + "reprehenderit", + "et", + "aliquip", + "mollit", + "nostrud" + ], + "friends": [ + { + "id": 0, + "name": "Lenore Miller" + }, + { + "id": 1, + "name": "Curry Osborn" + }, + { + "id": 2, + "name": "Ellen Pace" + } + ], + "greeting": "Hello, Kramer Lamb! You have 2 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "678968894aa8af8284b88917", + "index": 8, + "guid": "9fab8670-58a0-4090-b07d-ce7788b44367", + "isActive": false, + "balance": "$3,712.23", + "picture": "http://placehold.it/32x32", + "age": 36, + "eyeColor": "blue", + "name": "Laverne Todd", + "gender": "female", + "company": "YOGASM", + "email": "lavernetodd@yogasm.com", + "phone": "+1 (858) 573-3047", + "address": "120 McKinley Avenue, Watchtower, Louisiana, 4248", + "about": "Nisi ut aute pariatur amet duis sunt est pariatur aliqua exercitation amet ex cillum laboris. Lorem ipsum nisi aute id est tempor consectetur. Sit laborum in proident non fugiat ullamco occaecat laborum irure nostrud Lorem sit quis ex. Quis Lorem esse cillum aute do aliqua eu Lorem incididunt. Dolore qui incididunt reprehenderit velit esse anim amet nisi irure tempor. Ullamco in ullamco in tempor. Elit officia est fugiat fugiat excepteur cillum commodo culpa eu in deserunt exercitation.\r\n", + "registered": "2015-10-02T11:44:33 -02:00", + "latitude": -11.895959, + "longitude": -161.216083, + "tags": [ + "ex", + "eu", + "aliquip", + "fugiat", + "tempor", + "ad", + "Lorem" + ], + "friends": [ + { + "id": 0, + "name": "Smith Kline" + }, + { + "id": 1, + "name": "Larson Jacobs" + }, + { + "id": 2, + "name": "Darlene Huber" + } + ], + "greeting": "Hello, Laverne Todd! You have 4 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "678968896533315d22b05c71", + "index": 9, + "guid": "2843722d-1455-43a6-a262-5097f7d36137", + "isActive": false, + "balance": "$2,332.43", + "picture": "http://placehold.it/32x32", + "age": 23, + "eyeColor": "green", + "name": "Tamara Nash", + "gender": "female", + "company": "KINETICUT", + "email": "tamaranash@kineticut.com", + "phone": "+1 (883) 432-3648", + "address": "476 Fanchon Place, Bethpage, Palau, 2224", + "about": "Proident sit occaecat eu ullamco tempor quis consequat anim. Reprehenderit commodo duis sunt ex laboris aute anim. Aliquip ea Lorem elit nisi. Lorem quis Lorem excepteur occaecat laborum occaecat sunt do in.\r\n", + "registered": "2020-07-30T03:53:44 -02:00", + "latitude": -18.718883, + "longitude": 135.943883, + "tags": [ + "elit", + "incididunt", + "reprehenderit", + "ipsum", + "eiusmod", + "duis", + "tempor" + ], + "friends": [ + { + "id": 0, + "name": "Blanchard Hale" + }, + { + "id": 1, + "name": "Murray Acosta" + }, + { + "id": 2, + "name": "Hobbs Nielsen" + } + ], + "greeting": "Hello, Tamara Nash! You have 7 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "67896889467f7f2a8c0cc996", + "index": 10, + "guid": "9bdd03c3-9e8e-411b-ad82-dcd4f408f03b", + "isActive": false, + "balance": "$2,320.58", + "picture": "http://placehold.it/32x32", + "age": 35, + "eyeColor": "blue", + "name": "Hamilton Reid", + "gender": "male", + "company": "GINKLE", + "email": "hamiltonreid@ginkle.com", + "phone": "+1 (951) 589-2325", + "address": "188 Pulaski Street, Loyalhanna, Rhode Island, 4314", + "about": "Amet consectetur aliqua proident anim ut magna ipsum proident laborum occaecat consequat. Voluptate velit ullamco anim est occaecat in voluptate amet ut tempor quis adipisicing fugiat. Culpa dolor in quis id aliqua consectetur commodo. Id est eu velit sunt occaecat.\r\n", + "registered": "2014-01-02T09:29:04 -01:00", + "latitude": 7.14541, + "longitude": 136.872271, + "tags": [ + "amet", + "ad", + "labore", + "duis", + "culpa", + "sint", + "culpa" + ], + "friends": [ + { + "id": 0, + "name": "Marci Sexton" + }, + { + "id": 1, + "name": "Katharine Jackson" + }, + { + "id": 2, + "name": "Patricia Keller" + } + ], + "greeting": "Hello, Hamilton Reid! You have 1 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "67896889a387e7c49297f20e", + "index": 11, + "guid": "c4463554-7d8a-4ab3-9974-4ce6ddbbdd95", + "isActive": false, + "balance": "$3,466.29", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "green", + "name": "Mcclure Cummings", + "gender": "male", + "company": "ACLIMA", + "email": "mcclurecummings@aclima.com", + "phone": "+1 (931) 562-3282", + "address": "704 Beaver Street, Cliff, Virginia, 4103", + "about": "Aliquip adipisicing qui ea anim qui ipsum exercitation anim Lorem. Amet amet ullamco cupidatat duis excepteur aliquip incididunt. Cupidatat Lorem id ad incididunt voluptate non reprehenderit sit. Consequat aliquip irure velit ex ut cillum. Exercitation anim incididunt ad sint consequat anim voluptate non aute. Aute ad reprehenderit ea id Lorem consequat officia.\r\n", + "registered": "2014-02-02T09:17:54 -01:00", + "latitude": 32.309221, + "longitude": -60.608576, + "tags": [ + "veniam", + "proident", + "quis", + "cupidatat", + "ex", + "est", + "dolor" + ], + "friends": [ + { + "id": 0, + "name": "Lawson Duffy" + }, + { + "id": 1, + "name": "Elise Summers" + }, + { + "id": 2, + "name": "Pearl Hopkins" + } + ], + "greeting": "Hello, Mcclure Cummings! You have 1 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "6789688913d4641a3e91f3c9", + "index": 12, + "guid": "91fbe7f1-b6e3-4f1f-aa28-fe4df528c78c", + "isActive": true, + "balance": "$3,059.90", + "picture": "http://placehold.it/32x32", + "age": 30, + "eyeColor": "blue", + "name": "Anastasia Benton", + "gender": "female", + "company": "COMVEY", + "email": "anastasiabenton@comvey.com", + "phone": "+1 (990) 572-2829", + "address": "603 Albee Square, Bellamy, Kansas, 9843", + "about": "Id incididunt aliquip nulla incididunt consequat veniam Lorem nisi reprehenderit consectetur nostrud. Ex incididunt veniam aliquip occaecat ex ipsum proident pariatur nostrud magna. Anim proident ad aliquip deserunt fugiat veniam in nostrud consequat aute nostrud nisi.\r\n", + "registered": "2016-05-23T06:29:13 -02:00", + "latitude": 11.09315, + "longitude": -64.159707, + "tags": [ + "aliquip", + "dolore", + "excepteur", + "reprehenderit", + "irure", + "pariatur", + "sit" + ], + "friends": [ + { + "id": 0, + "name": "Bridget Callahan" + }, + { + "id": 1, + "name": "Santos Matthews" + }, + { + "id": 2, + "name": "Dominique Wall" + } + ], + "greeting": "Hello, Anastasia Benton! You have 4 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "678968895ff945167cc8af8d", + "index": 13, + "guid": "fca06686-dce1-4327-83f6-c809416928c6", + "isActive": false, + "balance": "$1,917.13", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "blue", + "name": "Vera Mathews", + "gender": "female", + "company": "BYTREX", + "email": "veramathews@bytrex.com", + "phone": "+1 (967) 466-2713", + "address": "673 Kensington Street, Hampstead, Maryland, 1550", + "about": "Et laborum voluptate ullamco reprehenderit adipisicing culpa laboris irure adipisicing ex incididunt mollit magna aliquip. Aute incididunt exercitation est exercitation pariatur. Dolor sunt do tempor sit eiusmod ipsum dolore dolore elit exercitation officia. Reprehenderit id incididunt consequat ea voluptate ipsum sint. Eu incididunt duis ad est labore tempor commodo consequat veniam deserunt nulla esse sit. Enim mollit proident sunt adipisicing nostrud irure ullamco culpa aute nulla. Deserunt nisi aliqua nisi est esse non sit sit non culpa.\r\n", + "registered": "2021-03-07T01:23:10 -01:00", + "latitude": -7.035406, + "longitude": 159.97817, + "tags": [ + "anim", + "minim", + "qui", + "commodo", + "Lorem", + "nisi", + "tempor" + ], + "friends": [ + { + "id": 0, + "name": "Carter Harrington" + }, + { + "id": 1, + "name": "Pierce Clarke" + }, + { + "id": 2, + "name": "Jessica Kramer" + } + ], + "greeting": "Hello, Vera Mathews! You have 9 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "67896889cc3e4709361c2c43", + "index": 14, + "guid": "51923eaa-04f0-41b5-9c9e-1851bf9549ca", + "isActive": true, + "balance": "$2,464.83", + "picture": "http://placehold.it/32x32", + "age": 24, + "eyeColor": "blue", + "name": "Underwood Weiss", + "gender": "male", + "company": "EPLODE", + "email": "underwoodweiss@eplode.com", + "phone": "+1 (916) 584-2778", + "address": "200 Dewey Place, Tyhee, New Jersey, 2884", + "about": "Nostrud laborum dolor veniam eiusmod. Est ullamco do reprehenderit elit laboris consectetur ex consequat. Anim pariatur cillum labore Lorem esse quis nisi aliquip. Pariatur duis magna esse deserunt cillum ullamco. Voluptate irure incididunt nisi magna laborum laboris.\r\n", + "registered": "2020-04-08T01:21:09 -02:00", + "latitude": -73.802629, + "longitude": -19.268173, + "tags": [ + "cupidatat", + "qui", + "sit", + "dolor", + "voluptate", + "sit", + "et" + ], + "friends": [ + { + "id": 0, + "name": "Catalina Burton" + }, + { + "id": 1, + "name": "Lindsay Bradford" + }, + { + "id": 2, + "name": "Fay Adkins" + } + ], + "greeting": "Hello, Underwood Weiss! You have 6 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "67896889ad2ba3eada3cadfd", + "index": 15, + "guid": "d14d89b5-503d-43b0-83ba-50551dbc143d", + "isActive": false, + "balance": "$3,079.73", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "blue", + "name": "Claudia Workman", + "gender": "female", + "company": "PODUNK", + "email": "claudiaworkman@podunk.com", + "phone": "+1 (822) 543-3216", + "address": "309 Union Street, Canterwood, Texas, 9227", + "about": "Esse pariatur magna ipsum et ea consequat ex tempor ipsum laborum. Consectetur occaecat ullamco id commodo aliquip ea ut. Pariatur esse officia cillum dolore Lorem eu sunt non elit elit et occaecat. Ut nostrud proident dolor ullamco ea nulla labore aliqua elit ea officia eu sint. In proident ullamco proident et eiusmod.\r\n", + "registered": "2019-06-10T12:45:55 -02:00", + "latitude": 85.874345, + "longitude": 115.321117, + "tags": [ + "elit", + "ea", + "eu", + "Lorem", + "reprehenderit", + "cupidatat", + "cupidatat" + ], + "friends": [ + { + "id": 0, + "name": "Nicholson Sellers" + }, + { + "id": 1, + "name": "Randall Silva" + }, + { + "id": 2, + "name": "Stokes May" + } + ], + "greeting": "Hello, Claudia Workman! You have 9 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "67896889bfe65cf69f5147aa", + "index": 16, + "guid": "7cec3e9b-9631-4eee-b9c5-9dea69ec9389", + "isActive": true, + "balance": "$1,407.35", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "blue", + "name": "Sweet Velez", + "gender": "male", + "company": "METROZ", + "email": "sweetvelez@metroz.com", + "phone": "+1 (875) 581-2984", + "address": "377 Kay Court, Chestnut, Nevada, 9351", + "about": "Minim consectetur ad eiusmod cupidatat ut pariatur. Deserunt mollit ullamco velit tempor aliqua minim quis dolor dolor reprehenderit. Do et aliquip Lorem nulla laboris. Sint reprehenderit esse aute aliqua cillum excepteur laboris irure pariatur eu voluptate amet. Ipsum aliqua ullamco commodo proident culpa ut officia magna irure do.\r\n", + "registered": "2016-08-23T05:40:50 -02:00", + "latitude": -17.009269, + "longitude": 63.193052, + "tags": [ + "minim", + "irure", + "ipsum", + "culpa", + "exercitation", + "est", + "ut" + ], + "friends": [ + { + "id": 0, + "name": "Maggie Rosa" + }, + { + "id": 1, + "name": "Lakeisha Hardy" + }, + { + "id": 2, + "name": "Marsh Ramsey" + } + ], + "greeting": "Hello, Sweet Velez! You have 2 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "67896889f4efa876deeba384", + "index": 17, + "guid": "c7e208c9-4958-4c9e-a082-c495cdf71af8", + "isActive": false, + "balance": "$3,263.72", + "picture": "http://placehold.it/32x32", + "age": 28, + "eyeColor": "green", + "name": "Inez Daugherty", + "gender": "female", + "company": "NIQUENT", + "email": "inezdaugherty@niquent.com", + "phone": "+1 (861) 539-2701", + "address": "976 Freeman Street, Allensworth, South Carolina, 6905", + "about": "Commodo duis commodo irure ea cupidatat eu et consectetur est adipisicing duis minim exercitation veniam. Aliqua irure pariatur reprehenderit sunt sunt nulla duis eiusmod ea laborum ex cupidatat culpa commodo. Cupidatat quis fugiat minim ipsum mollit sit reprehenderit occaecat id. Exercitation dolore est aliquip eiusmod occaecat ea Lorem consequat et laborum ullamco nisi. Sint laboris ad veniam Lorem et ullamco enim sint anim duis veniam minim enim tempor.\r\n", + "registered": "2021-12-15T06:49:38 -01:00", + "latitude": 20.349796, + "longitude": 144.382483, + "tags": [ + "voluptate", + "et", + "eiusmod", + "consectetur", + "tempor", + "nostrud", + "reprehenderit" + ], + "friends": [ + { + "id": 0, + "name": "Sybil Medina" + }, + { + "id": 1, + "name": "Moody Stuart" + }, + { + "id": 2, + "name": "Marina Mendez" + } + ], + "greeting": "Hello, Inez Daugherty! You have 4 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "678968891e93efb835bc2cd6", + "index": 18, + "guid": "ea4e2e6b-74aa-45cd-865d-5176b72d0b57", + "isActive": false, + "balance": "$2,429.16", + "picture": "http://placehold.it/32x32", + "age": 32, + "eyeColor": "brown", + "name": "Everett James", + "gender": "male", + "company": "MULTRON", + "email": "everettjames@multron.com", + "phone": "+1 (806) 440-2002", + "address": "140 Flatlands Avenue, Finderne, West Virginia, 1993", + "about": "Ut velit consequat minim amet consequat anim cupidatat occaecat. Laboris laboris deserunt sit enim dolor. Ea quis eu enim id aliquip voluptate voluptate. Mollit aliqua voluptate minim tempor ipsum velit anim velit do non eu tempor. Eu reprehenderit ad magna proident officia ex amet commodo sit aute. Nisi ipsum incididunt culpa irure incididunt dolore ea fugiat aliquip tempor nisi deserunt occaecat.\r\n", + "registered": "2015-06-09T09:37:35 -02:00", + "latitude": 79.763632, + "longitude": -32.813202, + "tags": [ + "pariatur", + "esse", + "nisi", + "cupidatat", + "eu", + "labore", + "minim" + ], + "friends": [ + { + "id": 0, + "name": "Julia Odom" + }, + { + "id": 1, + "name": "Faulkner Bright" + }, + { + "id": 2, + "name": "Ingram Hines" + } + ], + "greeting": "Hello, Everett James! You have 5 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "67896889484e2f07ff4f59a5", + "index": 19, + "guid": "d29d6eeb-07eb-4bb6-9f61-ec1c39d8fb42", + "isActive": true, + "balance": "$1,968.56", + "picture": "http://placehold.it/32x32", + "age": 39, + "eyeColor": "green", + "name": "Robles Gonzalez", + "gender": "male", + "company": "OBLIQ", + "email": "roblesgonzalez@obliq.com", + "phone": "+1 (858) 476-2018", + "address": "524 Essex Street, Deltaville, Maine, 2760", + "about": "Elit occaecat mollit ad dolor anim aliqua aliquip. Occaecat non dolore voluptate deserunt esse deserunt et cupidatat in consequat ut elit fugiat. Lorem incididunt Lorem adipisicing sint cupidatat dolor exercitation aliquip et. Proident et duis exercitation nostrud elit magna nisi proident do id eiusmod ipsum aliqua.\r\n", + "registered": "2020-06-14T02:02:05 -02:00", + "latitude": -38.033294, + "longitude": -73.473674, + "tags": [ + "labore", + "nisi", + "ipsum", + "do", + "duis", + "voluptate", + "officia" + ], + "friends": [ + { + "id": 0, + "name": "Miller Keith" + }, + { + "id": 1, + "name": "Macias Norman" + }, + { + "id": 2, + "name": "Harding Love" + } + ], + "greeting": "Hello, Robles Gonzalez! You have 4 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "678968894cdd88f5f142afc2", + "index": 20, + "guid": "564954b4-cdb8-4c72-9066-c3443ce622e2", + "isActive": true, + "balance": "$2,434.62", + "picture": "http://placehold.it/32x32", + "age": 32, + "eyeColor": "brown", + "name": "Michael Rice", + "gender": "female", + "company": "AVIT", + "email": "michaelrice@avit.com", + "phone": "+1 (961) 537-2882", + "address": "724 Schermerhorn Street, Freelandville, Wisconsin, 7531", + "about": "Cillum eiusmod qui deserunt adipisicing occaecat et mollit excepteur et sint. Anim velit voluptate nostrud eiusmod occaecat. Nisi ea duis eu culpa et proident ad magna irure sunt.\r\n", + "registered": "2015-07-06T06:58:09 -02:00", + "latitude": 27.379952, + "longitude": 152.717857, + "tags": [ + "adipisicing", + "eiusmod", + "commodo", + "esse", + "voluptate", + "sit", + "magna" + ], + "friends": [ + { + "id": 0, + "name": "Audrey Hunt" + }, + { + "id": 1, + "name": "Alfreda Atkinson" + }, + { + "id": 2, + "name": "Petty Mccray" + } + ], + "greeting": "Hello, Michael Rice! You have 9 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "678968893653170eca51eeea", + "index": 21, + "guid": "23891d2b-c633-4bec-af34-459ef5c1d182", + "isActive": false, + "balance": "$1,630.72", + "picture": "http://placehold.it/32x32", + "age": 35, + "eyeColor": "blue", + "name": "Roxie Harding", + "gender": "female", + "company": "RETRACK", + "email": "roxieharding@retrack.com", + "phone": "+1 (807) 452-3683", + "address": "238 Lorimer Street, Hendersonville, Hawaii, 3166", + "about": "Adipisicing anim mollit anim occaecat do ea sunt ullamco. Officia amet do sint aliquip. Irure in irure ut eu voluptate irure do veniam sit eu sint ea do. Elit consequat sint tempor eu laboris aute voluptate fugiat eiusmod nulla adipisicing elit.\r\n", + "registered": "2022-04-01T04:36:49 -02:00", + "latitude": -19.385063, + "longitude": 81.171286, + "tags": [ + "cupidatat", + "pariatur", + "dolore", + "quis", + "veniam", + "consectetur", + "nisi" + ], + "friends": [ + { + "id": 0, + "name": "Wendi Hammond" + }, + { + "id": 1, + "name": "Britt Howard" + }, + { + "id": 2, + "name": "Glenna Jarvis" + } + ], + "greeting": "Hello, Roxie Harding! You have 3 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "678968896ecfd0a6b5f262e6", + "index": 22, + "guid": "707cde38-1a0a-4ada-8e19-b792a0f95e41", + "isActive": false, + "balance": "$3,561.73", + "picture": "http://placehold.it/32x32", + "age": 30, + "eyeColor": "green", + "name": "Fernandez Vang", + "gender": "male", + "company": "ANIVET", + "email": "fernandezvang@anivet.com", + "phone": "+1 (958) 446-3306", + "address": "337 Manhattan Court, Calverton, Arkansas, 1087", + "about": "Amet nisi qui ipsum ea exercitation pariatur excepteur occaecat cupidatat esse. Labore irure laboris nisi nulla elit magna dolor in aliqua occaecat. Excepteur voluptate elit culpa eiusmod sunt officia dolor non laborum nisi elit qui. Non in duis sit commodo laboris elit qui do elit.\r\n", + "registered": "2020-03-21T04:08:04 -01:00", + "latitude": -17.799026, + "longitude": 109.653797, + "tags": [ + "do", + "anim", + "culpa", + "et", + "laboris", + "quis", + "nulla" + ], + "friends": [ + { + "id": 0, + "name": "Georgette Carver" + }, + { + "id": 1, + "name": "Terrell Bauer" + }, + { + "id": 2, + "name": "Franklin Velasquez" + } + ], + "greeting": "Hello, Fernandez Vang! You have 6 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "67896889af26bd2ba13d084e", + "index": 23, + "guid": "b81aba58-7979-43ef-9419-428469bb82fa", + "isActive": true, + "balance": "$3,844.44", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "green", + "name": "Goodwin Riggs", + "gender": "male", + "company": "BUZZMAKER", + "email": "goodwinriggs@buzzmaker.com", + "phone": "+1 (942) 582-3310", + "address": "954 McKibbin Street, Baker, Illinois, 6012", + "about": "Ut velit dolore nulla cillum. Voluptate officia laborum sit non. Officia est aliqua consequat elit culpa tempor pariatur consectetur sint aliqua Lorem excepteur. Quis duis elit consequat quis culpa occaecat do elit aliquip minim sunt minim consequat amet.\r\n", + "registered": "2020-03-24T09:10:26 -01:00", + "latitude": -77.188631, + "longitude": 54.89769, + "tags": [ + "fugiat", + "sint", + "consectetur", + "magna", + "occaecat", + "magna", + "minim" + ], + "friends": [ + { + "id": 0, + "name": "Manning Johnson" + }, + { + "id": 1, + "name": "Julie Roth" + }, + { + "id": 2, + "name": "Hurst Morton" + } + ], + "greeting": "Hello, Goodwin Riggs! You have 2 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "67896889d3eb436941362737", + "index": 24, + "guid": "703ae609-fcff-4209-83e0-b918bc8c1727", + "isActive": false, + "balance": "$2,253.77", + "picture": "http://placehold.it/32x32", + "age": 30, + "eyeColor": "green", + "name": "Nadine Burnett", + "gender": "female", + "company": "PORTICA", + "email": "nadineburnett@portica.com", + "phone": "+1 (867) 597-2918", + "address": "498 Duffield Street, Nadine, Michigan, 590", + "about": "Amet id excepteur minim mollit qui aute proident irure nulla est consectetur. Nulla labore ad amet elit est Lorem commodo pariatur et minim elit ea commodo. Cupidatat duis deserunt sint eu Lorem. Nulla magna duis sint est dolor proident cupidatat esse id reprehenderit officia. Irure officia est eu ullamco aliqua tempor reprehenderit minim occaecat mollit fugiat voluptate do. Eu proident ex eu qui elit anim nulla tempor non.\r\n", + "registered": "2021-04-29T06:30:01 -02:00", + "latitude": 6.670432, + "longitude": 145.804361, + "tags": [ + "aliquip", + "ea", + "enim", + "excepteur", + "nisi", + "et", + "adipisicing" + ], + "friends": [ + { + "id": 0, + "name": "Desiree Ferrell" + }, + { + "id": 1, + "name": "Ada Wolf" + }, + { + "id": 2, + "name": "Lorna Sandoval" + } + ], + "greeting": "Hello, Nadine Burnett! You have 9 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "6789688906f8f701cabb7d5f", + "index": 25, + "guid": "901b3976-e209-46e7-80ba-62e129e80841", + "isActive": false, + "balance": "$2,142.91", + "picture": "http://placehold.it/32x32", + "age": 34, + "eyeColor": "green", + "name": "Cynthia Oneal", + "gender": "female", + "company": "SILODYNE", + "email": "cynthiaoneal@silodyne.com", + "phone": "+1 (949) 575-2852", + "address": "979 Bay Avenue, Derwood, North Carolina, 9345", + "about": "Eu quis dolor esse esse dolore nostrud consequat magna veniam cillum ut ea labore aute. Ipsum aute magna commodo aute tempor officia reprehenderit dolore. Magna non dolore minim duis qui deserunt sint id nulla laboris. Consequat et aliqua culpa mollit ullamco qui aliqua consectetur adipisicing ipsum tempor Lorem sunt. Labore deserunt veniam velit laborum consectetur. Nulla non nostrud nostrud eu adipisicing duis ad pariatur duis sint enim magna. Minim nostrud fugiat adipisicing aliqua sunt enim ad aute.\r\n", + "registered": "2022-10-31T02:31:28 -01:00", + "latitude": -44.212207, + "longitude": -79.395289, + "tags": [ + "sunt", + "qui", + "nostrud", + "anim", + "ullamco", + "ad", + "amet" + ], + "friends": [ + { + "id": 0, + "name": "Walls Mcgowan" + }, + { + "id": 1, + "name": "Lucy Sosa" + }, + { + "id": 2, + "name": "Chen Crawford" + } + ], + "greeting": "Hello, Cynthia Oneal! You have 9 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "678968897010f8a2d2f3e4e6", + "index": 26, + "guid": "926a1b28-e574-4789-9bf5-35a23027b24a", + "isActive": true, + "balance": "$1,356.72", + "picture": "http://placehold.it/32x32", + "age": 26, + "eyeColor": "brown", + "name": "Dee Collier", + "gender": "female", + "company": "RECOGNIA", + "email": "deecollier@recognia.com", + "phone": "+1 (974) 418-2475", + "address": "330 Baycliff Terrace, Southview, South Dakota, 5056", + "about": "Elit incididunt voluptate sint occaecat fugiat laborum aliquip Lorem. Do irure enim eu ipsum sint amet in velit velit laborum. Labore velit deserunt eu in labore incididunt Lorem commodo Lorem ut deserunt esse velit quis.\r\n", + "registered": "2021-05-02T11:16:04 -02:00", + "latitude": -78.20278, + "longitude": 143.951657, + "tags": [ + "nostrud", + "dolore", + "nostrud", + "minim", + "laboris", + "esse", + "voluptate" + ], + "friends": [ + { + "id": 0, + "name": "Knox Wheeler" + }, + { + "id": 1, + "name": "Mandy Brady" + }, + { + "id": 2, + "name": "Palmer Oliver" + } + ], + "greeting": "Hello, Dee Collier! You have 10 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "67896889f2bbd835eec26ee2", + "index": 27, + "guid": "c486bb7e-e131-4318-a422-5aa90a964e97", + "isActive": true, + "balance": "$2,679.77", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "brown", + "name": "Arnold House", + "gender": "male", + "company": "ENDIPINE", + "email": "arnoldhouse@endipine.com", + "phone": "+1 (947) 409-2903", + "address": "961 Townsend Street, Osmond, North Dakota, 5610", + "about": "Est magna et consequat eu enim ad anim do eu veniam minim occaecat. Do id aliqua non excepteur incididunt ea officia qui commodo ullamco. Laboris ut aliquip labore aute. Labore et consequat ad ex nisi veniam consectetur proident ut. Amet excepteur id laboris excepteur. Anim occaecat nostrud velit nisi commodo labore dolor nulla irure ut adipisicing.\r\n", + "registered": "2017-04-08T06:20:29 -02:00", + "latitude": 61.339663, + "longitude": -120.443632, + "tags": [ + "quis", + "magna", + "eiusmod", + "adipisicing", + "pariatur", + "enim", + "ex" + ], + "friends": [ + { + "id": 0, + "name": "Harrington Spencer" + }, + { + "id": 1, + "name": "Felicia Hogan" + }, + { + "id": 2, + "name": "Grimes Conley" + } + ], + "greeting": "Hello, Arnold House! You have 5 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "678968898410f49e33f13931", + "index": 28, + "guid": "e05a6947-edf0-44f4-a868-ba06b28d06c9", + "isActive": true, + "balance": "$3,435.97", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "green", + "name": "Glenn Floyd", + "gender": "male", + "company": "CUJO", + "email": "glennfloyd@cujo.com", + "phone": "+1 (945) 565-2361", + "address": "706 College Place, Tooleville, New Mexico, 8499", + "about": "Laboris eu aliqua minim minim excepteur sint nostrud ad officia cillum. Voluptate fugiat culpa aliqua culpa occaecat non fugiat irure labore occaecat aute mollit velit. In reprehenderit laborum ullamco et est pariatur cupidatat eu. Officia ad quis eiusmod nisi dolore velit et ad. Elit minim cillum enim Lorem ullamco ipsum qui fugiat esse labore dolor sint.\r\n", + "registered": "2014-08-02T12:57:05 -02:00", + "latitude": -11.584925, + "longitude": 17.105328, + "tags": [ + "fugiat", + "sint", + "labore", + "non", + "in", + "do", + "velit" + ], + "friends": [ + { + "id": 0, + "name": "Caldwell Pope" + }, + { + "id": 1, + "name": "Marquita Cervantes" + }, + { + "id": 2, + "name": "Richard Rivas" + } + ], + "greeting": "Hello, Glenn Floyd! You have 7 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "67896889b69943eae3d9e622", + "index": 29, + "guid": "bd13ead7-5a1d-4d03-9681-d0ff9a6f85f8", + "isActive": false, + "balance": "$1,054.53", + "picture": "http://placehold.it/32x32", + "age": 21, + "eyeColor": "green", + "name": "Mckenzie Holt", + "gender": "male", + "company": "BIOSPAN", + "email": "mckenzieholt@biospan.com", + "phone": "+1 (938) 516-3531", + "address": "227 Monitor Street, Hollins, Pennsylvania, 6037", + "about": "Mollit sint esse sunt nulla aute et. Sint irure eiusmod tempor voluptate est sint anim. Ea quis in in occaecat exercitation elit. Officia Lorem aliqua enim est quis esse. Aliquip duis occaecat sunt reprehenderit ex.\r\n", + "registered": "2014-09-26T02:45:10 -02:00", + "latitude": -85.76409, + "longitude": 55.493425, + "tags": [ + "ex", + "do", + "dolor", + "sit", + "irure", + "nisi", + "fugiat" + ], + "friends": [ + { + "id": 0, + "name": "Diann Cortez" + }, + { + "id": 1, + "name": "Payne Dalton" + }, + { + "id": 2, + "name": "Ilene Bernard" + } + ], + "greeting": "Hello, Mckenzie Holt! You have 9 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "67896889929579ebf5fd9590", + "index": 30, + "guid": "512a5078-4fa5-40ce-b83b-5922c985306c", + "isActive": true, + "balance": "$2,452.13", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "green", + "name": "Medina Obrien", + "gender": "male", + "company": "CRUSTATIA", + "email": "medinaobrien@crustatia.com", + "phone": "+1 (870) 459-3149", + "address": "425 Schenck Place, Golconda, Wyoming, 1378", + "about": "Non incididunt elit ex fugiat. Incididunt do duis dolor ipsum eu sit proident laborum. Officia amet consequat nulla eiusmod incididunt elit est.\r\n", + "registered": "2022-12-28T02:50:45 -01:00", + "latitude": 4.731618, + "longitude": 108.36064, + "tags": [ + "commodo", + "ad", + "pariatur", + "amet", + "et", + "eiusmod", + "consectetur" + ], + "friends": [ + { + "id": 0, + "name": "Slater Burch" + }, + { + "id": 1, + "name": "Torres Bell" + }, + { + "id": 2, + "name": "Lela Mckenzie" + } + ], + "greeting": "Hello, Medina Obrien! You have 7 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "67896889b79198d3c8643407", + "index": 31, + "guid": "664de1dd-10c4-4aec-a5e1-900bbd7bd850", + "isActive": false, + "balance": "$1,573.08", + "picture": "http://placehold.it/32x32", + "age": 29, + "eyeColor": "brown", + "name": "Jimmie Meadows", + "gender": "female", + "company": "FLEETMIX", + "email": "jimmiemeadows@fleetmix.com", + "phone": "+1 (804) 564-3001", + "address": "451 Driggs Avenue, Turpin, Connecticut, 437", + "about": "Ex Lorem quis anim ipsum exercitation quis amet voluptate commodo excepteur officia voluptate anim. Eiusmod dolor id voluptate sunt. Do nostrud sit reprehenderit minim. Ex est labore aliqua Lorem non minim anim duis nulla anim nisi. Dolor proident dolor elit dolore sunt nostrud tempor laborum. Ut consequat ullamco ad eu. Exercitation fugiat labore nulla ad elit labore.\r\n", + "registered": "2021-03-08T04:40:24 -01:00", + "latitude": 40.284919, + "longitude": -96.632366, + "tags": [ + "nisi", + "sit", + "cupidatat", + "qui", + "est", + "ut", + "dolore" + ], + "friends": [ + { + "id": 0, + "name": "Espinoza Garza" + }, + { + "id": 1, + "name": "Singleton Mcguire" + }, + { + "id": 2, + "name": "Tucker Byers" + } + ], + "greeting": "Hello, Jimmie Meadows! You have 5 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "678968892f474fa3a09b44fc", + "index": 32, + "guid": "a2e47043-e2fe-40f8-9d41-a2bf23e6f6ec", + "isActive": false, + "balance": "$1,599.12", + "picture": "http://placehold.it/32x32", + "age": 22, + "eyeColor": "green", + "name": "Holland Strickland", + "gender": "male", + "company": "UNIWORLD", + "email": "hollandstrickland@uniworld.com", + "phone": "+1 (969) 452-3892", + "address": "103 Vandervoort Place, Falmouth, Oregon, 5559", + "about": "Laborum consequat mollit in excepteur tempor proident. Adipisicing veniam magna et elit fugiat. Ea excepteur labore irure tempor exercitation dolore proident consequat Lorem mollit deserunt commodo consequat nisi.\r\n", + "registered": "2024-12-12T11:29:09 -01:00", + "latitude": 17.177355, + "longitude": -96.458829, + "tags": [ + "tempor", + "aute", + "dolor", + "tempor", + "nostrud", + "exercitation", + "id" + ], + "friends": [ + { + "id": 0, + "name": "Tameka Myers" + }, + { + "id": 1, + "name": "Roach Lang" + }, + { + "id": 2, + "name": "Sharp Sawyer" + } + ], + "greeting": "Hello, Holland Strickland! You have 4 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "67896889dd18e211924147f8", + "index": 33, + "guid": "bc558326-2703-466c-8308-80afcdafc944", + "isActive": false, + "balance": "$1,752.70", + "picture": "http://placehold.it/32x32", + "age": 30, + "eyeColor": "brown", + "name": "Ramirez Pena", + "gender": "male", + "company": "TWIGGERY", + "email": "ramirezpena@twiggery.com", + "phone": "+1 (863) 502-2335", + "address": "758 Coffey Street, Roulette, New Hampshire, 9164", + "about": "Deserunt irure amet occaecat consectetur. Mollit et tempor deserunt commodo commodo qui sunt sit quis occaecat in velit. Elit dolor laboris ullamco consequat veniam veniam pariatur et cillum exercitation et aute consectetur. Minim irure consequat elit exercitation reprehenderit in dolore Lorem officia laboris. Et sit excepteur sit anim reprehenderit dolor ad culpa deserunt ullamco do ad sint reprehenderit. Sunt enim sunt ut officia in sint ex Lorem nulla proident. Amet officia aute cillum sunt nisi ea.\r\n", + "registered": "2017-07-15T06:04:18 -02:00", + "latitude": 18.9219, + "longitude": -83.048282, + "tags": [ + "cillum", + "aliquip", + "laborum", + "aliquip", + "cillum", + "deserunt", + "magna" + ], + "friends": [ + { + "id": 0, + "name": "Bethany Vance" + }, + { + "id": 1, + "name": "Genevieve Bass" + }, + { + "id": 2, + "name": "Jenkins Hurley" + } + ], + "greeting": "Hello, Ramirez Pena! You have 6 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "678968897680cafe68071cbd", + "index": 34, + "guid": "4f59512c-f798-443b-96c4-3e5ec8c70b89", + "isActive": false, + "balance": "$1,603.01", + "picture": "http://placehold.it/32x32", + "age": 30, + "eyeColor": "green", + "name": "Sargent Donovan", + "gender": "male", + "company": "KROG", + "email": "sargentdonovan@krog.com", + "phone": "+1 (987) 484-3984", + "address": "500 Summit Street, Brewster, Minnesota, 4067", + "about": "Et elit duis aute est. Pariatur tempor anim est non nulla est id. Aliqua reprehenderit est deserunt tempor in dolor laborum id elit. Ipsum consequat amet magna ex excepteur proident exercitation culpa tempor nostrud ad elit quis amet. Lorem est ullamco nisi elit amet adipisicing voluptate aliquip in. Aute veniam labore minim mollit ex occaecat fugiat anim.\r\n", + "registered": "2021-12-13T08:00:58 -01:00", + "latitude": -38.826269, + "longitude": -5.167006, + "tags": [ + "exercitation", + "adipisicing", + "duis", + "non", + "sint", + "cupidatat", + "consequat" + ], + "friends": [ + { + "id": 0, + "name": "Frankie Harper" + }, + { + "id": 1, + "name": "Josefina Rogers" + }, + { + "id": 2, + "name": "Reed Mcdaniel" + } + ], + "greeting": "Hello, Sargent Donovan! You have 1 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "678968891342a6852d819b21", + "index": 35, + "guid": "174aaa93-0201-4760-bac1-3abafc937f56", + "isActive": false, + "balance": "$3,527.21", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "blue", + "name": "Dianna Frost", + "gender": "female", + "company": "VIDTO", + "email": "diannafrost@vidto.com", + "phone": "+1 (801) 521-3481", + "address": "412 Morton Street, Collins, Virgin Islands, 640", + "about": "Aute culpa quis eu anim ea mollit aliqua pariatur. Ad aliqua qui ex minim mollit nisi quis voluptate eiusmod Lorem. Lorem eu esse consequat fugiat et excepteur magna minim dolor excepteur occaecat.\r\n", + "registered": "2020-12-05T10:32:04 -01:00", + "latitude": 66.185497, + "longitude": 66.232216, + "tags": [ + "labore", + "est", + "est", + "commodo", + "ea", + "laboris", + "sunt" + ], + "friends": [ + { + "id": 0, + "name": "Mcgee Levy" + }, + { + "id": 1, + "name": "Latonya Foreman" + }, + { + "id": 2, + "name": "Ware Mayer" + } + ], + "greeting": "Hello, Dianna Frost! You have 7 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "67896889ebcb153388b04b9e", + "index": 36, + "guid": "208ec8a6-81aa-4cae-a563-2b0f070d7809", + "isActive": true, + "balance": "$1,300.20", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "green", + "name": "Melody Navarro", + "gender": "female", + "company": "KRAGGLE", + "email": "melodynavarro@kraggle.com", + "phone": "+1 (841) 496-3088", + "address": "451 Bergen Avenue, Jugtown, Nebraska, 8813", + "about": "Non irure excepteur dolore nisi officia. Exercitation aute ut aliqua id velit ullamco nostrud non sint aute dolore id. Consectetur aliquip consectetur in sint amet.\r\n", + "registered": "2016-09-24T10:23:13 -02:00", + "latitude": -44.023175, + "longitude": 46.434172, + "tags": [ + "occaecat", + "ad", + "in", + "qui", + "ipsum", + "ut", + "sint" + ], + "friends": [ + { + "id": 0, + "name": "Durham Levine" + }, + { + "id": 1, + "name": "Lila Cooke" + }, + { + "id": 2, + "name": "Savage Terrell" + } + ], + "greeting": "Hello, Melody Navarro! You have 8 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "67896889a24681261942cd41", + "index": 37, + "guid": "bef4492a-a736-4d8e-ae95-37de3a907f48", + "isActive": false, + "balance": "$2,362.82", + "picture": "http://placehold.it/32x32", + "age": 35, + "eyeColor": "green", + "name": "Tammie William", + "gender": "female", + "company": "NETPLODE", + "email": "tammiewilliam@netplode.com", + "phone": "+1 (885) 542-2497", + "address": "385 Williamsburg Street, Rockbridge, Alaska, 8363", + "about": "Veniam est cupidatat exercitation deserunt duis adipisicing adipisicing. Consequat commodo sunt labore ipsum quis voluptate commodo irure ipsum ex magna adipisicing do. Incididunt labore eu mollit ea tempor eiusmod esse adipisicing Lorem fugiat aliqua cillum. Quis deserunt cillum elit voluptate magna adipisicing amet. Laboris aute sint fugiat enim ullamco eiusmod magna Lorem commodo enim aliqua est eu. Cillum sit aute incididunt ullamco anim non proident eu ad. Nulla dolore veniam duis do.\r\n", + "registered": "2024-03-22T07:17:34 -01:00", + "latitude": -53.858968, + "longitude": 122.230548, + "tags": [ + "quis", + "consequat", + "excepteur", + "ullamco", + "quis", + "anim", + "magna" + ], + "friends": [ + { + "id": 0, + "name": "Betty Gomez" + }, + { + "id": 1, + "name": "Alvarado Shepherd" + }, + { + "id": 2, + "name": "Spencer Dillon" + } + ], + "greeting": "Hello, Tammie William! You have 7 unread messages.", + "favoriteFruit": "banana" + } +] \ No newline at end of file diff --git a/.github/nginx/docs/plugged.png b/.github/nginx/docs/plugged.png new file mode 100644 index 0000000..a277491 Binary files /dev/null and b/.github/nginx/docs/plugged.png differ diff --git a/.github/nginx/mime.types b/.github/nginx/mime.types new file mode 100644 index 0000000..89be9a4 --- /dev/null +++ b/.github/nginx/mime.types @@ -0,0 +1,89 @@ + +types { + text/html html htm shtml; + text/css css; + text/xml xml; + image/gif gif; + image/jpeg jpeg jpg; + application/javascript js; + application/atom+xml atom; + application/rss+xml rss; + + text/mathml mml; + text/plain txt; + text/vnd.sun.j2me.app-descriptor jad; + text/vnd.wap.wml wml; + text/x-component htc; + + image/png png; + image/tiff tif tiff; + image/vnd.wap.wbmp wbmp; + image/x-icon ico; + image/x-jng jng; + image/x-ms-bmp bmp; + image/svg+xml svg svgz; + image/webp webp; + + application/font-woff woff; + application/java-archive jar war ear; + application/json json; + application/mac-binhex40 hqx; + application/msword doc; + application/pdf pdf; + application/postscript ps eps ai; + application/rtf rtf; + application/vnd.apple.mpegurl m3u8; + application/vnd.ms-excel xls; + application/vnd.ms-fontobject eot; + application/vnd.ms-powerpoint ppt; + application/vnd.wap.wmlc wmlc; + application/vnd.google-earth.kml+xml kml; + application/vnd.google-earth.kmz kmz; + application/x-7z-compressed 7z; + application/x-cocoa cco; + application/x-java-archive-diff jardiff; + application/x-java-jnlp-file jnlp; + application/x-makeself run; + application/x-perl pl pm; + application/x-pilot prc pdb; + application/x-rar-compressed rar; + application/x-redhat-package-manager rpm; + application/x-sea sea; + application/x-shockwave-flash swf; + application/x-stuffit sit; + application/x-tcl tcl tk; + application/x-x509-ca-cert der pem crt; + application/x-xpinstall xpi; + application/xhtml+xml xhtml; + application/xspf+xml xspf; + application/zip zip; + + application/octet-stream bin exe dll; + application/octet-stream deb; + application/octet-stream dmg; + application/octet-stream iso img; + application/octet-stream msi msp msm; + + application/vnd.openxmlformats-officedocument.wordprocessingml.document docx; + application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx; + application/vnd.openxmlformats-officedocument.presentationml.presentation pptx; + + audio/midi mid midi kar; + audio/mpeg mp3; + audio/ogg ogg; + audio/x-m4a m4a; + audio/x-realaudio ra; + + video/3gpp 3gpp 3gp; + video/mp2t ts; + video/mp4 mp4; + video/mpeg mpeg mpg; + video/quicktime mov; + video/webm webm; + video/x-flv flv; + video/x-m4v m4v; + video/x-mng mng; + video/x-ms-asf asx asf; + video/x-ms-wmv wmv; + video/x-msvideo avi; +} diff --git a/.github/nginx/modsecurity.conf b/.github/nginx/modsecurity.conf new file mode 100644 index 0000000..c97f102 --- /dev/null +++ b/.github/nginx/modsecurity.conf @@ -0,0 +1,291 @@ +# -- Rule engine initialization ---------------------------------------------- + +# Enable ModSecurity, attaching it to every transaction. Use detection +# only to start with, because that minimises the chances of post-installation +# disruption. +# +SecRuleEngine On + + +# -- Request body handling --------------------------------------------------- + +# Allow ModSecurity to access request bodies. If you don't, ModSecurity +# won't be able to see any POST parameters, which opens a large security +# hole for attackers to exploit. +# +SecRequestBodyAccess On + + +# Enable XML request body parser. +# Initiate XML Processor in case of xml content-type +# +SecRule REQUEST_HEADERS:Content-Type "^(?:application(?:/soap\+|/)|text/)xml" \ + "id:'200000',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=XML" + +# Enable JSON request body parser. +# Initiate JSON Processor in case of JSON content-type; change accordingly +# if your application does not use 'application/json' +# +SecRule REQUEST_HEADERS:Content-Type "^application/json" \ + "id:'200001',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON" + +# Sample rule to enable JSON request body parser for more subtypes. +# Uncomment or adapt this rule if you want to engage the JSON +# Processor for "+json" subtypes +# +#SecRule REQUEST_HEADERS:Content-Type "^application/[a-z0-9.-]+[+]json" \ +# "id:'200006',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON" + +# Maximum request body size we will accept for buffering. If you support +# file uploads then the value given on the first line has to be as large +# as the largest file you are willing to accept. The second value refers +# to the size of data, with files excluded. You want to keep that value as +# low as practical. +# +SecRequestBodyLimit 13107200 +SecRequestBodyNoFilesLimit 131072 + +# What to do if the request body size is above our configured limit. +# Keep in mind that this setting will automatically be set to ProcessPartial +# when SecRuleEngine is set to DetectionOnly mode in order to minimize +# disruptions when initially deploying ModSecurity. +# +SecRequestBodyLimitAction Reject + +# Maximum parsing depth allowed for JSON objects. You want to keep this +# value as low as practical. +# +SecRequestBodyJsonDepthLimit 512 + +# Maximum number of args allowed per request. You want to keep this +# value as low as practical. The value should match that in rule 200007. +SecArgumentsLimit 1000 + +# If SecArgumentsLimit has been set, you probably want to reject any +# request body that has only been partly parsed. The value used in this +# rule should match what was used with SecArgumentsLimit +SecRule &ARGS "@ge 1000" \ +"id:'200007', phase:2,t:none,log,deny,status:400,msg:'Failed to fully parse request body due to large argument count',severity:2" + +# Verify that we've correctly processed the request body. +# As a rule of thumb, when failing to process a request body +# you should reject the request (when deployed in blocking mode) +# or log a high-severity alert (when deployed in detection-only mode). +# +SecRule REQBODY_ERROR "!@eq 0" \ +"id:'200002', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2" + +# By default be strict with what we accept in the multipart/form-data +# request body. If the rule below proves to be too strict for your +# environment consider changing it to detection-only. You are encouraged +# _not_ to remove it altogether. +# +SecRule MULTIPART_STRICT_ERROR "!@eq 0" \ +"id:'200003',phase:2,t:none,log,deny,status:400, \ +msg:'Multipart request body failed strict validation: \ +PE %{REQBODY_PROCESSOR_ERROR}, \ +BQ %{MULTIPART_BOUNDARY_QUOTED}, \ +BW %{MULTIPART_BOUNDARY_WHITESPACE}, \ +DB %{MULTIPART_DATA_BEFORE}, \ +DA %{MULTIPART_DATA_AFTER}, \ +HF %{MULTIPART_HEADER_FOLDING}, \ +LF %{MULTIPART_LF_LINE}, \ +SM %{MULTIPART_MISSING_SEMICOLON}, \ +IQ %{MULTIPART_INVALID_QUOTING}, \ +IP %{MULTIPART_INVALID_PART}, \ +IH %{MULTIPART_INVALID_HEADER_FOLDING}, \ +FL %{MULTIPART_FILE_LIMIT_EXCEEDED}'" + +# Did we see anything that might be a boundary? +# +# Here is a short description about the ModSecurity Multipart parser: the +# parser returns with value 0, if all "boundary-like" line matches with +# the boundary string which given in MIME header. In any other cases it returns +# with different value, eg. 1 or 2. +# +# The RFC 1341 descript the multipart content-type and its syntax must contains +# only three mandatory lines (above the content): +# * Content-Type: multipart/mixed; boundary=BOUNDARY_STRING +# * --BOUNDARY_STRING +# * --BOUNDARY_STRING-- +# +# First line indicates, that this is a multipart content, second shows that +# here starts a part of the multipart content, third shows the end of content. +# +# If there are any other lines, which starts with "--", then it should be +# another boundary id - or not. +# +# After 3.0.3, there are two kinds of types of boundary errors: strict and permissive. +# +# If multipart content contains the three necessary lines with correct order, but +# there are one or more lines with "--", then parser returns with value 2 (non-zero). +# +# If some of the necessary lines (usually the start or end) misses, or the order +# is wrong, then parser returns with value 1 (also a non-zero). +# +# You can choose, which one is what you need. The example below contains the +# 'strict' mode, which means if there are any lines with start of "--", then +# ModSecurity blocked the content. But the next, commented example contains +# the 'permissive' mode, then you check only if the necessary lines exists in +# correct order. Whit this, you can enable to upload PEM files (eg "----BEGIN.."), +# or other text files, which contains eg. HTTP headers. +# +# The difference is only the operator - in strict mode (first) the content blocked +# in case of any non-zero value. In permissive mode (second, commented) the +# content blocked only if the value is explicit 1. If it 0 or 2, the content will +# allowed. +# + +# +# See #1747 and #1924 for further information on the possible values for +# MULTIPART_UNMATCHED_BOUNDARY. +# +SecRule MULTIPART_UNMATCHED_BOUNDARY "@eq 1" \ + "id:'200004',phase:2,t:none,log,deny,msg:'Multipart parser detected a possible unmatched boundary.'" + + +# PCRE Tuning +# We want to avoid a potential RegEx DoS condition +# +SecPcreMatchLimit 1000 +SecPcreMatchLimitRecursion 1000 + +# Some internal errors will set flags in TX and we will need to look for these. +# All of these are prefixed with "MSC_". The following flags currently exist: +# +# MSC_PCRE_LIMITS_EXCEEDED: PCRE match limits were exceeded. +# +SecRule TX:/^MSC_/ "!@streq 0" \ + "id:'200005',phase:2,t:none,deny,msg:'ModSecurity internal error flagged: %{MATCHED_VAR_NAME}'" + + +# -- Response body handling -------------------------------------------------- + +# Allow ModSecurity to access response bodies. +# You should have this directive enabled in order to identify errors +# and data leakage issues. +# +# Do keep in mind that enabling this directive does increases both +# memory consumption and response latency. +# +SecResponseBodyAccess On + +# Which response MIME types do you want to inspect? You should adjust the +# configuration below to catch documents but avoid static files +# (e.g., images and archives). +# +SecResponseBodyMimeType text/plain text/html text/xml + +# Buffer response bodies of up to 512 KB in length. +SecResponseBodyLimit 524288 + +# What happens when we encounter a response body larger than the configured +# limit? By default, we process what we have and let the rest through. +# That's somewhat less secure, but does not break any legitimate pages. +# +SecResponseBodyLimitAction ProcessPartial + + +# -- Filesystem configuration ------------------------------------------------ + +# The location where ModSecurity stores temporary files (for example, when +# it needs to handle a file upload that is larger than the configured limit). +# +# This default setting is chosen due to all systems have /tmp available however, +# this is less than ideal. It is recommended that you specify a location that's private. +# +SecTmpDir /tmp/ + +# The location where ModSecurity will keep its persistent data. This default setting +# is chosen due to all systems have /tmp available however, it +# too should be updated to a place that other users can't access. +# +SecDataDir /tmp/ + + +# -- File uploads handling configuration ------------------------------------- + +# The location where ModSecurity stores intercepted uploaded files. This +# location must be private to ModSecurity. You don't want other users on +# the server to access the files, do you? +# +#SecUploadDir /opt/modsecurity/var/upload/ + +# By default, only keep the files that were determined to be unusual +# in some way (by an external inspection script). For this to work you +# will also need at least one file inspection rule. +# +#SecUploadKeepFiles RelevantOnly + +# Uploaded files are by default created with permissions that do not allow +# any other user to access them. You may need to relax that if you want to +# interface ModSecurity to an external program (e.g., an anti-virus). +# +#SecUploadFileMode 0600 + + +# -- Debug log configuration ------------------------------------------------- + +# The default debug log configuration is to duplicate the error, warning +# and notice messages from the error log. +# +#SecDebugLog /opt/modsecurity/var/log/debug.log +#SecDebugLogLevel 3 + + +# -- Audit log configuration ------------------------------------------------- + +# Log the transactions that are marked by a rule, as well as those that +# trigger a server error (determined by a 5xx or 4xx, excluding 404, +# level response status codes). +# +SecAuditEngine RelevantOnly +SecAuditLogRelevantStatus "^(?:5|4(?!04))" + +# Log everything we know about a transaction. +SecAuditLogParts ABIJDEFHZ + +# Use a single file for logging. This is much easier to look at, but +# assumes that you will use the audit log only ocassionally. +# +SecAuditLogType Serial +SecAuditLog /var/log/modsec_audit.log + +# Specify the path for concurrent audit logging. +#SecAuditLogStorageDir /opt/modsecurity/var/audit/ + + +# -- Miscellaneous ----------------------------------------------------------- + +# Use the most commonly used application/x-www-form-urlencoded parameter +# separator. There's probably only one application somewhere that uses +# something else so don't expect to change this value. +# +SecArgumentSeparator & + +# Settle on version 0 (zero) cookies, as that is what most applications +# use. Using an incorrect cookie version may open your installation to +# evasion attacks (against the rules that examine named cookies). +# +SecCookieFormat 0 + +# Specify your Unicode Code Point. +# This mapping is used by the t:urlDecodeUni transformation function +# to properly map encoded data to your language. Properly setting +# these directives helps to reduce false positives and negatives. +# +SecUnicodeMapFile unicode.mapping 20127 + +# Improve the quality of ModSecurity by sharing information about your +# current ModSecurity version and dependencies versions. +# The following information will be shared: ModSecurity version, +# Web Server version, APR version, PCRE version, Lua version, Libxml2 +# version, Anonymous unique id for host. +SecStatusEngine Off + +SecRule ARGS "@rx attack" \ + "id:10001,\ + phase:1,\ + t:none,\ + log,\ + deny" diff --git a/.github/nginx/nginx.conf b/.github/nginx/nginx.conf new file mode 100644 index 0000000..0ac7802 --- /dev/null +++ b/.github/nginx/nginx.conf @@ -0,0 +1,78 @@ +user www-data; +worker_processes auto; +pid /run/nginx.pid; +worker_cpu_affinity auto; + +#working_directory /tmp/cores/; +worker_rlimit_core 2000M; +debug_points abort; + +#load_module /usr/local/nginx/modules/ngx_http_modsecurity_module.so; + +events { + worker_connections 768; +# multi_accept on; +# use epoll; +} + +worker_rlimit_nofile 33268; + +#daemon off; +#master_process off; + +http { + + ## + # Basic Settings + ## + + types_hash_max_size 2048; + + server_names_hash_bucket_size 64; + + include mime.types; + default_type application/octet-stream; + + ## + # Logging Settings + ## + + #access_log /dev/stdout; + #error_log /dev/stdout info; + access_log /usr/local/nginx/logs/access.log; + error_log /usr/local/nginx/logs/error.log info; + + server_tokens off; + + proxy_hide_header X-Powered-By; + + modsecurity on; + + server { + listen 80; + server_name modsectest1; + + modsecurity on; + modsecurity_rules_file /home/runner/work/ModSecurity-nginx/ModSecurity-nginx/ModSecurity-nginx/.github/nginx/modsecurity.conf; + root /usr/local/nginx/html/; + + location / { + try_files $uri /index.html; + } + } + + server { + listen 80; + server_name modsectest2; + + modsecurity on; + modsecurity_rules_file /home/runner/work/ModSecurity-nginx/ModSecurity-nginx/ModSecurity-nginx/.github/nginx/modsecurity.conf; + root /usr/local/nginx/html/; + + location / { + try_files $uri /index.html; + } + } + +} + diff --git a/.github/nginx/nginx.conf.redir b/.github/nginx/nginx.conf.redir new file mode 100644 index 0000000..698951a --- /dev/null +++ b/.github/nginx/nginx.conf.redir @@ -0,0 +1,90 @@ +user www-data; +worker_processes auto; +pid /run/nginx.pid; +worker_cpu_affinity auto; + +#working_directory /tmp/cores/; +worker_rlimit_core 2000M; +debug_points abort; + +#load_module /usr/local/nginx/modules/ngx_http_modsecurity_module.so; + +events { + worker_connections 768; +# multi_accept on; +# use epoll; +} + +worker_rlimit_nofile 33268; + +#daemon off; +#master_process off; + +http { + + ## + # Basic Settings + ## + + types_hash_max_size 2048; + + server_names_hash_bucket_size 64; + + include mime.types; + default_type application/octet-stream; + + ## + # Logging Settings + ## + + #access_log /dev/stdout; + #error_log /dev/stdout info; + access_log /usr/local/nginx/logs/access.log; + error_log /usr/local/nginx/logs/error.log info; + + server_tokens off; + + proxy_hide_header X-Powered-By; + + modsecurity on; + + server { + listen 80; + server_name modsectest1; + + modsecurity on; + modsecurity_rules_file /home/runner/work/ModSecurity-nginx/ModSecurity-nginx/ModSecurity-nginx/.github/nginx/modsecurity.conf; + root /usr/local/nginx/html/; + + error_page 403 /403.html; + + location /403.html { + internal; + } + + location / { + try_files $uri /index.html; + } + } + + server { + listen 80; + server_name modsectest2; + + modsecurity on; + modsecurity_rules_file /home/runner/work/ModSecurity-nginx/ModSecurity-nginx/ModSecurity-nginx/.github/nginx/modsecurity.conf; + root /usr/local/nginx/html/; + + error_page 403 /403.html; + + location /403.html { + internal; + } + + location / { + try_files $uri /index.html; + } + } + +} + diff --git a/.github/nginx/unicode.mapping b/.github/nginx/unicode.mapping new file mode 100644 index 0000000..2654c4a --- /dev/null +++ b/.github/nginx/unicode.mapping @@ -0,0 +1,96 @@ +(MAC - Roman) + + +(MAC - Icelandic) + + +1250 (ANSI - Central Europe) +00a1:21 00a2:63 00a3:4c 00a5:59 00aa:61 00b2:32 00b3:33 00b9:31 00ba:6f 00bc:31 00bd:31 00be:33 00c0:41 00c3:41 00c5:41 00c6:41 00c8:45 00ca:45 00cc:49 00cf:49 00d1:4e 00d2:4f 00d5:4f 00d8:4f 00d9:55 00db:55 00e0:61 00e3:61 00e5:61 00e6:61 00e8:65 00ea:65 00ec:69 00ef:69 00f1:6e 00f2:6f 00f5:6f 00f8:6f 00f9:75 00fb:75 00ff:79 0100:41 0101:61 0108:43 0109:63 010a:43 010b:63 0112:45 0113:65 0114:45 0115:65 0116:45 0117:65 011c:47 011d:67 011e:47 011f:67 0120:47 0121:67 0122:47 0123:67 0124:48 0125:68 0126:48 0127:68 0128:49 0129:69 012a:49 012b:69 012c:49 012d:69 012e:49 012f:69 0130:49 0131:69 0134:4a 0135:6a 0136:4b 0137:6b 013b:4c 013c:6c 0145:4e 0146:6e 014c:4f 014d:6f 014e:4f 014f:6f 0152:4f 0153:6f 0156:52 0157:72 015c:53 015d:73 0166:54 0167:74 0168:55 0169:75 016a:55 016b:75 016c:55 016d:75 0172:55 0173:75 0174:57 0175:77 0176:59 0177:79 0178:59 0180:62 0191:46 0192:66 0197:49 019a:6c 019f:4f 01a0:4f 01a1:6f 01ab:74 01ae:54 01af:55 01b0:75 01b6:7a 01c0:7c 01c3:21 01cd:41 01ce:61 01cf:49 01d0:69 01d1:4f 01d2:6f 01d3:55 01d4:75 01d5:55 01d6:75 01d7:55 01d8:75 01d9:55 01da:75 01db:55 01dc:75 01de:41 01df:61 01e4:47 01e5:67 01e6:47 01e7:67 01e8:4b 01e9:6b 01ea:4f 01eb:6f 01ec:4f 01ed:6f 01f0:6a 0261:67 02b9:27 02ba:22 02bc:27 02c4:5e 02c6:5e 02c8:27 02cb:60 02cd:5f 02dc:7e 0300:60 0302:5e 0303:7e 030e:22 0331:5f 0332:5f 037e:3b 04bb:68 0589:3a 066a:25 2000:20 2001:20 2002:20 2003:20 2004:20 2005:20 2006:20 2010:2d 2011:2d 2032:27 2035:60 203c:21 2044:2f 2074:34 2075:35 2076:36 2077:37 2078:38 2080:30 2081:31 2082:32 2083:33 2084:34 2085:35 2086:36 2087:37 2088:38 2089:39 2102:43 2107:45 210a:67 210b:48 210c:48 210d:48 210e:68 2110:49 2111:49 2112:4c 2113:6c 2115:4e 2118:50 2119:50 211a:51 211b:52 211c:52 211d:52 2124:5a 2128:5a 212a:4b 212c:42 212d:43 212e:65 212f:65 2130:45 2131:46 2133:4d 2134:6f 2191:5e 2194:2d 2195:7c 21a8:7c 2212:2d 2215:2f 2216:5c 2217:2a 221f:4c 2223:7c 2236:3a 223c:7e 2303:5e 2329:3c 232a:3e 2502:2d 250c:2d 2514:4c 2518:2d 251c:2b 2524:2b 252c:54 2534:2b 253c:2b 2550:3d 2554:2d 255a:4c 255d:2d 2566:54 256c:2b 2580:2d 2584:2d 2588:2d 2591:2d 2592:2d 2593:2d 25ac:2d 25b2:5e 25ba:3e 25c4:3c 25cb:30 25d9:30 263c:30 2640:2b 2642:3e 266a:64 266b:64 2758:7c 3000:20 3008:3c 3009:3e 301a:5b 301b:5d ff01:21 ff02:22 ff03:23 ff04:24 ff05:25 ff06:26 ff07:27 ff08:28 ff09:29 ff0a:2a ff0b:2b ff0c:2c ff0d:2d ff0e:2e ff0f:2f ff10:30 ff11:31 ff12:32 ff13:33 ff14:34 ff15:35 ff16:36 ff17:37 ff18:38 ff19:39 ff1a:3a ff1b:3b ff1c:3c ff1d:3d ff1e:3e ff20:40 ff21:41 ff22:42 ff23:43 ff24:44 ff25:45 ff26:46 ff27:47 ff28:48 ff29:49 ff2a:4a ff2b:4b ff2c:4c ff2d:4d ff2e:4e ff2f:4f ff30:50 ff31:51 ff32:52 ff33:53 ff34:54 ff35:55 ff36:56 ff37:57 ff38:58 ff39:59 ff3a:5a ff3b:5b ff3c:5c ff3d:5d ff3e:5e ff3f:5f ff40:60 ff41:61 ff42:62 ff43:63 ff44:64 ff45:65 ff46:66 ff47:67 ff48:68 ff49:69 ff4a:6a ff4b:6b ff4c:6c ff4d:6d ff4e:6e ff4f:6f ff50:70 ff51:71 ff52:72 ff53:73 ff54:74 ff55:75 ff56:76 ff57:77 ff58:78 ff59:79 ff5a:7a ff5b:7b ff5c:7c ff5d:7d ff5e:7e + +1251 (ANSI - Cyrillic) +00c0:41 00c1:41 00c2:41 00c3:41 00c4:41 00c5:41 00c7:43 00c8:45 00c9:45 00ca:45 00cb:45 00cc:49 00cd:49 00ce:49 00cf:49 00d1:4e 00d2:4f 00d3:4f 00d4:4f 00d5:4f 00d6:4f 00d8:4f 00d9:55 00da:55 00db:55 00dc:55 00dd:59 00e0:61 00e1:61 00e2:61 00e3:61 00e4:61 00e5:61 00e7:63 00e8:65 00e9:65 00ea:65 00eb:65 00ec:69 00ed:69 00ee:69 00ef:69 00f1:6e 00f2:6f 00f3:6f 00f4:6f 00f5:6f 00f6:6f 00f8:6f 00f9:75 00fa:75 00fb:75 00fc:75 00fd:79 00ff:79 0100:41 0101:61 0102:41 0103:61 0104:41 0105:61 0106:43 0107:63 0108:43 0109:63 010a:43 010b:63 010c:43 010d:63 010e:44 010f:64 0110:44 0111:64 0112:45 0113:65 0114:45 0115:65 0116:45 0117:65 0118:45 0119:65 011a:45 011b:65 011c:47 011d:67 011e:47 011f:67 0120:47 0121:67 0122:47 0123:67 0124:48 0125:68 0126:48 0127:68 0128:49 0129:69 012a:49 012b:69 012c:49 012d:69 012e:49 012f:69 0130:49 0134:4a 0135:6a 0136:4b 0137:6b 0139:4c 013a:6c 013b:4c 013c:6c 013d:4c 013e:6c 0141:4c 0142:6c 0143:4e 0144:6e 0145:4e 0146:6e 0147:4e 0148:6e 014c:4f 014d:6f 014e:4f 014f:6f 0150:4f 0151:6f 0154:52 0155:72 0156:52 0157:72 0158:52 0159:72 015a:53 015b:73 015c:53 015d:73 015e:53 015f:73 0160:53 0161:73 0162:54 0163:74 0164:54 0165:74 0166:54 0167:74 0168:55 0169:75 016a:55 016b:75 016c:55 016d:75 016e:55 016f:75 0170:55 0171:75 0172:55 0173:75 0174:57 0175:77 0176:59 0177:79 0178:59 0179:5a 017b:5a 017c:7a 017d:5a 017e:7a 0180:62 0197:49 019a:6c 019f:4f 01a0:4f 01a1:6f 01ab:74 01ae:54 01af:55 01b0:75 01cd:41 01ce:61 01cf:49 01d0:69 01d1:4f 01d2:6f 01d3:55 01d4:75 01d5:55 01d6:75 01d7:55 01d8:75 01d9:55 01da:75 01db:55 01dc:75 01de:41 01df:61 01e4:47 01e5:67 01e6:47 01e7:67 01e8:4b 01e9:6b 01ea:4f 01eb:6f 01ec:4f 01ed:6f 01f0:6a 203c:21 2190:3c 2191:5e 2192:3e 2193:76 2194:2d 221a:76 221f:4c 2500:2d 250c:2d 2514:4c 2518:2d 251c:2b 2524:2b 252c:54 2534:2b 253c:2b 2550:3d 2552:2d 2558:4c 2559:4c 255a:4c 255b:2d 255c:2d 255d:2d 2564:54 2565:54 2566:54 256a:2b 256b:2b 256c:2b 2580:2d 2584:2d 2588:2d 2591:2d 2592:2d 2593:2d 25ac:2d 25b2:5e 25ba:3e 25c4:3c 25cb:30 25d9:30 263a:4f 263b:4f 263c:30 2640:2b 2642:3e 266a:64 266b:64 ff01:21 ff02:22 ff03:23 ff04:24 ff05:25 ff06:26 ff07:27 ff08:28 ff09:29 ff0a:2a ff0b:2b ff0c:2c ff0d:2d ff0e:2e ff0f:2f ff10:30 ff11:31 ff12:32 ff13:33 ff14:34 ff15:35 ff16:36 ff17:37 ff18:38 ff19:39 ff1a:3a ff1b:3b ff1c:3c ff1d:3d ff1e:3e ff20:40 ff21:41 ff22:42 ff23:43 ff24:44 ff25:45 ff26:46 ff27:47 ff28:48 ff29:49 ff2a:4a ff2b:4b ff2c:4c ff2d:4d ff2e:4e ff2f:4f ff30:50 ff31:51 ff32:52 ff33:53 ff34:54 ff35:55 ff36:56 ff37:57 ff38:58 ff39:59 ff3a:5a ff3b:5b ff3c:5c ff3d:5d ff3e:5e ff3f:5f ff40:60 ff41:61 ff42:62 ff43:63 ff44:64 ff45:65 ff46:66 ff47:67 ff48:68 ff49:69 ff4a:6a ff4b:6b ff4c:6c ff4d:6d ff4e:6e ff4f:6f ff50:70 ff51:71 ff52:72 ff53:73 ff54:74 ff55:75 ff56:76 ff57:77 ff58:78 ff59:79 ff5a:7a ff5b:7b ff5c:7c ff5d:7d ff5e:7e + +1252 (ANSI - Latin I) +0100:41 0101:61 0102:41 0103:61 0104:41 0105:61 0106:43 0107:63 0108:43 0109:63 010a:43 010b:63 010c:43 010d:63 010e:44 010f:64 0111:64 0112:45 0113:65 0114:45 0115:65 0116:45 0117:65 0118:45 0119:65 011a:45 011b:65 011c:47 011d:67 011e:47 011f:67 0120:47 0121:67 0122:47 0123:67 0124:48 0125:68 0126:48 0127:68 0128:49 0129:69 012a:49 012b:69 012c:49 012d:69 012e:49 012f:69 0130:49 0131:69 0134:4a 0135:6a 0136:4b 0137:6b 0139:4c 013a:6c 013b:4c 013c:6c 013d:4c 013e:6c 0141:4c 0142:6c 0143:4e 0144:6e 0145:4e 0146:6e 0147:4e 0148:6e 014c:4f 014d:6f 014e:4f 014f:6f 0150:4f 0151:6f 0154:52 0155:72 0156:52 0157:72 0158:52 0159:72 015a:53 015b:73 015c:53 015d:73 015e:53 015f:73 0162:54 0163:74 0164:54 0165:74 0166:54 0167:74 0168:55 0169:75 016a:55 016b:75 016c:55 016d:75 016e:55 016f:75 0170:55 0171:75 0172:55 0173:75 0174:57 0175:77 0176:59 0177:79 0179:5a 017b:5a 017c:7a 0180:62 0197:49 019a:6c 019f:4f 01a0:4f 01a1:6f 01ab:74 01ae:54 01af:55 01b0:75 01b6:7a 01c0:7c 01c3:21 01cd:41 01ce:61 01cf:49 01d0:69 01d1:4f 01d2:6f 01d3:55 01d4:75 01d5:55 01d6:75 01d7:55 01d8:75 01d9:55 01da:75 01db:55 01dc:75 01de:41 01df:61 01e4:47 01e5:67 01e6:47 01e7:67 01e8:4b 01e9:6b 01ea:4f 01eb:6f 01ec:4f 01ed:6f 01f0:6a 0261:67 02b9:27 02ba:22 02bc:27 02c4:5e 02c8:27 02cb:60 02cd:5f 0300:60 0302:5e 0303:7e 030e:22 0331:5f 0332:5f 037e:3b 0393:47 0398:54 03a3:53 03a6:46 03a9:4f 03b1:61 03b4:64 03b5:65 03c0:70 03c3:73 03c4:74 03c6:66 04bb:68 0589:3a 066a:25 2000:20 2001:20 2002:20 2003:20 2004:20 2005:20 2006:20 2010:2d 2011:2d 2017:3d 2032:27 2035:60 2044:2f 2074:34 2075:35 2076:36 2077:37 2078:38 207f:6e 2080:30 2081:31 2082:32 2083:33 2084:34 2085:35 2086:36 2087:37 2088:38 2089:39 20a7:50 2102:43 2107:45 210a:67 210b:48 210c:48 210d:48 210e:68 2110:49 2111:49 2112:4c 2113:6c 2115:4e 2118:50 2119:50 211a:51 211b:52 211c:52 211d:52 2124:5a 2128:5a 212a:4b 212c:42 212d:43 212e:65 212f:65 2130:45 2131:46 2133:4d 2134:6f 2212:2d 2215:2f 2216:5c 2217:2a 221a:76 221e:38 2223:7c 2229:6e 2236:3a 223c:7e 2261:3d 2264:3d 2265:3d 2303:5e 2320:28 2321:29 2329:3c 232a:3e 2500:2d 250c:2b 2510:2b 2514:2b 2518:2b 251c:2b 252c:2d 2534:2d 253c:2b 2550:2d 2552:2b 2553:2b 2554:2b 2555:2b 2556:2b 2557:2b 2558:2b 2559:2b 255a:2b 255b:2b 255c:2b 255d:2b 2564:2d 2565:2d 2566:2d 2567:2d 2568:2d 2569:2d 256a:2b 256b:2b 256c:2b 2584:5f 2758:7c 3000:20 3008:3c 3009:3e 301a:5b 301b:5d ff01:21 ff02:22 ff03:23 ff04:24 ff05:25 ff06:26 ff07:27 ff08:28 ff09:29 ff0a:2a ff0b:2b ff0c:2c ff0d:2d ff0e:2e ff0f:2f ff10:30 ff11:31 ff12:32 ff13:33 ff14:34 ff15:35 ff16:36 ff17:37 ff18:38 ff19:39 ff1a:3a ff1b:3b ff1c:3c ff1d:3d ff1e:3e ff20:40 ff21:41 ff22:42 ff23:43 ff24:44 ff25:45 ff26:46 ff27:47 ff28:48 ff29:49 ff2a:4a ff2b:4b ff2c:4c ff2d:4d ff2e:4e ff2f:4f ff30:50 ff31:51 ff32:52 ff33:53 ff34:54 ff35:55 ff36:56 ff37:57 ff38:58 ff39:59 ff3a:5a ff3b:5b ff3c:5c ff3d:5d ff3e:5e ff3f:5f ff40:60 ff41:61 ff42:62 ff43:63 ff44:64 ff45:65 ff46:66 ff47:67 ff48:68 ff49:69 ff4a:6a ff4b:6b ff4c:6c ff4d:6d ff4e:6e ff4f:6f ff50:70 ff51:71 ff52:72 ff53:73 ff54:74 ff55:75 ff56:76 ff57:77 ff58:78 ff59:79 ff5a:7a ff5b:7b ff5c:7c ff5d:7d ff5e:7e + +1253 (ANSI - Greek) +00b4:2f 00c0:41 00c1:41 00c2:41 00c3:41 00c4:41 00c5:41 00c7:43 00c8:45 00c9:45 00ca:45 00cb:45 00cc:49 00cd:49 00ce:49 00cf:49 00d1:4e 00d2:4f 00d3:4f 00d4:4f 00d5:4f 00d6:4f 00d8:4f 00d9:55 00da:55 00db:55 00dc:55 00dd:59 00e0:61 00e1:61 00e2:61 00e3:61 00e4:61 00e5:61 00e7:63 00e8:65 00e9:65 00ea:65 00eb:65 00ec:69 00ed:69 00ee:69 00ef:69 00f1:6e 00f2:6f 00f3:6f 00f4:6f 00f5:6f 00f6:6f 00f8:6f 00f9:75 00fa:75 00fb:75 00fc:75 00fd:79 00ff:79 0100:41 0101:61 0102:41 0103:61 0104:41 0105:61 0106:43 0107:63 0108:43 0109:63 010a:43 010b:63 010c:43 010d:63 010e:44 010f:64 0110:44 0111:64 0112:45 0113:65 0114:45 0115:65 0116:45 0117:65 0118:45 0119:65 011a:45 011b:65 011c:47 011d:67 011e:47 011f:67 0120:47 0121:67 0122:47 0123:67 0124:48 0125:68 0126:48 0127:68 0128:49 0129:69 012a:49 012b:69 012c:49 012d:69 012e:49 012f:69 0130:49 0134:4a 0135:6a 0136:4b 0137:6b 0139:4c 013a:6c 013b:4c 013c:6c 013d:4c 013e:6c 0141:4c 0142:6c 0143:4e 0144:6e 0145:4e 0146:6e 0147:4e 0148:6e 014c:4f 014d:6f 014e:4f 014f:6f 0150:4f 0151:6f 0154:52 0155:72 0156:52 0157:72 0158:52 0159:72 015a:53 015b:73 015c:53 015d:73 015e:53 015f:73 0160:53 0161:73 0162:54 0163:74 0164:54 0165:74 0166:54 0167:74 0168:55 0169:75 016a:55 016b:75 016c:55 016d:75 016e:55 016f:75 0170:55 0171:75 0172:55 0173:75 0174:57 0175:77 0176:59 0177:79 0178:59 0179:5a 017b:5a 017c:7a 017d:5a 017e:7a 0180:62 0197:49 019a:6c 019f:4f 01a0:4f 01a1:6f 01ab:74 01ae:54 01af:55 01b0:75 01cd:41 01ce:61 01cf:49 01d0:69 01d1:4f 01d2:6f 01d3:55 01d4:75 01d5:55 01d6:75 01d7:55 01d8:75 01d9:55 01da:75 01db:55 01dc:75 01de:41 01df:61 01e4:47 01e5:67 01e6:47 01e7:67 01e8:4b 01e9:6b 01ea:4f 01eb:6f 01ec:4f 01ed:6f 01f0:6a 037e:3b 203c:21 2190:3c 2191:5e 2192:3e 2193:76 2194:2d 221f:4c 2500:2d 250c:2d 2514:4c 2518:2d 251c:2b 2524:2b 252c:54 2534:2b 253c:2b 2550:3d 2554:2d 255a:4c 255d:2d 2566:54 256c:2b 2580:2d 2584:2d 2588:2d 2591:2d 2592:2d 2593:2d 25ac:2d 25b2:5e 25ba:3e 25c4:3c 25cb:30 25d9:30 263a:4f 263b:4f 263c:30 2640:2b 2642:3e 266a:64 266b:64 ff01:21 ff02:22 ff03:23 ff04:24 ff05:25 ff06:26 ff07:27 ff08:28 ff09:29 ff0a:2a ff0b:2b ff0c:2c ff0d:2d ff0e:2e ff0f:2f ff10:30 ff11:31 ff12:32 ff13:33 ff14:34 ff15:35 ff16:36 ff17:37 ff18:38 ff19:39 ff1a:3a ff1b:3b ff1c:3c ff1d:3d ff1e:3e ff20:40 ff21:41 ff22:42 ff23:43 ff24:44 ff25:45 ff26:46 ff27:47 ff28:48 ff29:49 ff2a:4a ff2b:4b ff2c:4c ff2d:4d ff2e:4e ff2f:4f ff30:50 ff31:51 ff32:52 ff33:53 ff34:54 ff35:55 ff36:56 ff37:57 ff38:58 ff39:59 ff3a:5a ff3b:5b ff3c:5c ff3d:5d ff3e:5e ff3f:5f ff40:60 ff41:61 ff42:62 ff43:63 ff44:64 ff45:65 ff46:66 ff47:67 ff48:68 ff49:69 ff4a:6a ff4b:6b ff4c:6c ff4d:6d ff4e:6e ff4f:6f ff50:70 ff51:71 ff52:72 ff53:73 ff54:74 ff55:75 ff56:76 ff57:77 ff58:78 ff59:79 ff5a:7a ff5b:7b ff5c:7c ff5d:7d ff5e:7e + +1254 (ANSI - Turkish) +00dd:59 00fd:79 0100:41 0101:61 0102:41 0103:61 0104:41 0105:61 0106:43 0107:63 0108:43 0109:63 010a:43 010b:63 010c:43 010d:63 010e:44 010f:64 0110:44 0111:64 0112:45 0113:65 0114:45 0115:65 0116:45 0117:65 0118:45 0119:65 011a:45 011b:65 011c:47 011d:67 0120:47 0121:67 0122:47 0123:67 0124:48 0125:68 0126:48 0127:68 0128:49 0129:69 012a:49 012b:69 012c:49 012d:69 012e:49 012f:69 0134:4a 0135:6a 0136:4b 0137:6b 0139:4c 013a:6c 013b:4c 013c:6c 013d:4c 013e:6c 0141:4c 0142:6c 0143:4e 0144:6e 0145:4e 0146:6e 0147:4e 0148:6e 014c:4f 014d:6f 014e:4f 014f:6f 0150:4f 0151:6f 0154:52 0155:72 0156:52 0157:72 0158:52 0159:72 015a:53 015b:73 015c:53 015d:73 0162:54 0163:74 0164:54 0165:74 0166:54 0167:74 0168:55 0169:75 016a:55 016b:75 016c:55 016d:75 016e:55 016f:75 0170:55 0171:75 0172:55 0173:75 0174:57 0175:77 0176:59 0177:79 0179:5a 017b:5a 017c:7a 017d:5a 017e:7a 0180:62 0189:44 0197:49 019a:6c 019f:4f 01a0:4f 01a1:6f 01ab:74 01ae:54 01af:55 01b0:75 01b6:7a 01c0:7c 01c3:21 01cd:41 01ce:61 01cf:49 01d0:69 01d1:4f 01d2:6f 01d3:55 01d4:75 01d5:55 01d6:75 01d7:55 01d8:75 01d9:55 01da:75 01db:55 01dc:75 01de:41 01df:61 01e4:47 01e5:67 01e6:47 01e7:67 01e8:4b 01e9:6b 01ea:4f 01eb:6f 01ec:4f 01ed:6f 01f0:6a 0261:67 02b9:27 02ba:22 02bc:27 02c4:5e 02c7:5e 02c8:27 02cb:60 02cd:5f 02d8:5e 02d9:27 0300:60 0302:5e 0331:5f 0332:5f 04bb:68 0589:3a 066a:25 2000:20 2001:20 2002:20 2003:20 2004:20 2005:20 2006:20 2010:2d 2011:2d 2032:27 2035:60 203c:21 2044:2f 2074:34 2075:35 2076:36 2077:37 2078:38 2081:30 2084:34 2085:35 2086:36 2087:37 2088:38 2089:39 2102:43 2107:45 210a:67 210b:48 210c:48 210d:48 210e:68 2110:49 2111:49 2112:4c 2113:6c 2115:4e 2118:50 2119:50 211a:51 211b:52 211c:52 211d:52 2124:5a 2128:5a 212a:4b 212c:42 212d:43 212e:65 212f:65 2130:45 2131:46 2133:4d 2134:6f 2191:5e 2193:76 2194:2d 2195:7c 21a8:7c 2212:2d 2215:2f 2216:5c 2217:2a 221f:4c 2223:7c 2236:3a 223c:7e 2303:5e 2329:3c 232a:3e 2502:2d 250c:2d 2514:4c 2518:2d 251c:2b 2524:2b 252c:54 2534:2b 253c:2b 2550:3d 2554:2d 255a:4c 255d:2d 2566:54 256c:2b 2580:2d 2584:2d 2588:2d 2591:2d 2592:2d 2593:2d 25ac:2d 25b2:5e 25ba:3e 25c4:3c 25cb:30 25d9:30 263a:4f 263b:4f 263c:30 2640:2b 2642:3e 266a:64 266b:64 2758:7c 3000:20 3008:3c 3009:3e 301a:5b 301b:3d 301d:22 301e:22 ff01:21 ff02:22 ff03:23 ff04:24 ff05:25 ff06:26 ff07:27 ff08:28 ff09:29 ff0a:2a ff0b:2b ff0c:2c ff0d:2d ff0e:2e ff0f:2f ff10:30 ff11:31 ff12:32 ff13:33 ff14:34 ff15:35 ff16:36 ff17:37 ff18:38 ff19:39 ff1a:3a ff1b:3b ff1c:3c ff1d:3d ff1e:3e ff20:40 ff21:41 ff22:42 ff23:43 ff24:44 ff25:45 ff26:46 ff27:47 ff28:48 ff29:49 ff2a:4a ff2b:4b ff2c:4c ff2d:4d ff2e:4e ff2f:4f ff30:50 ff31:51 ff32:52 ff33:53 ff34:54 ff35:55 ff36:56 ff37:57 ff38:58 ff39:59 ff3a:5a ff3b:5b ff3c:5c ff3d:5d ff3e:5e ff3f:5f ff40:60 ff41:61 ff42:62 ff43:63 ff44:64 ff45:65 ff46:66 ff47:67 ff48:68 ff49:69 ff4a:6a ff4b:6b ff4c:6c ff4d:6d ff4e:6e ff4f:6f ff50:70 ff51:71 ff52:72 ff53:73 ff54:74 ff55:75 ff56:76 ff57:77 ff58:78 ff59:79 ff5a:7a ff5b:7b ff5c:7c ff5d:7d ff5e:7e + +1255 (ANSI - Hebrew) +0191:46 ff01:21 ff02:22 ff03:23 ff04:24 ff05:25 ff06:26 ff07:27 ff08:28 ff09:29 ff0a:2a ff0b:2b ff0c:2c ff0d:2d ff0e:2e ff0f:2f ff10:30 ff11:31 ff12:32 ff13:33 ff14:34 ff15:35 ff16:36 ff17:37 ff18:38 ff19:39 ff1a:3a ff1b:3b ff1c:3c ff1d:3d ff1e:3e ff20:40 ff21:41 ff22:42 ff23:43 ff24:44 ff25:45 ff26:46 ff27:47 ff28:48 ff29:49 ff2a:4a ff2b:4b ff2c:4c ff2d:4d ff2e:4e ff2f:4f ff30:50 ff31:51 ff32:52 ff33:53 ff34:54 ff35:55 ff36:56 ff37:57 ff38:58 ff39:59 ff3a:5a ff3b:5b ff3c:5c ff3d:5d ff3e:5e ff3f:5f ff40:60 ff41:61 ff42:62 ff43:63 ff44:64 ff45:65 ff46:66 ff47:67 ff48:68 ff49:69 ff4a:6a ff4b:6b ff4c:6c ff4d:6d ff4e:6e ff4f:6f ff50:70 ff51:71 ff52:72 ff53:73 ff54:74 ff55:75 ff56:76 ff57:77 ff58:78 ff59:79 ff5a:7a ff5b:7b ff5c:7c ff5d:7d ff5e:7e + +1256 (ANSI - Arabic) +0620:41 0621:41 0622:43 0623:45 0624:45 0625:45 0626:45 0627:49 0628:49 0629:4f 062a:55 062b:55 062c:55 062d:46 062e:43 062f:44 0630:45 0631:46 0632:47 0633:48 0634:49 0635:4a 0636:4b 0637:4c 0638:4d 0639:4e 063a:4f 0641:41 0642:42 0643:43 0644:44 0645:45 0646:46 0647:47 0648:48 0649:49 064a:4a 064b:4b 064c:4c 064d:4d 064e:4e 064f:4f 0650:50 0651:51 0652:52 + +1257 (ANSI - Baltic) +ff01:21 ff02:22 ff03:23 ff04:24 ff05:25 ff06:26 ff07:27 ff08:28 ff09:29 ff0a:2a ff0b:2b ff0c:2c ff0d:2d ff0e:2e ff0f:2f ff10:30 ff11:31 ff12:32 ff13:33 ff14:34 ff15:35 ff16:36 ff17:37 ff18:38 ff19:39 ff1a:3a ff1b:3b ff1c:3c ff1d:3d ff1e:3e ff20:40 ff21:41 ff22:42 ff23:43 ff24:44 ff25:45 ff26:46 ff27:47 ff28:48 ff29:49 ff2a:4a ff2b:4b ff2c:4c ff2d:4d ff2e:4e ff2f:4f ff30:50 ff31:51 ff32:52 ff33:53 ff34:54 ff35:55 ff36:56 ff37:57 ff38:58 ff39:59 ff3a:5a ff3b:5b ff3c:5c ff3d:5d ff3e:5e ff3f:5f ff40:60 ff41:61 ff42:62 ff43:63 ff44:64 ff45:65 ff46:66 ff47:67 ff48:68 ff49:69 ff4a:6a ff4b:6b ff4c:6c ff4d:6d ff4e:6e ff4f:6f ff50:70 ff51:71 ff52:72 ff53:73 ff54:74 ff55:75 ff56:76 ff57:77 ff58:78 ff59:79 ff5a:7a ff5b:7b ff5c:7c ff5d:7d ff5e:7e + +1258 (ANSI/OEM - Viet Nam) +ff01:21 ff02:22 ff03:23 ff04:24 ff05:25 ff06:26 ff07:27 ff08:28 ff09:29 ff0a:2a ff0b:2b ff0c:2c ff0d:2d ff0e:2e ff0f:2f ff10:30 ff11:31 ff12:32 ff13:33 ff14:34 ff15:35 ff16:36 ff17:37 ff18:38 ff19:39 ff1a:3a ff1b:3b ff1c:3c ff1d:3d ff1e:3e ff20:40 ff21:41 ff22:42 ff23:43 ff24:44 ff25:45 ff26:46 ff27:47 ff28:48 ff29:49 ff2a:4a ff2b:4b ff2c:4c ff2d:4d ff2e:4e ff2f:4f ff30:50 ff31:51 ff32:52 ff33:53 ff34:54 ff35:55 ff36:56 ff37:57 ff38:58 ff39:59 ff3a:5a ff3b:5b ff3c:5c ff3d:5d ff3e:5e ff3f:5f ff40:60 ff41:61 ff42:62 ff43:63 ff44:64 ff45:65 ff46:66 ff47:67 ff48:68 ff49:69 ff4a:6a ff4b:6b ff4c:6c ff4d:6d ff4e:6e ff4f:6f ff50:70 ff51:71 ff52:72 ff53:73 ff54:74 ff55:75 ff56:76 ff57:77 ff58:78 ff59:79 ff5a:7a ff5b:7b ff5c:7c ff5d:7d ff5e:7e + +20127 (US-ASCII) +00a0:20 00a1:21 00a2:63 00a4:24 00a5:59 00a6:7c 00a9:43 00aa:61 00ab:3c 00ad:2d 00ae:52 00b2:32 00b3:33 00b7:2e 00b8:2c 00b9:31 00ba:6f 00bb:3e 00c0:41 00c1:41 00c2:41 00c3:41 00c4:41 00c5:41 00c6:41 00c7:43 00c8:45 00c9:45 00ca:45 00cb:45 00cc:49 00cd:49 00ce:49 00cf:49 00d0:44 00d1:4e 00d2:4f 00d3:4f 00d4:4f 00d5:4f 00d6:4f 00d8:4f 00d9:55 00da:55 00db:55 00dc:55 00dd:59 00e0:61 00e1:61 00e2:61 00e3:61 00e4:61 00e5:61 00e6:61 00e7:63 00e8:65 00e9:65 00ea:65 00eb:65 00ec:69 00ed:69 00ee:69 00ef:69 00f1:6e 00f2:6f 00f3:6f 00f4:6f 00f5:6f 00f6:6f 00f8:6f 00f9:75 00fa:75 00fb:75 00fc:75 00fd:79 00ff:79 0100:41 0101:61 0102:41 0103:61 0104:41 0105:61 0106:43 0107:63 0108:43 0109:63 010a:43 010b:63 010c:43 010d:63 010e:44 010f:64 0110:44 0111:64 0112:45 0113:65 0114:45 0115:65 0116:45 0117:65 0118:45 0119:65 011a:45 011b:65 011c:47 011d:67 011e:47 011f:67 0120:47 0121:67 0122:47 0123:67 0124:48 0125:68 0126:48 0127:68 0128:49 0129:69 012a:49 012b:69 012c:49 012d:69 012e:49 012f:69 0130:49 0131:69 0134:4a 0135:6a 0136:4b 0137:6b 0139:4c 013a:6c 013b:4c 013c:6c 013d:4c 013e:6c 0141:4c 0142:6c 0143:4e 0144:6e 0145:4e 0146:6e 0147:4e 0148:6e 014c:4f 014d:6f 014e:4f 014f:6f 0150:4f 0151:6f 0152:4f 0153:6f 0154:52 0155:72 0156:52 0157:72 0158:52 0159:72 015a:53 015b:73 015c:53 015d:73 015e:53 015f:73 0160:53 0161:73 0162:54 0163:74 0164:54 0165:74 0166:54 0167:74 0168:55 0169:75 016a:55 016b:75 016c:55 016d:75 016e:55 016f:75 0170:55 0171:75 0172:55 0173:75 0174:57 0175:77 0176:59 0177:79 0178:59 0179:5a 017b:5a 017c:7a 017d:5a 017e:7a 0180:62 0189:44 0191:46 0192:66 0197:49 019a:6c 019f:4f 01a0:4f 01a1:6f 01ab:74 01ae:54 01af:55 01b0:75 01b6:7a 01cd:41 01ce:61 01cf:49 01d0:69 01d1:4f 01d2:6f 01d3:55 01d4:75 01d5:55 01d6:75 01d7:55 01d8:75 01d9:55 01da:75 01db:55 01dc:75 01de:41 01df:61 01e4:47 01e5:67 01e6:47 01e7:67 01e8:4b 01e9:6b 01ea:4f 01eb:6f 01ec:4f 01ed:6f 01f0:6a 0261:67 02b9:27 02ba:22 02bc:27 02c4:5e 02c6:5e 02c8:27 02cb:60 02cd:5f 02dc:7e 0300:60 0302:5e 0303:7e 030e:22 0331:5f 0332:5f 2000:20 2001:20 2002:20 2003:20 2004:20 2005:20 2006:20 2010:2d 2011:2d 2013:2d 2014:2d 2018:27 2019:27 201a:2c 201c:22 201d:22 201e:22 2022:2e 2026:2e 2032:27 2035:60 2039:3c 203a:3e 2122:54 ff01:21 ff02:22 ff03:23 ff04:24 ff05:25 ff06:26 ff07:27 ff08:28 ff09:29 ff0a:2a ff0b:2b ff0c:2c ff0d:2d ff0e:2e ff0f:2f ff10:30 ff11:31 ff12:32 ff13:33 ff14:34 ff15:35 ff16:36 ff17:37 ff18:38 ff19:39 ff1a:3a ff1b:3b ff1c:3c ff1d:3d ff1e:3e ff20:40 ff21:41 ff22:42 ff23:43 ff24:44 ff25:45 ff26:46 ff27:47 ff28:48 ff29:49 ff2a:4a ff2b:4b ff2c:4c ff2d:4d ff2e:4e ff2f:4f ff30:50 ff31:51 ff32:52 ff33:53 ff34:54 ff35:55 ff36:56 ff37:57 ff38:58 ff39:59 ff3a:5a ff3b:5b ff3c:5c ff3d:5d ff3e:5e ff3f:5f ff40:60 ff41:61 ff42:62 ff43:63 ff44:64 ff45:65 ff46:66 ff47:67 ff48:68 ff49:69 ff4a:6a ff4b:6b ff4c:6c ff4d:6d ff4e:6e ff4f:6f ff50:70 ff51:71 ff52:72 ff53:73 ff54:74 ff55:75 ff56:76 ff57:77 ff58:78 ff59:79 ff5a:7a ff5b:7b ff5c:7c ff5d:7d ff5e:7e + +20261 (T.61) +f8dd:5c f8de:5e f8df:60 f8e0:7b f8fc:7d f8fd:7e f8fe:7f + +20866 (Russian - KOI8) +00a7:15 00ab:3c 00ad:2d 00ae:52 00b1:2b 00b6:14 00bb:3e 00c0:41 00c1:41 00c2:41 00c3:41 00c4:41 00c5:41 00c7:43 00c8:45 00c9:45 00ca:45 00cb:45 00cc:49 00cd:49 00ce:49 00cf:49 00d1:4e 00d2:4f 00d3:4f 00d4:4f 00d5:4f 00d6:4f 00d8:4f 00d9:55 00da:55 00db:55 00dc:55 00dd:59 00e0:61 00e1:61 00e2:61 00e3:61 00e4:61 00e5:61 00e7:63 00e8:65 00e9:65 00ea:65 00eb:65 00ec:69 00ed:69 00ee:69 00ef:69 00f1:6e 00f2:6f 00f3:6f 00f4:6f 00f5:6f 00f6:6f 00f8:6f 00f9:75 00fa:75 00fb:75 00fc:75 00fd:79 00ff:79 0100:41 0101:61 0102:41 0103:61 0104:41 0105:61 0106:43 0107:63 0108:43 0109:63 010a:43 010b:63 010c:43 010d:63 010e:44 010f:64 0110:44 0111:64 0112:45 0113:65 0114:45 0115:65 0116:45 0117:65 0118:45 0119:65 011a:45 011b:65 011c:47 011d:67 011e:47 011f:67 0120:47 0121:67 0122:47 0123:67 0124:48 0125:68 0126:48 0127:68 0128:49 0129:69 012a:49 012b:69 012c:49 012d:69 012e:49 012f:69 0130:49 0134:4a 0135:6a 0136:4b 0137:6b 0139:4c 013a:6c 013b:4c 013c:6c 013d:4c 013e:6c 0141:4c 0142:6c 0143:4e 0144:6e 0145:4e 0146:6e 0147:4e 0148:6e 014c:4f 014d:6f 014e:4f 014f:6f 0150:4f 0151:6f 0154:52 0155:72 0156:52 0157:72 0158:52 0159:72 015a:53 015b:73 015c:53 015d:73 015e:53 015f:73 0160:53 0161:73 0162:54 0163:74 0164:54 0165:74 0166:54 0167:74 0168:55 0169:75 016a:55 016b:75 016c:55 016d:75 016e:55 016f:75 0170:55 0171:75 0172:55 0173:75 0174:57 0175:77 0176:59 0177:79 0178:59 0179:5a 017b:5a 017c:7a 017d:5a 017e:7a 0180:62 0197:49 019a:6c 019f:4f 01a0:4f 01a1:6f 01ab:74 01ae:54 01af:55 01b0:75 01cd:41 01ce:61 01cf:49 01d0:69 01d1:4f 01d2:6f 01d3:55 01d4:75 01d5:55 01d6:75 01d7:55 01d8:75 01d9:55 01da:75 01db:55 01dc:75 01de:41 01df:61 01e4:47 01e5:67 01e6:47 01e7:67 01e8:4b 01e9:6b 01ea:4f 01eb:6f 01ec:4f 01ed:6f 01f0:6a 2013:2d 2014:2d 2018:27 2019:27 201a:27 201c:22 201d:22 201e:22 2022:07 2026:3a 2030:25 2039:3c 203a:3e 203c:13 2122:54 2190:1b 2191:18 2192:1a 2193:19 2194:1d 2195:12 21a8:17 221f:1c 2302:7f 25ac:16 25b2:1e 25ba:10 25bc:1f 25c4:11 25cb:09 25d8:08 25d9:0a 263a:01 263b:02 263c:0f 2640:0c 2642:0b 2660:06 2663:05 2665:03 2666:04 266a:0d 266b:0e + +28591 (ISO 8859-1 Latin I) +0100:41 0101:61 0102:41 0103:61 0104:41 0105:61 0106:43 0107:63 0108:43 0109:63 010a:43 010b:63 010c:43 010d:63 010e:44 010f:64 0110:44 0111:64 0112:45 0113:65 0114:45 0115:65 0116:45 0117:65 0118:45 0119:65 011a:45 011b:65 011c:47 011d:67 011e:47 011f:67 0120:47 0121:67 0122:47 0123:67 0124:48 0125:68 0126:48 0127:68 0128:49 0129:69 012a:49 012b:69 012c:49 012d:69 012e:49 012f:69 0130:49 0131:69 0134:4a 0135:6a 0136:4b 0137:6b 0139:4c 013a:6c 013b:4c 013c:6c 013d:4c 013e:6c 0141:4c 0142:6c 0143:4e 0144:6e 0145:4e 0146:6e 0147:4e 0148:6e 014c:4f 014d:6f 014e:4f 014f:6f 0150:4f 0151:6f 0152:4f 0153:6f 0154:52 0155:72 0156:52 0157:72 0158:52 0159:72 015a:53 015b:73 015c:53 015d:73 015e:53 015f:73 0160:53 0161:73 0162:54 0163:74 0164:54 0165:74 0166:54 0167:74 0168:55 0169:75 016a:55 016b:75 016c:55 016d:75 016e:55 016f:75 0170:55 0171:75 0172:55 0173:75 0174:57 0175:77 0176:59 0177:79 0178:59 0179:5a 017b:5a 017c:7a 017d:5a 017e:7a 0180:62 0189:44 0191:46 0192:66 0197:49 019a:6c 019f:4f 01a0:4f 01a1:6f 01ab:74 01ae:54 01af:55 01b0:75 01b6:7a 01cd:41 01ce:61 01cf:49 01d0:69 01d1:4f 01d2:6f 01d3:55 01d4:75 01d5:55 01d6:75 01d7:55 01d8:75 01d9:55 01da:75 01db:55 01dc:75 01de:41 01df:61 01e4:47 01e5:67 01e6:47 01e7:67 01e8:4b 01e9:6b 01ea:4f 01eb:6f 01ec:4f 01ed:6f 01f0:6a 0261:67 02b9:27 02ba:22 02bc:27 02c4:5e 02c6:5e 02c8:27 02cb:60 02cd:5f 02dc:7e 0300:60 0302:5e 0303:7e 030e:22 0331:5f 0332:5f 2000:20 2001:20 2002:20 2003:20 2004:20 2005:20 2006:20 2010:2d 2011:2d 2013:2d 2014:2d 2018:27 2019:27 201a:2c 201c:22 201d:22 201e:22 2022:2e 2026:2e 2032:27 2035:60 2039:3c 203a:3e 2122:54 ff01:21 ff02:22 ff03:23 ff04:24 ff05:25 ff06:26 ff07:27 ff08:28 ff09:29 ff0a:2a ff0b:2b ff0c:2c ff0d:2d ff0e:2e ff0f:2f ff10:30 ff11:31 ff12:32 ff13:33 ff14:34 ff15:35 ff16:36 ff17:37 ff18:38 ff19:39 ff1a:3a ff1b:3b ff1c:3c ff1d:3d ff1e:3e ff20:40 ff21:41 ff22:42 ff23:43 ff24:44 ff25:45 ff26:46 ff27:47 ff28:48 ff29:49 ff2a:4a ff2b:4b ff2c:4c ff2d:4d ff2e:4e ff2f:4f ff30:50 ff31:51 ff32:52 ff33:53 ff34:54 ff35:55 ff36:56 ff37:57 ff38:58 ff39:59 ff3a:5a ff3b:5b ff3c:5c ff3d:5d ff3e:5e ff3f:5f ff40:60 ff41:61 ff42:62 ff43:63 ff44:64 ff45:65 ff46:66 ff47:67 ff48:68 ff49:69 ff4a:6a ff4b:6b ff4c:6c ff4d:6d ff4e:6e ff4f:6f ff50:70 ff51:71 ff52:72 ff53:73 ff54:74 ff55:75 ff56:76 ff57:77 ff58:78 ff59:79 ff5a:7a ff5b:7b ff5c:7c ff5d:7d ff5e:7e + +28592 (ISO 8859-2 Central Europe) +00a1:21 00a2:63 00a5:59 00a6:7c 00a9:43 00aa:61 00ab:3c 00ae:52 00b2:32 00b3:33 00b7:2e 00b9:31 00ba:6f 00bb:3e 00c0:41 00c3:41 00c5:41 00c6:41 00c8:45 00ca:45 00cc:49 00cf:49 00d0:44 00d1:4e 00d2:4f 00d5:4f 00d8:4f 00d9:55 00db:55 00e0:61 00e3:61 00e5:61 00e6:61 00e8:65 00ea:65 00ec:69 00ef:69 00f1:6e 00f2:6f 00f5:6f 00f8:6f 00f9:75 00fb:75 00ff:79 0100:41 0101:61 0108:43 0109:63 010a:43 010b:63 0112:45 0113:65 0114:45 0115:65 0116:45 0117:65 011c:47 011d:67 011e:47 011f:67 0120:47 0121:67 0122:47 0123:67 0124:48 0125:68 0126:48 0127:68 0128:49 0129:69 012a:49 012b:69 012c:49 012d:69 012e:49 012f:69 0130:49 0131:69 0134:4a 0135:6a 0136:4b 0137:6b 013b:4c 013c:6c 0145:4e 0146:6e 014c:4f 014d:6f 014e:4f 014f:6f 0152:4f 0153:6f 0156:52 0157:72 015c:53 015d:73 0166:54 0167:74 0168:55 0169:75 016a:55 016b:75 016c:55 016d:75 0172:55 0173:75 0174:57 0175:77 0176:59 0177:79 0178:59 0180:62 0189:44 0191:46 0192:66 0197:49 019a:6c 019f:4f 01a0:4f 01a1:6f 01ab:74 01ae:54 01af:55 01b0:75 01b6:7a 01cd:41 01ce:61 01cf:49 01d0:69 01d1:4f 01d2:6f 01d3:55 01d4:75 01d5:55 01d6:75 01d7:55 01d8:75 01d9:55 01da:75 01db:55 01dc:75 01de:41 01df:61 01e4:47 01e5:67 01e6:47 01e7:67 01e8:4b 01e9:6b 01ea:4f 01eb:6f 01ec:4f 01ed:6f 01f0:6a 0261:67 02b9:27 02ba:22 02bc:27 02c4:5e 02c6:5e 02c8:27 02cb:60 02cd:5f 02dc:7e 0300:60 0302:5e 0303:7e 030e:22 0331:5f 0332:5f 2000:20 2001:20 2002:20 2003:20 2004:20 2005:20 2006:20 2010:2d 2011:2d 2013:2d 2014:2d 2018:27 2019:27 201a:2c 201c:22 201d:22 201e:22 2022:2e 2026:2e 2032:27 2035:60 2039:3c 203a:3e 2122:54 ff01:21 ff02:22 ff03:23 ff04:24 ff05:25 ff06:26 ff07:27 ff08:28 ff09:29 ff0a:2a ff0b:2b ff0c:2c ff0d:2d ff0e:2e ff0f:2f ff10:30 ff11:31 ff12:32 ff13:33 ff14:34 ff15:35 ff16:36 ff17:37 ff18:38 ff19:39 ff1a:3a ff1b:3b ff1c:3c ff1d:3d ff1e:3e ff20:40 ff21:41 ff22:42 ff23:43 ff24:44 ff25:45 ff26:46 ff27:47 ff28:48 ff29:49 ff2a:4a ff2b:4b ff2c:4c ff2d:4d ff2e:4e ff2f:4f ff30:50 ff31:51 ff32:52 ff33:53 ff34:54 ff35:55 ff36:56 ff37:57 ff38:58 ff39:59 ff3a:5a ff3b:5b ff3c:5c ff3d:5d ff3e:5e ff3f:5f ff40:60 ff41:61 ff42:62 ff43:63 ff44:64 ff45:65 ff46:66 ff47:67 ff48:68 ff49:69 ff4a:6a ff4b:6b ff4c:6c ff4d:6d ff4e:6e ff4f:6f ff50:70 ff51:71 ff52:72 ff53:73 ff54:74 ff55:75 ff56:76 ff57:77 ff58:78 ff59:79 ff5a:7a ff5b:7b ff5c:7c ff5d:7d ff5e:7e + +28605 (ISO 8859-15 Latin 9) +00a6:7c 0100:41 0101:61 0102:41 0103:61 0104:41 0105:61 0106:43 0107:63 0108:43 0109:63 010a:43 010b:63 010c:43 010d:63 010e:44 010f:64 0112:45 0113:65 0114:45 0115:65 0116:45 0117:65 0118:45 0119:65 011a:45 011b:65 011c:47 011d:67 011e:47 011f:67 0120:47 0121:67 0122:47 0123:67 0124:48 0125:68 0126:48 0127:68 0128:49 0129:69 012a:49 012b:69 012c:49 012d:69 012e:49 012f:69 0130:49 0131:69 0134:4a 0135:6a 0136:4b 0137:6b 0138:6b 0139:4c 013a:6c 013b:4c 013c:6c 013d:4c 013e:6c 0141:4c 0142:6c 0143:4e 0144:6e 0145:4e 0146:6e 0147:4e 0148:6e 014a:4e 014b:6e 014c:4f 014d:6f 014e:4f 014f:6f 0150:4f 0151:6f 0154:52 0155:72 0156:52 0157:72 0158:52 0159:72 015a:53 015b:73 015c:53 015d:73 015e:53 015f:73 0162:54 0163:74 0164:54 0165:74 0166:54 0167:74 0168:54 0169:74 016a:55 016b:75 016c:55 016d:75 016e:55 016f:75 0170:55 0171:75 0172:55 0173:75 0174:57 0175:77 0176:59 0177:79 0179:5a 017b:5a 017c:7a 0180:62 0189:44 0191:46 0192:66 0197:49 019a:6c 019f:4f 01a0:4f 01a1:6f 01ab:74 01ae:54 01af:55 01b0:75 01b6:7a 01cd:41 01ce:61 01cf:49 01d0:69 01d1:4f 01d2:6f 01d3:55 01d4:75 01d5:55 01d6:75 01d7:55 01d8:75 01d9:55 01da:75 01db:55 01dc:75 01de:41 01df:61 01e4:47 01e5:67 01e6:47 01e7:67 01e8:4b 01e9:6b 01ea:4f 01eb:6f 01ec:4f 01ed:6f 01f0:6a 0261:67 02b9:27 02ba:22 02bc:27 02c4:5e 02c6:5e 02c8:27 02cb:60 02cd:5f 02dc:7e 0300:60 0302:5e 0303:7e 030e:22 0331:5f 0332:5f 2000:20 2001:20 2002:20 2003:20 2004:20 2005:20 2006:20 2010:2d 2011:2d 2013:2d 2014:2d 2018:27 2019:27 201a:2c 201c:22 201d:22 201e:22 2022:2e 2026:2e 2032:27 2035:60 2039:3c 203a:3e 2122:54 ff01:21 ff02:22 ff03:23 ff04:24 ff05:25 ff06:26 ff07:27 ff08:28 ff09:29 ff0a:2a ff0b:2b ff0c:2c ff0d:2d ff0e:2e ff0f:2f ff10:30 ff11:31 ff12:32 ff13:33 ff14:34 ff15:35 ff16:36 ff17:37 ff18:38 ff19:39 ff1a:3a ff1b:3b ff1c:3c ff1d:3d ff1e:3e ff20:40 ff21:41 ff22:42 ff23:43 ff24:44 ff25:45 ff26:46 ff27:47 ff28:48 ff29:49 ff2a:4a ff2b:4b ff2c:4c ff2d:4d ff2e:4e ff2f:4f ff30:50 ff31:51 ff32:52 ff33:53 ff34:54 ff35:55 ff36:56 ff37:57 ff38:58 ff39:59 ff3a:5a ff3b:5b ff3c:5c ff3d:5d ff3e:5e ff3f:5f ff40:60 ff41:61 ff42:62 ff43:63 ff44:64 ff45:65 ff46:66 ff47:67 ff48:68 ff49:69 ff4a:6a ff4b:6b ff4c:6c ff4d:6d ff4e:6e ff4f:6f ff50:70 ff51:71 ff52:72 ff53:73 ff54:74 ff55:75 ff56:76 ff57:77 ff58:78 ff59:79 ff5a:7a ff5b:7b ff5c:7c ff5d:7d ff5e:7e + +37 (IBM EBCDIC - U.S./Canada) +0004:37 0005:2d 0006:2e 0007:2f 0008:16 0009:05 000a:25 0014:3c 0015:3d 0016:32 0017:26 001a:3f 001b:27 0020:40 0021:5a 0022:7f 0023:7b 0024:5b 0025:6c 0026:50 0027:7d 0028:4d 0029:5d 002a:5c 002b:4e 002c:6b 002d:60 002e:4b 002f:61 003a:7a 003b:5e 003c:4c 003d:7e 003e:6e 003f:6f 0040:7c 005f:6d 0060:79 007c:4f 007f:07 0080:20 0081:21 0082:22 0083:23 0084:24 0085:15 0086:06 0087:17 0088:28 0089:29 008a:2a 008b:2b 008c:2c 008d:09 008e:0a 008f:1b 0090:30 0091:31 0092:1a 0093:33 0094:34 0095:35 0096:36 0097:08 0098:38 0099:39 009a:3a 009b:3b 009c:04 009d:14 009e:3e 00a0:41 00a2:4a 00a6:6a 00ac:5f 00c0:64 00c1:65 00c2:62 00c3:66 00c4:63 00c5:67 00c7:68 00c8:74 00c9:71 00ca:72 00cb:73 00cc:78 00cd:75 00ce:76 00cf:77 00d1:69 00df:59 00e0:44 00e1:45 00e2:42 00e3:46 00e4:43 00e5:47 00e7:48 00e8:54 00e9:51 00ea:52 00eb:53 00ec:58 00ed:55 00ee:56 00ef:57 00f1:49 00f8:70 ff01:5a ff02:7f ff03:7b ff04:5b ff05:6c ff06:50 ff07:7d ff08:4d ff09:5d ff0a:5c ff0b:4e ff0c:6b ff0d:60 ff0e:4b ff0f:61 ff1a:7a ff1b:5e ff1c:4c ff1d:7e ff1e:6e ff20:7c ff3f:6d ff40:79 ff5c:4f + +437 (OEM - United States) +00a4:0f 00a7:15 00a8:22 00a9:63 00ad:2d 00ae:72 00af:5f 00b3:33 00b4:27 00b6:14 00b8:2c 00b9:31 00be:5f 00c0:41 00c1:41 00c2:41 00c3:41 00c8:45 00ca:45 00cb:45 00cc:49 00cd:49 00ce:49 00cf:49 00d0:44 00d2:4f 00d3:4f 00d4:4f 00d5:4f 00d7:78 00d8:4f 00d9:55 00da:55 00db:55 00dd:59 00de:5f 00e3:61 00f0:64 00f5:6f 00f8:6f 00fd:79 00fe:5f 0100:41 0101:61 0102:41 0103:61 0104:41 0105:61 0106:43 0107:63 0108:43 0109:63 010a:43 010b:63 010c:43 010d:63 010e:44 010f:64 0110:44 0111:64 0112:45 0113:65 0114:45 0115:65 0116:45 0117:65 0118:45 0119:65 011a:45 011b:65 011c:47 011d:67 011e:47 011f:67 0120:47 0121:67 0122:47 0123:67 0124:48 0125:68 0126:48 0127:68 0128:49 0129:69 012a:49 012b:69 012c:49 012d:69 012e:49 012f:69 0130:49 0131:69 0134:4a 0135:6a 0136:4b 0137:6b 0139:4c 013a:6c 013b:4c 013c:6c 013d:4c 013e:6c 0141:4c 0142:6c 0143:4e 0144:6e 0145:4e 0146:6e 0147:4e 0148:6e 014c:4f 014d:6f 014e:4f 014f:6f 0150:4f 0151:6f 0152:4f 0153:6f 0154:52 0155:72 0156:52 0157:72 0158:52 0159:72 015a:53 015b:73 015c:53 015d:73 015e:53 015f:73 0160:53 0161:73 0162:54 0163:74 0164:54 0165:74 0166:54 0167:74 0168:55 0169:75 016a:55 016b:75 016c:55 016d:75 016e:55 016f:75 0170:55 0171:75 0172:55 0173:75 0174:57 0175:77 0176:59 0177:79 0178:59 0179:5a 017b:5a 017c:7a 017d:5a 017e:7a 0180:62 0189:44 0197:49 019a:6c 019f:4f 01a0:4f 01a1:6f 01ab:74 01ae:54 01af:55 01b0:75 01b6:7a 01c0:7c 01c3:21 01cd:41 01ce:61 01cf:49 01d0:69 01d1:4f 01d2:6f 01d3:55 01d4:75 01d5:55 01d6:75 01d7:55 01d8:75 01d9:55 01da:75 01db:55 01dc:75 01de:41 01df:61 01e4:47 01e5:67 01e6:47 01e7:67 01e8:4b 01e9:6b 01ea:4f 01eb:6f 01ec:4f 01ed:6f 01f0:6a 0261:67 02b9:27 02ba:22 02bc:27 02c4:5e 02c6:5e 02c8:27 02ca:27 02cb:60 02cd:5f 02dc:7e 0300:60 0301:27 0302:5e 0303:7e 0308:22 030e:22 0327:2c 0331:5f 0332:5f 037e:3b 04bb:68 0589:3a 066a:25 2000:20 2001:20 2002:20 2003:20 2004:20 2005:20 2006:20 2010:2d 2011:2d 2013:2d 2014:2d 2017:5f 2018:60 2019:27 201a:2c 201c:22 201d:22 201e:2c 2020:2b 2022:07 2026:2e 2030:25 2032:27 2035:60 2039:3c 203a:3e 203c:13 2044:2f 2074:34 2075:35 2076:36 2077:37 2078:38 2080:30 2081:31 2082:32 2083:33 2084:34 2085:35 2086:36 2087:37 2088:38 2089:39 20dd:09 2102:43 2107:45 210a:67 210b:48 210c:48 210d:48 210e:68 2110:49 2111:49 2112:4c 2113:6c 2115:4e 2118:50 2119:50 211a:51 211b:52 211c:52 211d:52 2122:54 2124:5a 2128:5a 212a:4b 212c:42 212d:43 212e:65 212f:65 2130:45 2131:46 2133:4d 2134:6f 2190:1b 2191:18 2192:1a 2193:19 2194:1d 2195:12 21a8:17 2212:2d 2215:2f 2216:5c 2217:2a 221f:1c 2223:7c 2236:3a 223c:7e 2302:7f 2303:5e 2329:3c 232a:3e 25ac:16 25b2:1e 25ba:10 25bc:1f 25c4:11 25cb:09 25d8:08 25d9:0a 263a:01 263b:02 263c:0f 2640:0c 2642:0b 2660:06 2663:05 2665:03 2666:04 266a:0d 266b:0e 2758:7c 3000:20 3007:09 3008:3c 3009:3e 301a:5b 301b:5d ff01:21 ff02:22 ff03:23 ff04:24 ff05:25 ff06:26 ff07:27 ff08:28 ff09:29 ff0a:2a ff0b:2b ff0c:2c ff0d:2d ff0e:2e ff0f:2f ff10:30 ff11:31 ff12:32 ff13:33 ff14:34 ff15:35 ff16:36 ff17:37 ff18:38 ff19:39 ff1a:3a ff1b:3b ff1c:3c ff1d:3d ff1e:3e ff20:40 ff21:41 ff22:42 ff23:43 ff24:44 ff25:45 ff26:46 ff27:47 ff28:48 ff29:49 ff2a:4a ff2b:4b ff2c:4c ff2d:4d ff2e:4e ff2f:4f ff30:50 ff31:51 ff32:52 ff33:53 ff34:54 ff35:55 ff36:56 ff37:57 ff38:58 ff39:59 ff3a:5a ff3b:5b ff3c:5c ff3d:5d ff3e:5e ff3f:5f ff40:60 ff41:61 ff42:62 ff43:63 ff44:64 ff45:65 ff46:66 ff47:67 ff48:68 ff49:69 ff4a:6a ff4b:6b ff4c:6c ff4d:6d ff4e:6e ff4f:6f ff50:70 ff51:71 ff52:72 ff53:73 ff54:74 ff55:75 ff56:76 ff57:77 ff58:78 ff59:79 ff5a:7a ff5b:7b ff5c:7c ff5d:7d ff5e:7e + +500 (IBM EBCDIC - International) +0004:37 0005:2d 0006:2e 0007:2f 0008:16 0009:05 000a:25 0014:3c 0015:3d 0016:32 0017:26 001a:3f 001b:27 0020:40 0021:4f 0022:7f 0023:7b 0024:5b 0025:6c 0026:50 0027:7d 0028:4d 0029:5d 002a:5c 002b:4e 002c:6b 002d:60 002e:4b 002f:61 003a:7a 003b:5e 003c:4c 003d:7e 003e:6e 003f:6f 0040:7c 005b:4a 005d:5a 005e:5f 005f:6d 0060:79 007f:07 0080:20 0081:21 0082:22 0083:23 0084:24 0085:15 0086:06 0087:17 0088:28 0089:29 008a:2a 008b:2b 008c:2c 008d:09 008e:0a 008f:1b 0090:30 0091:31 0092:1a 0093:33 0094:34 0095:35 0096:36 0097:08 0098:38 0099:39 009a:3a 009b:3b 009c:04 009d:14 009e:3e 00a0:41 00a6:6a 00c0:64 00c1:65 00c2:62 00c3:66 00c4:63 00c5:67 00c7:68 00c8:74 00c9:71 00ca:72 00cb:73 00cc:78 00cd:75 00ce:76 00cf:77 00d1:69 00df:59 00e0:44 00e1:45 00e2:42 00e3:46 00e4:43 00e5:47 00e7:48 00e8:54 00e9:51 00ea:52 00eb:53 00ec:58 00ed:55 00ee:56 00ef:57 00f1:49 00f8:70 ff01:4f ff02:7f ff03:7b ff04:5b ff05:6c ff06:50 ff07:7d ff08:4d ff09:5d ff0a:5c ff0b:4e ff0c:6b ff0d:60 ff0e:4b ff0f:61 ff1a:7a ff1b:5e ff1c:4c ff1d:7e ff1e:6e ff20:7c ff3b:4a ff3d:5a ff3e:5f ff3f:6d ff40:79 + +850 (OEM - Multilingual Latin I) +0100:41 0101:61 0102:41 0103:61 0104:41 0105:61 0106:43 0107:63 0108:43 0109:63 010a:43 010b:63 010c:43 010d:63 010e:44 010f:64 0110:44 0111:64 0112:45 0113:65 0114:45 0115:65 0116:45 0117:65 0118:45 0119:65 011a:45 011b:65 011c:47 011d:67 011e:47 011f:67 0120:47 0121:67 0122:47 0123:67 0124:48 0125:68 0126:48 0127:68 0128:49 0129:69 012a:49 012b:69 012c:49 012d:69 012e:49 012f:69 0130:49 0134:4a 0135:6a 0136:4b 0137:6b 0139:4c 013a:6c 013b:4c 013c:6c 013d:4c 013e:6c 0141:4c 0142:6c 0143:4e 0144:6e 0145:4e 0146:6e 0147:4e 0148:6e 014c:4f 014d:6f 014e:4f 014f:6f 0150:4f 0151:6f 0152:4f 0153:6f 0154:52 0155:72 0156:52 0157:72 0158:52 0159:72 015a:53 015b:73 015c:53 015d:73 015e:53 015f:73 0160:53 0161:73 0162:54 0163:74 0164:54 0165:74 0166:54 0167:74 0168:55 0169:75 016a:55 016b:75 016c:55 016d:75 016e:55 016f:75 0170:55 0171:75 0172:55 0173:75 0174:57 0175:77 0176:59 0177:79 0178:59 0179:5a 017b:5a 017c:7a 017d:5a 017e:7a 0180:62 0189:44 0197:49 019a:6c 019f:4f 01a0:4f 01a1:6f 01a9:53 01ab:74 01ae:54 01af:55 01b0:75 01b6:5a 01c3:21 01cd:41 01ce:61 01cf:49 01d0:69 01d1:4f 01d2:6f 01d3:55 01d4:75 01d5:55 01d6:75 01d7:55 01d8:75 01d9:55 01da:75 01db:55 01dc:75 01de:41 01df:61 01e4:47 01e5:67 01e6:47 01e7:67 01e8:4b 01e9:6b 01ea:4f 01eb:6f 01ec:4f 01ed:6f 01f0:6a 0261:67 02ba:22 02bc:27 02c4:5e 02c6:5e 02c8:27 02cb:27 02cd:5f 02dc:7e 0300:27 0302:5e 0303:7e 030e:22 0331:5f 0332:5f 037e:3b 0393:47 03a3:53 03a6:46 03a9:4f 03b1:61 03b4:64 03b5:65 03c0:70 03c3:73 03c4:74 03c6:66 04bb:68 0589:3a 066a:25 2000:20 2001:20 2002:20 2003:20 2004:20 2005:20 2006:20 2010:2d 2011:2d 2013:2d 2014:2d 2018:27 2019:27 201a:27 201c:22 201d:22 201e:22 2022:07 2024:07 2026:2e 2030:25 2039:3c 203a:3e 203c:13 2044:2f 2070:30 2074:34 2075:35 2076:36 2077:37 2078:39 207f:6e 2080:30 2084:34 2085:35 2086:36 2087:37 2088:38 2089:39 20a7:50 20dd:4f 2102:43 2107:45 210a:67 210b:48 210c:48 210d:48 210e:68 2110:49 2111:49 2112:4c 2113:6c 2115:4e 2118:50 2119:50 211a:51 211b:52 211c:52 211d:52 2122:54 2124:5a 2126:4f 2128:5a 212a:4b 212c:42 212d:43 212e:65 212f:65 2130:45 2131:46 2133:4d 2134:6f 2190:1b 2191:18 2192:1a 2193:19 2194:1d 2195:12 21a8:17 2211:53 2212:2d 2215:2f 2216:2f 2217:2a 2219:07 221a:56 221e:38 221f:1c 2229:6e 2236:3a 223c:7e 2248:7e 2261:3d 2264:3d 2265:3d 2302:7f 2303:5e 2320:28 2321:29 2329:3c 232a:3e 25ac:16 25b2:1e 25ba:10 25bc:1f 25c4:11 25cb:09 25d8:08 25d9:0a 263a:01 263b:02 263c:0f 2640:0c 2642:0b 2660:06 2663:05 2665:03 2666:04 266a:0d 266b:0e 2713:56 3000:20 3007:4f 3008:3c 3009:3e 301a:5b 301b:5d ff01:21 ff02:22 ff03:23 ff04:24 ff05:25 ff06:26 ff07:27 ff08:28 ff09:29 ff0a:2a ff0b:2b ff0c:2c ff0d:2d ff0e:2e ff0f:2f ff10:30 ff11:31 ff12:32 ff13:33 ff14:34 ff15:35 ff16:36 ff17:37 ff18:38 ff19:39 ff1a:3a ff1b:3b ff1c:3c ff1d:3d ff1e:3e ff20:40 ff21:41 ff22:42 ff23:43 ff24:44 ff25:45 ff26:46 ff27:47 ff28:48 ff29:49 ff2a:4a ff2b:4b ff2c:4c ff2d:4d ff2e:4e ff2f:4f ff30:50 ff31:51 ff32:52 ff33:53 ff34:54 ff35:55 ff36:56 ff37:57 ff38:58 ff39:59 ff3a:5a ff3b:5b ff3c:5c ff3d:5d ff3e:5e ff3f:5f ff40:60 ff41:61 ff42:62 ff43:63 ff44:64 ff45:65 ff46:66 ff47:67 ff48:68 ff49:69 ff4a:6a ff4b:6b ff4c:6c ff4d:6d ff4e:6e ff4f:6f ff50:70 ff51:71 ff52:72 ff53:73 ff54:74 ff55:75 ff56:76 ff57:77 ff58:78 ff59:79 ff5a:7a ff5b:7b ff5c:7c ff5d:7d ff5e:7e + +860 (OEM - Portuguese) +00a4:0f 00a5:59 00a7:15 00a8:22 00a9:63 00ad:5f 00ae:72 00af:16 00b3:33 00b4:2f 00b6:14 00b8:2c 00b9:31 00be:33 00c4:41 00c5:41 00c6:41 00cb:45 00ce:49 00cf:49 00d0:44 00d6:4f 00d7:58 00d8:4f 00db:55 00dd:59 00de:54 00e4:61 00e5:61 00e6:61 00eb:65 00ee:69 00ef:69 00f0:64 00f6:6f 00f8:6f 00fb:75 00fd:79 00fe:74 00ff:79 0100:41 0101:61 0102:41 0103:61 0104:41 0105:61 0106:43 0107:63 0108:43 0109:63 010a:43 010b:63 010c:43 010d:63 010e:44 010f:64 0110:44 0111:64 0112:45 0113:65 0114:45 0115:65 0116:45 0117:65 0118:45 0119:65 011a:45 011b:65 011c:47 011d:67 011e:47 011f:67 0120:47 0121:67 0122:47 0123:67 0124:48 0125:68 0126:48 0127:68 0128:49 0129:69 012a:49 012b:69 012c:49 012d:69 012e:49 012f:69 0130:49 0131:69 0134:4a 0135:6a 0136:4b 0137:6b 0139:4c 013a:6c 013b:4c 013c:6c 013d:4c 013e:6c 0141:4c 0142:6c 0143:4e 0144:6e 0145:4e 0146:6e 0147:4e 0148:6e 014c:4f 014d:6f 014e:4f 014f:6f 0150:4f 0151:6f 0152:4f 0153:6f 0154:52 0155:72 0156:52 0157:72 0158:52 0159:72 015a:53 015b:73 015c:53 015d:73 015e:53 015f:73 0160:5c 0161:7c 0162:54 0163:74 0164:54 0165:74 0166:54 0167:74 0168:55 0169:75 016a:55 016b:75 016c:55 016d:75 016e:55 016f:75 0170:55 0171:75 0172:55 0173:75 0174:57 0175:77 0176:59 0177:79 0178:59 0179:5a 017b:5a 017c:7a 017d:5a 017e:7a 0180:62 0189:44 0191:46 0192:66 0197:49 019a:6c 019f:4f 01a0:4f 01a1:6f 01ab:74 01ae:54 01af:55 01b0:75 01b6:7a 01c0:7c 01c3:21 01cd:41 01ce:61 01cf:49 01d0:69 01d1:4f 01d2:6f 01d3:55 01d4:75 01d5:55 01d6:75 01d7:55 01d8:75 01d9:55 01da:75 01db:55 01dc:75 01de:41 01df:61 01e4:47 01e5:67 01e6:47 01e7:67 01e8:4b 01e9:6b 01ea:4f 01eb:6f 01ec:4f 01ed:6f 01f0:6a 0261:67 0278:66 02b9:27 02ba:22 02bc:27 02c4:5e 02c6:5e 02c8:27 02c9:16 02ca:2f 02cb:60 02cd:5f 02dc:7e 0300:60 0301:2f 0302:5e 0303:7e 0304:16 0305:16 0308:22 030e:22 0327:2c 0331:5f 0332:5f 037e:3b 04bb:68 0589:3a 066a:25 2000:20 2001:20 2002:20 2003:20 2004:20 2005:20 2006:20 2010:5f 2011:5f 2013:5f 2014:5f 2017:5f 2018:27 2019:27 201a:2c 201c:22 201d:22 201e:22 2022:07 2024:07 2026:2e 2030:25 2032:27 2035:60 2039:3c 203a:3e 203c:13 2044:2f 2070:30 2074:34 2075:35 2076:36 2077:37 2078:38 2080:30 2081:31 2083:33 2084:34 2085:35 2086:36 2087:37 2088:38 2089:39 20dd:4f 2102:43 2107:45 210a:67 210b:48 210c:48 210d:48 210e:68 2110:49 2111:49 2112:4c 2113:6c 2115:4e 2118:70 2119:50 211a:51 211b:52 211c:52 211d:52 2122:74 2124:5a 2128:5a 212a:4b 212b:41 212c:42 212d:43 212e:65 212f:65 2130:45 2131:46 2133:4d 2134:6f 2190:1b 2191:18 2192:1a 2193:19 2194:1d 2195:12 21a8:17 2205:4f 2212:5f 2215:2f 2216:5c 2217:2a 221f:1c 2223:7c 2236:3a 223c:7e 22c5:07 2302:7f 2303:5e 2329:3c 232a:3e 25ac:16 25b2:1e 25ba:10 25bc:1f 25c4:11 25cb:09 25d8:08 25d9:0a 263a:01 263b:02 263c:0f 2640:0c 2642:0b 2660:06 2663:05 2665:03 2666:04 266a:0d 266b:0e 3000:20 3007:4f 3008:3c 3009:3e 301a:5b 301b:5d 30fb:07 + +861 (OEM - Icelandic) +00a2:63 00a4:0f 00a5:59 00a7:15 00a8:22 00a9:63 00aa:61 00ad:5f 00ae:72 00af:16 00b3:33 00b4:2f 00b6:14 00b8:2c 00b9:31 00ba:6f 00be:33 00c0:41 00c2:41 00c3:41 00c8:45 00ca:45 00cb:45 00cc:49 00ce:49 00cf:49 00d1:4e 00d2:4f 00d4:4f 00d5:4f 00d7:58 00d9:55 00db:55 00e3:61 00ec:69 00ee:69 00ef:69 00f1:6e 00f2:6f 00f5:6f 00f9:75 00ff:79 0100:41 0101:61 0102:41 0103:61 0104:41 0105:61 0106:43 0107:63 0108:43 0109:63 010a:43 010b:63 010c:43 010d:63 010e:44 010f:64 0111:64 0112:45 0113:65 0114:45 0115:65 0116:45 0117:65 0118:45 0119:65 011a:45 011b:65 011c:47 011d:67 011e:47 011f:67 0120:47 0121:67 0122:47 0123:67 0124:48 0125:68 0126:48 0127:68 0128:49 0129:69 012a:49 012b:69 012c:49 012d:69 012e:49 012f:69 0130:49 0131:69 0134:4a 0135:6a 0136:4b 0137:6b 0139:4c 013a:6c 013b:4c 013c:6c 013d:4c 013e:6c 0141:4c 0142:6c 0143:4e 0144:6e 0145:4e 0146:6e 0147:4e 0148:6e 014c:4f 014d:6f 014e:4f 014f:6f 0150:4f 0151:6f 0152:4f 0153:6f 0154:52 0155:72 0156:52 0157:72 0158:52 0159:72 015a:53 015b:73 015c:53 015d:73 015e:53 015f:73 0160:53 0161:73 0162:54 0163:74 0164:54 0165:74 0166:54 0167:74 0168:55 0169:75 016a:55 016b:75 016c:55 016d:75 016e:55 016f:75 0170:55 0171:75 0172:55 0173:75 0174:57 0175:77 0176:59 0177:79 0178:59 0179:5a 017b:5a 017c:7a 017d:5a 017e:7a 0180:62 0197:49 019a:6c 019f:4f 01a0:4f 01a1:6f 01ab:74 01ae:54 01af:55 01b0:75 01b6:7a 01c3:21 01cd:41 01ce:61 01cf:49 01d0:69 01d1:4f 01d2:6f 01d3:55 01d4:75 01d5:55 01d6:75 01d7:55 01d8:75 01d9:55 01da:75 01db:55 01dc:75 01de:41 01df:61 01e4:47 01e5:67 01e6:47 01e7:67 01e8:4b 01e9:6b 01ea:4f 01eb:6f 01ec:4f 01ed:6f 01f0:6a 0261:67 0278:66 02b9:27 02ba:22 02bc:27 02c4:5e 02c6:5e 02c8:27 02c9:16 02ca:2f 02cb:60 02cd:5f 02dc:7e 0300:60 0301:2f 0302:5e 0303:7e 0304:16 0305:16 0308:22 030e:22 0327:2c 0331:5f 0332:5f 037e:3b 04bb:68 0589:3a 066a:25 2000:20 2001:20 2002:20 2003:20 2004:20 2005:20 2006:20 2010:2d 2011:2d 2013:2d 2014:2d 2017:5f 2018:27 2019:27 201a:27 201c:22 201d:22 201e:22 2022:07 2024:07 2026:07 2030:25 2032:27 2035:27 2039:3c 203a:3e 203c:13 2044:2f 2070:30 2074:34 2075:35 2076:36 2077:37 2078:38 2080:30 2081:31 2083:33 2084:34 2085:35 2086:36 2087:37 2088:38 2089:39 20dd:4f 2102:43 2107:45 210a:67 210b:48 210c:48 210d:48 210e:68 2110:49 2111:49 2112:4c 2113:6c 2115:4e 2118:70 2119:50 211a:51 211b:52 211c:52 211d:52 2122:74 2124:5a 2128:5a 212a:4b 212c:42 212d:43 212e:65 212f:65 2130:45 2131:46 2133:4d 2134:6f 2190:1b 2191:18 2192:1a 2193:19 2194:1d 2195:12 21a8:17 2205:4f 2212:5f 2215:2f 2216:5c 2217:2a 221f:1c 2223:7c 2236:3a 223c:7e 22c5:07 2302:7f 2303:5e 2329:3c 232a:3e 25ac:16 25b2:1e 25ba:10 25bc:1f 25c4:11 25cb:09 25d8:08 25d9:0a 263a:01 263b:02 263c:0f 2640:0c 2642:0b 2660:06 2663:05 2665:03 2666:04 266a:0d 266b:0e 3000:20 3007:4f 3008:3c 3009:3e 301a:5b 301b:5d 30fb:07 + +863 (OEM - Canadian French) +00a1:21 00a5:59 00a9:63 00aa:61 00ad:16 00ae:72 00b9:33 00ba:6f 00c1:41 00c3:41 00c4:41 00c5:41 00c6:41 00cc:49 00cd:49 00d0:44 00d1:4e 00d2:4f 00d3:4f 00d5:4f 00d6:4f 00d7:58 00d8:4f 00da:55 00dd:59 00de:54 00e1:61 00e3:61 00e4:61 00e5:61 00e6:61 00ec:69 00ed:69 00f0:64 00f1:6e 00f2:6f 00f5:6f 00f6:6f 00f8:6f 00fd:79 00fe:74 00ff:79 0100:41 0101:61 0102:41 0103:61 0104:41 0105:61 0106:43 0107:63 0108:43 0109:63 010a:43 010b:63 010c:43 010d:63 010e:44 010f:64 0110:44 0111:64 0112:45 0113:65 0114:45 0115:65 0116:45 0117:65 0118:45 0119:65 011a:45 011b:65 011c:47 011d:67 011e:47 011f:67 0120:47 0121:67 0122:47 0123:67 0124:48 0125:68 0126:48 0127:68 0128:49 0129:69 012a:49 012b:69 012c:49 012d:69 012e:49 012f:69 0130:49 0131:69 0134:4a 0135:6a 0136:4b 0137:6b 0139:4c 013a:6c 013b:4c 013c:6c 013d:4c 013e:6c 0141:4c 0142:6c 0143:4e 0144:6e 0145:4e 0146:6e 0147:4e 0148:6e 014c:4f 014d:6f 014e:4f 014f:6f 0150:4f 0151:6f 0152:4f 0153:6f 0154:52 0155:72 0156:52 0157:72 0158:52 0159:72 015a:53 015b:73 015c:53 015d:73 015e:53 015f:73 0160:53 0161:73 0162:54 0163:74 0164:54 0165:74 0166:54 0167:74 0168:55 0169:75 016a:55 016b:75 016c:55 016d:75 016e:55 016f:75 0170:55 0171:75 0172:55 0173:75 0174:57 0175:77 0176:59 0177:79 0178:59 0179:5a 017b:5a 017c:7a 017d:5a 017e:7a 0180:62 0189:44 0197:49 019a:6c 019f:4f 01a0:4f 01a1:6f 01ab:74 01ae:54 01af:55 01b0:75 01b6:7a 01c3:21 01cd:41 01ce:61 01cf:49 01d0:69 01d1:4f 01d2:6f 01d3:55 01d4:75 01d5:55 01d6:75 01d7:55 01d8:75 01d9:55 01da:75 01db:55 01dc:75 01de:41 01df:61 01e4:47 01e5:67 01e6:47 01e7:67 01e8:4b 01e9:6b 01ea:4f 01eb:6f 01ec:4f 01ed:6f 01f0:6a 0261:67 02b9:22 02ba:27 02bc:27 02c4:5e 02c6:5e 02c8:27 02c9:16 02cb:60 02cd:5f 02dc:7e 0300:60 0302:5e 0303:7e 0304:16 0305:16 0331:5f 0332:5f 037e:3b 04bb:68 0589:3a 066a:25 2000:20 2001:20 2002:20 2003:20 2004:20 2005:20 2006:20 2010:2d 2011:2d 2013:2d 2014:2d 2018:27 2019:27 201a:27 201c:22 201d:22 201e:22 2022:07 2024:07 2026:07 2030:25 2032:27 2035:27 2039:3c 203a:3e 203c:13 2044:2f 2070:30 2074:34 2075:35 2076:36 2077:37 2078:38 2080:30 2081:31 2084:34 2085:35 2086:36 2087:37 2088:38 2089:39 20a7:50 20dd:4f 2102:43 2107:45 210a:67 210b:48 210c:48 210d:48 210e:68 2110:49 2111:49 2112:4c 2113:6c 2115:4e 2118:70 2119:50 211a:51 211b:52 211c:52 211d:52 2122:74 2124:5a 2128:5a 212a:4b 212b:41 212c:42 212d:43 212e:65 212f:65 2130:45 2131:46 2133:4d 2134:6f 2190:1b 2191:18 2192:1a 2193:19 2194:1d 2195:12 21a8:17 2205:4f 2212:5f 2215:2f 2216:5c 2217:2a 221f:1c 2223:7c 2236:3a 223c:7e 22c5:07 2302:7f 2303:5e 2329:3c 232a:3e 25ac:16 25b2:1e 25ba:10 25bc:1f 25c4:11 25cb:09 25d8:08 25d9:0a 263a:01 263b:02 263c:0f 2640:0c 2642:0b 2660:06 2663:05 2665:03 2666:04 266a:0d 266b:0e 3000:20 3007:4f 3008:3c 3009:3e 301a:5b 301b:5d 30fb:07 + +865 (OEM - Nordic) +00a2:63 00a5:59 00a7:15 00a8:22 00a9:63 00ad:5f 00ae:72 00af:16 00b3:33 00b4:2f 00b6:14 00b8:2c 00b9:31 00bb:3e 00be:33 00c0:41 00c1:41 00c2:41 00c3:41 00c8:45 00ca:45 00cb:45 00cc:49 00cd:49 00ce:49 00cf:49 00d0:44 00d2:4f 00d3:4f 00d4:4f 00d5:4f 00d7:58 00d9:55 00da:55 00db:55 00dd:59 00de:54 00e3:61 00f0:64 00f5:6f 00fd:79 00fe:74 0100:41 0101:61 0102:41 0103:61 0104:41 0105:61 0106:43 0107:63 0108:43 0109:63 010a:43 010b:63 010c:43 010d:63 010e:44 010f:64 0110:44 0111:64 0112:45 0113:65 0114:45 0115:65 0116:45 0117:65 0118:45 0119:65 011a:45 011b:65 011c:47 011d:67 011e:47 011f:67 0120:47 0121:67 0122:47 0123:67 0124:48 0125:68 0126:48 0127:68 0128:49 0129:69 012a:49 012b:69 012c:49 012d:69 012e:49 012f:69 0130:49 0131:69 0134:4a 0135:6a 0136:4b 0137:6b 0139:4c 013a:6c 013b:4c 013c:6c 013d:4c 013e:6c 0141:4c 0142:6c 0143:4e 0144:6e 0145:4e 0146:6e 0147:4e 0148:6e 014c:4f 014d:6f 014e:4f 014f:6f 0150:4f 0151:6f 0152:4f 0153:6f 0154:52 0155:72 0156:52 0157:72 0158:52 0159:72 015a:53 015b:73 015c:53 015d:73 015e:53 015f:73 0160:53 0161:73 0162:54 0163:74 0164:54 0165:74 0166:54 0167:74 0168:55 0169:75 016a:55 016b:75 016c:55 016d:75 016e:55 016f:75 0170:55 0171:75 0172:55 0173:75 0174:57 0175:77 0176:59 0177:79 0178:59 0179:5a 017b:5a 017c:7a 017d:5a 017e:7a 0180:62 0189:44 0197:49 019a:6c 019f:4f 01a0:4f 01a1:6f 01ab:74 01ae:54 01af:55 01b0:75 01b6:7a 01c3:21 01cd:41 01ce:61 01cf:49 01d0:69 01d1:4f 01d2:6f 01d3:55 01d4:75 01d5:55 01d6:75 01d7:55 01d8:75 01d9:55 01da:75 01db:55 01dc:75 01de:41 01df:61 01e4:47 01e5:67 01e6:47 01e7:67 01e8:4b 01e9:6b 01ea:4f 01eb:6f 01ec:4f 01ed:6f 01f0:6a 0261:67 02b9:27 02ba:22 02bc:27 02c4:5e 02c6:5e 02c8:27 02c9:16 02ca:2f 02cb:60 02cd:5f 02dc:7e 0300:60 0301:2f 0302:5e 0303:7e 0304:16 0305:16 0308:22 030e:22 0327:2c 0331:5f 0332:5f 037e:3b 04bb:68 0589:3a 066a:25 2000:20 2001:20 2002:20 2003:20 2004:20 2005:20 2006:20 2010:2d 2011:2d 2013:2d 2014:2d 2017:5f 2018:27 2019:27 201a:27 201c:22 201d:22 201e:22 2022:07 2024:07 2026:07 2030:25 2032:27 2035:27 2039:3c 203a:3e 203c:13 2044:2f 2070:30 2074:34 2075:35 2076:36 2077:37 2078:38 2080:30 2081:31 2083:33 2084:34 2085:35 2086:36 2087:37 2088:38 2089:39 20dd:4f 2102:43 2107:45 210a:67 210b:48 210c:48 210d:48 210e:68 2110:49 2111:49 2112:4c 2113:6c 2115:4e 2118:70 2119:50 211a:51 211b:52 211c:52 211d:52 2122:74 2124:5a 2128:5a 212a:4b 212c:42 212d:43 212e:65 212f:65 2130:45 2131:46 2133:4d 2134:6f 2190:1b 2191:18 2192:1a 2193:19 2194:1d 2195:12 21a8:17 2205:4f 2212:5f 2215:2f 2216:5c 2217:2a 221f:1c 2223:7c 2236:3a 223c:7e 226b:3c 22c5:07 2302:7f 2303:5e 2329:3c 232a:3e 25ac:16 25b2:1e 25ba:10 25bc:1f 25c4:11 25cb:09 25d8:08 25d9:0a 263a:01 263b:02 263c:0f 2640:0c 2642:0b 2660:06 2663:05 2665:03 2666:04 266a:0d 266b:0e 3000:20 3007:4f 3008:3c 3009:3e 300b:3e 301a:5b 301b:5d 30fb:07 + +874 (ANSI/OEM - Thai) +00a7:15 00b6:14 203c:13 2190:1b 2191:18 2192:1a 2193:19 2194:1d 2195:12 21a8:17 221f:1c 2302:7f 25ac:16 25b2:1e 25ba:10 25bc:1f 25c4:11 25cb:09 25d8:08 25d9:0a 263a:01 263b:02 263c:0f 2640:0c 2642:0b 2660:06 2663:05 2665:03 2666:04 266a:0d 266b:0e ff01:21 ff02:22 ff03:23 ff04:24 ff05:25 ff06:26 ff07:27 ff08:28 ff09:29 ff0a:2a ff0b:2b ff0c:2c ff0d:2d ff0e:2e ff0f:2f ff10:30 ff11:31 ff12:32 ff13:33 ff14:34 ff15:35 ff16:36 ff17:37 ff18:38 ff19:39 ff1a:3a ff1b:3b ff1c:3c ff1d:3d ff1e:3e ff20:40 ff21:41 ff22:42 ff23:43 ff24:44 ff25:45 ff26:46 ff27:47 ff28:48 ff29:49 ff2a:4a ff2b:4b ff2c:4c ff2d:4d ff2e:4e ff2f:4f ff30:50 ff31:51 ff32:52 ff33:53 ff34:54 ff35:55 ff36:56 ff37:57 ff38:58 ff39:59 ff3a:5a ff3b:5b ff3c:5c ff3d:5d ff3e:5e ff3f:5f ff40:60 ff41:61 ff42:62 ff43:63 ff44:64 ff45:65 ff46:66 ff47:67 ff48:68 ff49:69 ff4a:6a ff4b:6b ff4c:6c ff4d:6d ff4e:6e ff4f:6f ff50:70 ff51:71 ff52:72 ff53:73 ff54:74 ff55:75 ff56:76 ff57:77 ff58:78 ff59:79 ff5a:7a ff5b:7b ff5c:7c ff5d:7d ff5e:7e + +932 (ANSI/OEM - Japanese Shift-JIS) +00a1:21 00a5:5c 00a6:7c 00a9:63 00aa:61 00ad:2d 00ae:52 00b2:32 00b3:33 00b9:31 00ba:6f 00c0:41 00c1:41 00c2:41 00c3:41 00c4:41 00c5:41 00c6:41 00c7:43 00c8:45 00c9:45 00ca:45 00cb:45 00cc:49 00cd:49 00ce:49 00cf:49 00d0:44 00d1:4e 00d2:4f 00d3:4f 00d4:4f 00d5:4f 00d6:4f 00d8:4f 00d9:55 00da:55 00db:55 00dc:55 00dd:59 00de:54 00df:73 00e0:61 00e1:61 00e2:61 00e3:61 00e4:61 00e5:61 00e6:61 00e7:63 00e8:65 00e9:65 00ea:65 00eb:65 00ec:69 00ed:69 00ee:69 00ef:69 00f0:64 00f1:6e 00f2:6f 00f3:6f 00f4:6f 00f5:6f 00f6:6f 00f8:6f 00f9:75 00fa:75 00fb:75 00fc:75 00fd:79 00fe:74 00ff:79 + +936 (ANSI/OEM - Simplified Chinese GBK) +00a6:7c 00aa:61 00ad:2d 00b2:32 00b3:33 00b9:31 00ba:6f 00d0:44 00dd:59 00de:54 00e2:61 00f0:65 00fd:79 00fe:74 + +949 (ANSI/OEM - Korean) +00a6:7c 00c0:41 00c1:41 00c2:41 00c3:41 00c4:41 00c5:41 00c7:43 00c8:45 00c9:45 00ca:45 00cb:45 00cc:49 00cd:49 00ce:49 00cf:49 00d1:4e 00d2:4f 00d3:4f 00d4:4f 00d5:4f 00d6:4f 00d9:55 00da:55 00db:55 00dc:55 00dd:59 00e0:61 00e1:61 00e2:61 00e3:61 00e4:61 00e5:61 00e7:63 00e8:65 00e9:65 00ea:65 00eb:65 00ec:69 00ed:69 00ee:69 00ef:69 00f1:6e 00f2:6f 00f3:6f 00f4:6f 00f5:6f 00f6:6f 00f9:75 00fa:75 00fb:75 00fc:75 00fd:79 00ff:79 20a9:5c + +950 (ANSI/OEM - Traditional Chinese Big5) +00a1:21 00a6:7c 00a9:63 00aa:61 00ad:2d 00ae:52 00b2:32 00b3:33 00b9:31 00ba:6f 00c0:41 00c1:41 00c2:41 00c3:41 00c4:41 00c5:41 00c6:41 00c7:43 00c8:45 00c9:45 00ca:45 00cb:45 00cc:49 00cd:49 00ce:49 00cf:49 00d0:44 00d1:4e 00d2:4f 00d3:4f 00d4:4f 00d5:4f 00d6:4f 00d8:4f 00d9:55 00da:55 00db:55 00dc:55 00dd:59 00de:54 00df:73 00e0:61 00e1:61 00e2:61 00e3:61 00e4:61 00e5:61 00e6:61 00e7:63 00e8:65 00e9:65 00ea:65 00eb:65 00ec:69 00ed:69 00ee:69 00ef:69 00f0:65 00f1:6e 00f2:6f 00f3:6f 00f4:6f 00f5:6f 00f6:6f 00f8:6f 00f9:75 00fa:75 00fb:75 00fc:75 00fd:79 00fe:74 00ff:79 + +(UTF-7) + + +(UTF-8) + + diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..9841dd1 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,323 @@ +name: Quality Assurance + +on: + push: + pull_request: + + # Default: none +permissions: {} + +jobs: + build-linux: + permissions: + contents: read + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-22.04] + compiler: [gcc, clang] + env: + CC: "/usr/bin/${{ matrix.compiler }}" + CXX: "/usr/bin/${{ matrix.compiler == 'gcc' && 'g' || 'clang' }}++" + COMPDEPS: "${{ matrix.compiler == 'gcc' && 'gcc g++' || 'clang' }}" + steps: + - name: Setup Dependencies + run: | + sudo dpkg --add-architecture i386 + sudo apt-get update -y -qq + sudo apt-get install -y make autoconf automake make libyajl-dev libxml2-dev libmaxminddb-dev libcurl4-gnutls-dev $COMPDEPS + - name: Get libModSecurity source + uses: actions/checkout@v4 + with: + repository: owasp-modsecurity/ModSecurity + path: ModSecurity + submodules: true + fetch-depth: 1 + - name: Build libModSecurity + working-directory: ModSecurity + run: | + ./build.sh + ./configure --without-lmdb --prefix=/usr + make -j $(nproc) + sudo make install + - uses: actions/checkout@v4 + with: + path: ModSecurity-nginx + fetch-depth: 1 + - name: Get Nginx source + uses: actions/checkout@v4 + with: + repository: nginx/nginx + path: nginx + fetch-depth: 1 + - name: Get Nginx tests + uses: actions/checkout@v4 + with: + repository: nginx/nginx-tests + path: nginx/test + fetch-depth: 1 + - name: Copy ModSecurity-nginx tests to nginx/test + run: | + cp ModSecurity-nginx/tests/* nginx/test + - name: Build nginx with ModSecurity-nginx module + working-directory: nginx + run: | + ./auto/configure --with-ld-opt="-Wl,-rpath,/usr/local/lib" --without-pcre2 --with-http_v2_module --with-http_auth_request_module --add-module=../ModSecurity-nginx + make + make modules + sudo make install + - name: Run ModSecurity-nginx tests + working-directory: nginx/test + run: | + TEST_NGINX_BINARY=../objs/nginx prove modsecurity*.t + - name: Start Nginx + run: | + sudo cp /home/runner/work/ModSecurity-nginx/ModSecurity-nginx/ModSecurity-nginx/.github/nginx/docs/* /usr/local/nginx/html/ + sudo /usr/local/nginx/sbin/nginx -c /home/runner/work/ModSecurity-nginx/ModSecurity-nginx/ModSecurity-nginx/.github/nginx/nginx.conf + - name: Run attack test vhost 1 + run: | + status=$(curl -sSo /dev/null -w %{http_code} -I -X GET -H "Host: modsectest1" "http://localhost/?q=attack") + if [ "${status}" == "403" ]; then + echo "OK" + else + echo "FAIL" + exit 1 + fi + - name: Run non-attack test vhost 1 + run: | + status=$(curl -sSo /dev/null -w %{http_code} -I -X GET -H "Host: modsectest1" "http://localhost/?q=1") + if [ "${status}" == "200" ]; then + echo "OK" + else + echo "FAIL" + exit 1 + fi + - name: Run attack test vhost 2 + run: | + status=$(curl -sSo /dev/null -w %{http_code} -I -X GET -H "Host: modsectest2" "http://localhost/?q=attack") + if [ "${status}" == "403" ]; then + echo "OK" + else + echo "FAIL" + exit 1 + fi + - name: Run non-attack test vhost 2 + run: | + status=$(curl -sSo /dev/null -w %{http_code} -I -X GET -H "Host: modsectest2" "http://localhost/?q=1") + if [ "${status}" == "200" ]; then + echo "OK" + else + echo "FAIL" + exit 1 + fi + - name: Run file consistency check 1 + run: | + curl -sS "http://localhost/data50k.json" --output data50k.json + if [ -f data50k.json ]; then + diff data50k.json /usr/local/nginx/html/data50k.json > /dev/null + if [ $? -eq 0 ]; then + echo "OK" + else + echo "FAIL" + exit 2 + fi + else + echo "FAIL" + exit 1 + fi + - name: Run file consistency check 2 + run: | + curl -sS "http://localhost/plugged.png" --output plugged.png + if [ -f plugged.png ]; then + diff plugged.png /usr/local/nginx/html/plugged.png > /dev/null + if [ $? -eq 0 ]; then + echo "OK" + else + echo "FAIL" + exit 2 + fi + else + echo "FAIL" + exit 1 + fi + - name: Start Nginx with redir + run: | + sudo killall nginx + sudo /usr/local/nginx/sbin/nginx -c /home/runner/work/ModSecurity-nginx/ModSecurity-nginx/ModSecurity-nginx/.github/nginx/nginx.conf.redir + - name: Run attack test vhost 1 + run: | + status=$(curl -sSo /dev/null -w %{http_code} -I -X GET -H "Host: modsectest1" "http://localhost/?q=attack") + if [ "${status}" == "403" ]; then + echo "OK" + else + echo "FAIL" + exit 1 + fi + - name: Run non-attack test vhost 1 (redir config) + run: | + status=$(curl -sSo /dev/null -w %{http_code} -I -X GET -H "Host: modsectest1" "http://localhost/?q=1") + if [ "${status}" == "200" ]; then + echo "OK" + else + echo "FAIL" + exit 1 + fi + - name: Run attack test vhost 2 (redir config) + run: | + status=$(curl -sSo /dev/null -w %{http_code} -I -X GET -H "Host: modsectest2" "http://localhost/?q=attack") + if [ "${status}" == "403" ]; then + echo "OK" + else + echo "FAIL" + exit 1 + fi + - name: Run non-attack test vhost 2 (redir config) + run: | + status=$(curl -sSo /dev/null -w %{http_code} -I -X GET -H "Host: modsectest2" "http://localhost/?q=1") + if [ "${status}" == "200" ]; then + echo "OK" + else + echo "FAIL" + exit 1 + fi + - name: Run file consistency check 1 (redir config) + run: | + curl -sS "http://localhost/data50k.json" --output data50k.json + if [ -f data50k.json ]; then + diff data50k.json /usr/local/nginx/html/data50k.json > /dev/null + if [ $? -eq 0 ]; then + ls -l data50k.json /usr/local/nginx/html/data50k.json + echo "OK" + else + echo "FAIL" + exit 2 + fi + else + echo "FAIL" + exit 1 + fi + - name: Run file consistency check 2 (redir config) + run: | + curl -sS "http://localhost/plugged.png" --output plugged.png + if [ -f plugged.png ]; then + diff plugged.png /usr/local/nginx/html/plugged.png > /dev/null + if [ $? -eq 0 ]; then + ls -l plugged.png /usr/local/nginx/html/plugged.png + echo "OK" + else + echo "FAIL" + exit 2 + fi + else + echo "FAIL" + exit 1 + fi + + + build-windows: + runs-on: windows-2022 + defaults: + run: + shell: msys2 {0} + steps: + - name: Set up MSVC + uses: ilammy/msvc-dev-cmd@v1 + - name: Set up msys + uses: msys2/setup-msys2@v2 + with: + msystem: UCRT64 + path-type: inherit + - name: Get Nginx source + uses: actions/checkout@v4 + with: + repository: nginx/nginx + path: nginx + fetch-depth: 1 + - name: Get Nginx tests + uses: actions/checkout@v4 + with: + repository: nginx/nginx-tests + path: nginx/test + fetch-depth: 1 + - name: Set up third-party libraries + working-directory: nginx + run: | + mkdir objs + mkdir objs/lib + cd objs/lib + wget -q -O - https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.39/pcre2-10.39.tar.gz | tar -xzf - + wget -q -O - https://www.zlib.net/fossils/zlib-1.3.tar.gz | tar -xzf - + wget -q -O - https://www.openssl.org/source/openssl-3.0.13.tar.gz | tar -xzf - + - name: Get libModSecurity source + uses: actions/checkout@v4 + with: + repository: owasp-modsecurity/ModSecurity + submodules: true + path: nginx/objs/lib/ModSecurity + fetch-depth: 1 + - name: Setup Conan + shell: cmd + run: | + pip3 install conan --upgrade + conan profile detect + - name: Build libModSecurity + working-directory: nginx/objs/lib/ModSecurity + shell: cmd + run: | + vcbuild.bat + - name: Get ModSecurity-nginx source code + uses: actions/checkout@v4 + with: + path: nginx/objs/lib/ModSecurity-nginx + - name: Copy ModSecurity-nginx tests to nginx/test + working-directory: nginx/test + run: | + cp ../objs/lib/ModSecurity-nginx/tests/* . + - name: Remove /usr/bin/link conflicting with MSVC link.exe + run: | + set -ex + which link + rm /usr/bin/link + - name: Build nginx w/ModSecurity-nginx module + working-directory: nginx + run: | + : # Windows native version of Perl is required by nginx build + export PATH=/c/Strawberry/perl/bin:$PATH + : # Set env variables to point to libModSecurity v3 include & lib directories + export MODSECURITY_INC=objs/lib/ModSecurity/headers + export MODSECURITY_LIB=objs/lib/ModSecurity/build/win32/build/Release + : # Copy libModSecurity.dll to objs dir (to be able to run nginx later) + cp $MODSECURITY_LIB/libModSecurity.dll objs + : # Configure nginx build w/ModSecurity-nginx module + auto/configure \ + --with-cc=cl \ + --with-debug \ + --prefix= \ + --conf-path=conf/nginx.conf \ + --pid-path=logs/nginx.pid \ + --http-log-path=logs/access.log \ + --error-log-path=logs/error.log \ + --sbin-path=nginx.exe \ + --http-client-body-temp-path=temp/client_body_temp \ + --http-proxy-temp-path=temp/proxy_temp \ + --http-fastcgi-temp-path=temp/fastcgi_temp \ + --http-scgi-temp-path=temp/scgi_temp \ + --http-uwsgi-temp-path=temp/uwsgi_temp \ + --with-cc-opt=-DFD_SETSIZE=1024 \ + --with-pcre=objs/lib/pcre2-10.39 \ + --with-zlib=objs/lib/zlib-1.3 \ + --with-openssl=objs/lib/openssl-3.0.13 \ + --with-openssl-opt=no-asm \ + --with-http_ssl_module \ + --with-http_v2_module \ + --with-http_auth_request_module \ + --add-module=objs/lib/ModSecurity-nginx + nmake + - name: Run ModSecurity-nginx tests + working-directory: nginx/test + shell: cmd # tests need to run on a "windows" shell + run: | + md temp + set TEMP=temp + set TEST_NGINX_BINARY=..\objs\nginx.exe + prove modsecurity*.t \ No newline at end of file diff --git a/CHANGES b/CHANGES index 560c589..f4a6377 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,11 @@ +v1.0.3 - 2022-May-24 +-------------------- + + - Support http protocol versions besides 0.9, 1.0, 1.1, 2.0 + [Issue #224 - @HQuest, @martinhsv] + - Support for building with nginx configured with PCRE2 + [Issue #260 - @defanator] + v1.0.2 - 2021-Jun-02 -------------------- diff --git a/README.md b/README.md index 2026d53..d638a0c 100644 --- a/README.md +++ b/README.md @@ -39,8 +39,7 @@ Or, to build a dynamic module: Note that when building a dynamic module, your nginx source version needs to match the version of nginx you're compiling this for. -Further information about nginx third-party add-ons support are available here: -http://wiki.nginx.org/3rdPartyModules +Further information about nginx third-party add-ons support are available [here](https://www.f5.com/company/blog/nginx/compiling-dynamic-modules-nginx-plus). # Usage diff --git a/config b/config index c6e7467..0f05253 100644 --- a/config +++ b/config @@ -10,9 +10,10 @@ ngx_feature_name= ngx_feature_run=no -ngx_feature_incs="#include <modsecurity/modsecurity.h>" +ngx_feature_incs="#include <modsecurity/modsecurity.h> +#include <stdio.h>" ngx_feature_libs="-lmodsecurity" -ngx_feature_test='printf("hello");' +ngx_feature_test='msc_init();' ngx_modsecurity_opt_I= ngx_modsecurity_opt_L= @@ -31,12 +32,18 @@ if [ -n "$MODSECURITY_INC" -o -n "$MODSECURITY_LIB" ]; then ngx_modsecurity_opt_I="-I$MODSECURITY_INC" ngx_modsecurity_opt_L="-L$MODSECURITY_LIB $YAJL_EXTRA" - if [ $NGX_RPATH = YES ]; then - ngx_feature_libs="-R$MODSECURITY_LIB -L$MODSECURITY_LIB -lmodsecurity $YAJL_EXTRA" - elif [ "$NGX_IGNORE_RPATH" != "YES" -a $NGX_SYSTEM = "Linux" ]; then - ngx_feature_libs="-Wl,-rpath,$MODSECURITY_LIB -L$MODSECURITY_LIB -lmodsecurity $YAJL_EXTRA" + if [ "$NGX_CC_NAME" != msvc ]; then + if [ $NGX_RPATH = YES ]; then + ngx_feature_libs="-R$MODSECURITY_LIB -L$MODSECURITY_LIB -lmodsecurity $YAJL_EXTRA" + elif [ "$NGX_IGNORE_RPATH" != "YES" -a $NGX_SYSTEM = "Linux" ]; then + ngx_feature_libs="-Wl,-rpath,$MODSECURITY_LIB -L$MODSECURITY_LIB -lmodsecurity $YAJL_EXTRA" + else + ngx_feature_libs="-L$MODSECURITY_LIB -lmodsecurity $YAJL_EXTRA" + fi else - ngx_feature_libs="-L$MODSECURITY_LIB -lmodsecurity $YAJL_EXTRA" + # Adjust link library arguments to work with MSVC C++ compiler and + # output of the Windows port of libModSecurity v3 + ngx_feature_libs="$MODSECURITY_LIB/libModSecurity.lib $YAJL_EXTRA" fi . auto/feature diff --git a/src/ngx_http_modsecurity_body_filter.c b/src/ngx_http_modsecurity_body_filter.c index 725f986..0c28e3c 100644 --- a/src/ngx_http_modsecurity_body_filter.c +++ b/src/ngx_http_modsecurity_body_filter.c @@ -13,6 +13,8 @@ * */ +#include <ngx_config.h> + #ifndef MODSECURITY_DDEBUG #define MODSECURITY_DDEBUG 0 #endif @@ -48,7 +50,7 @@ ngx_http_modsecurity_body_filter(ngx_http_request_t *r, ngx_chain_t *in) return ngx_http_next_body_filter(r, in); } - ctx = ngx_http_get_module_ctx(r, ngx_http_modsecurity_module); + ctx = ngx_http_modsecurity_get_module_ctx(r); dd("body filter, recovering ctx: %p", ctx); diff --git a/src/ngx_http_modsecurity_common.h b/src/ngx_http_modsecurity_common.h index 60218c4..cde48a5 100644 --- a/src/ngx_http_modsecurity_common.h +++ b/src/ngx_http_modsecurity_common.h @@ -56,7 +56,7 @@ #define MODSECURITY_NGINX_MAJOR "1" #define MODSECURITY_NGINX_MINOR "0" -#define MODSECURITY_NGINX_PATCHLEVEL "2" +#define MODSECURITY_NGINX_PATCHLEVEL "3" #define MODSECURITY_NGINX_TAG "" #define MODSECURITY_NGINX_TAG_NUM "100" @@ -99,6 +99,7 @@ typedef struct { unsigned processed:1; unsigned logged:1; unsigned intervention_triggered:1; + unsigned request_body_processed:1; } ngx_http_modsecurity_ctx_t; @@ -139,9 +140,15 @@ extern ngx_module_t ngx_http_modsecurity_module; /* ngx_http_modsecurity_module.c */ int ngx_http_modsecurity_process_intervention (Transaction *transaction, ngx_http_request_t *r, ngx_int_t early_log); ngx_http_modsecurity_ctx_t *ngx_http_modsecurity_create_ctx(ngx_http_request_t *r); +ngx_http_modsecurity_ctx_t *ngx_http_modsecurity_get_module_ctx(ngx_http_request_t *r); char *ngx_str_to_char(ngx_str_t a, ngx_pool_t *p); +#if (NGX_PCRE2) +#define ngx_http_modsecurity_pcre_malloc_init(x) NULL +#define ngx_http_modsecurity_pcre_malloc_done(x) (void)x +#else ngx_pool_t *ngx_http_modsecurity_pcre_malloc_init(ngx_pool_t *pool); void ngx_http_modsecurity_pcre_malloc_done(ngx_pool_t *old_pool); +#endif /* ngx_http_modsecurity_body_filter.c */ ngx_int_t ngx_http_modsecurity_body_filter_init(void); diff --git a/src/ngx_http_modsecurity_header_filter.c b/src/ngx_http_modsecurity_header_filter.c index c36be19..03b8764 100644 --- a/src/ngx_http_modsecurity_header_filter.c +++ b/src/ngx_http_modsecurity_header_filter.c @@ -13,6 +13,8 @@ * */ +#include <ngx_config.h> + #ifndef MODSECURITY_DDEBUG #define MODSECURITY_DDEBUG 0 #endif @@ -107,7 +109,7 @@ ngx_http_modsecurity_store_ctx_header(ngx_http_request_t *r, ngx_str_t *name, ng ngx_http_modsecurity_conf_t *mcf; ngx_http_modsecurity_header_t *hdr; - ctx = ngx_http_get_module_ctx(r, ngx_http_modsecurity_module); + ctx = ngx_http_modsecurity_get_module_ctx(r); if (ctx == NULL || ctx->sanity_headers_out == NULL) { return NGX_ERROR; } @@ -150,7 +152,7 @@ ngx_http_modsecurity_resolv_header_server(ngx_http_request_t *r, ngx_str_t name, ngx_str_t value; clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - ctx = ngx_http_get_module_ctx(r, ngx_http_modsecurity_module); + ctx = ngx_http_modsecurity_get_module_ctx(r); if (r->headers_out.server == NULL) { if (clcf->server_tokens) { @@ -184,7 +186,7 @@ ngx_http_modsecurity_resolv_header_date(ngx_http_request_t *r, ngx_str_t name, o ngx_http_modsecurity_ctx_t *ctx = NULL; ngx_str_t date; - ctx = ngx_http_get_module_ctx(r, ngx_http_modsecurity_module); + ctx = ngx_http_modsecurity_get_module_ctx(r); if (r->headers_out.date == NULL) { date.data = ngx_cached_http_time.data; @@ -214,7 +216,7 @@ ngx_http_modsecurity_resolv_header_content_length(ngx_http_request_t *r, ngx_str ngx_str_t value; char buf[NGX_INT64_LEN+2]; - ctx = ngx_http_get_module_ctx(r, ngx_http_modsecurity_module); + ctx = ngx_http_modsecurity_get_module_ctx(r); if (r->headers_out.content_length_n > 0) { @@ -241,7 +243,7 @@ ngx_http_modsecurity_resolv_header_content_type(ngx_http_request_t *r, ngx_str_t { ngx_http_modsecurity_ctx_t *ctx = NULL; - ctx = ngx_http_get_module_ctx(r, ngx_http_modsecurity_module); + ctx = ngx_http_modsecurity_get_module_ctx(r); if (r->headers_out.content_type.len > 0) { @@ -268,7 +270,7 @@ ngx_http_modsecurity_resolv_header_last_modified(ngx_http_request_t *r, ngx_str_ u_char buf[1024], *p; ngx_str_t value; - ctx = ngx_http_get_module_ctx(r, ngx_http_modsecurity_module); + ctx = ngx_http_modsecurity_get_module_ctx(r); if (r->headers_out.last_modified_time == -1) { return 1; @@ -300,7 +302,7 @@ ngx_http_modsecurity_resolv_header_connection(ngx_http_request_t *r, ngx_str_t n ngx_str_t value; clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - ctx = ngx_http_get_module_ctx(r, ngx_http_modsecurity_module); + ctx = ngx_http_modsecurity_get_module_ctx(r); if (r->headers_out.status == NGX_HTTP_SWITCHING_PROTOCOLS) { connection = "upgrade"; @@ -351,7 +353,7 @@ ngx_http_modsecurity_resolv_header_transfer_encoding(ngx_http_request_t *r, ngx_ if (r->chunked) { ngx_str_t value = ngx_string("chunked"); - ctx = ngx_http_get_module_ctx(r, ngx_http_modsecurity_module); + ctx = ngx_http_modsecurity_get_module_ctx(r); #if defined(MODSECURITY_SANITY_CHECKS) && (MODSECURITY_SANITY_CHECKS) ngx_http_modsecurity_store_ctx_header(r, &name, &value); @@ -378,7 +380,7 @@ ngx_http_modsecurity_resolv_header_vary(ngx_http_request_t *r, ngx_str_t name, o if (r->gzip_vary && clcf->gzip_vary) { ngx_str_t value = ngx_string("Accept-Encoding"); - ctx = ngx_http_get_module_ctx(r, ngx_http_modsecurity_module); + ctx = ngx_http_modsecurity_get_module_ctx(r); #if defined(MODSECURITY_SANITY_CHECKS) && (MODSECURITY_SANITY_CHECKS) ngx_http_modsecurity_store_ctx_header(r, &name, &value); @@ -420,7 +422,7 @@ ngx_http_modsecurity_header_filter(ngx_http_request_t *r) /* XXX: if NOT_MODIFIED, do we need to process it at all? see xslt_header_filter() */ - ctx = ngx_http_get_module_ctx(r, ngx_http_modsecurity_module); + ctx = ngx_http_modsecurity_get_module_ctx(r); dd("header filter, recovering ctx: %p", ctx); diff --git a/src/ngx_http_modsecurity_log.c b/src/ngx_http_modsecurity_log.c index d713a65..094685c 100644 --- a/src/ngx_http_modsecurity_log.c +++ b/src/ngx_http_modsecurity_log.c @@ -13,6 +13,8 @@ * */ +#include <ngx_config.h> + #ifndef MODSECURITY_DDEBUG #define MODSECURITY_DDEBUG 0 #endif @@ -39,17 +41,9 @@ ngx_http_modsecurity_log_handler(ngx_http_request_t *r) { ngx_pool_t *old_pool; ngx_http_modsecurity_ctx_t *ctx; - ngx_http_modsecurity_conf_t *mcf; dd("catching a new _log_ phase handler"); - mcf = ngx_http_get_module_loc_conf(r, ngx_http_modsecurity_module); - if (mcf == NULL || mcf->enable != 1) - { - dd("ModSecurity not enabled... returning"); - return NGX_OK; - } - /* if (r->method != NGX_HTTP_GET && r->method != NGX_HTTP_POST && r->method != NGX_HTTP_HEAD) { @@ -58,13 +52,13 @@ ngx_http_modsecurity_log_handler(ngx_http_request_t *r) return NGX_OK; } */ - ctx = ngx_http_get_module_ctx(r, ngx_http_modsecurity_module); + ctx = ngx_http_modsecurity_get_module_ctx(r); dd("recovering ctx: %p", ctx); if (ctx == NULL) { - dd("something really bad happened here. returning NGX_ERROR"); - return NGX_ERROR; + dd("ModSecurity not enabled or error occurred"); + return NGX_OK; } if (ctx->logged) { diff --git a/src/ngx_http_modsecurity_module.c b/src/ngx_http_modsecurity_module.c index b6f33f5..e8a5f4b 100644 --- a/src/ngx_http_modsecurity_module.c +++ b/src/ngx_http_modsecurity_module.c @@ -13,6 +13,8 @@ * */ +#include <ngx_config.h> + #ifndef MODSECURITY_DDEBUG #define MODSECURITY_DDEBUG 0 #endif @@ -20,10 +22,13 @@ #include "ngx_http_modsecurity_common.h" #include "stdio.h" -#include <ngx_config.h> #include <ngx_core.h> #include <ngx_http.h> +#ifdef _MSC_VER +#define strdup _strdup +#endif + static ngx_int_t ngx_http_modsecurity_init(ngx_conf_t *cf); static void *ngx_http_modsecurity_create_main_conf(ngx_conf_t *cf); static char *ngx_http_modsecurity_init_main_conf(ngx_conf_t *cf, void *conf); @@ -38,6 +43,7 @@ static void ngx_http_modsecurity_cleanup_rules(void *data); * https://github.com/openresty/lua-nginx-module/blob/master/src/ngx_http_lua_pcrefix.c */ +#if !(NGX_PCRE2) static void *(*old_pcre_malloc)(size_t); static void (*old_pcre_free)(void *ptr); static ngx_pool_t *ngx_http_modsec_pcre_pool = NULL; @@ -103,6 +109,7 @@ ngx_http_modsecurity_pcre_malloc_done(ngx_pool_t *old_pool) pcre_free = old_pcre_free; } } +#endif /* * ngx_string's are not null-terminated in common case, so we need to convert @@ -129,7 +136,7 @@ ngx_inline char *ngx_str_to_char(ngx_str_t a, ngx_pool_t *p) } -ngx_inline int +int ngx_http_modsecurity_process_intervention (Transaction *transaction, ngx_http_request_t *r, ngx_int_t early_log) { char *log = NULL; @@ -142,7 +149,7 @@ ngx_http_modsecurity_process_intervention (Transaction *transaction, ngx_http_re dd("processing intervention"); - ctx = ngx_http_get_module_ctx(r, ngx_http_modsecurity_module); + ctx = ngx_http_modsecurity_get_module_ctx(r); if (ctx == NULL) { return NGX_HTTP_INTERNAL_SERVER_ERROR; @@ -252,7 +259,7 @@ ngx_http_modsecurity_cleanup(void *data) } -ngx_inline ngx_http_modsecurity_ctx_t * +ngx_http_modsecurity_ctx_t * ngx_http_modsecurity_create_ctx(ngx_http_request_t *r) { ngx_str_t s; @@ -306,6 +313,27 @@ ngx_http_modsecurity_create_ctx(ngx_http_request_t *r) return ctx; } +ngx_inline ngx_http_modsecurity_ctx_t * +ngx_http_modsecurity_get_module_ctx(ngx_http_request_t *r) +{ + ngx_http_modsecurity_ctx_t *ctx; + ctx = ngx_http_get_module_ctx(r, ngx_http_modsecurity_module); + if (ctx == NULL) { + /* + * refer <nginx>/src/http/modules/ngx_http_realip_module.c + * if module context was reset, the original address + * can still be found in the cleanup handler + */ + ngx_pool_cleanup_t *cln; + for (cln = r->pool->cleanup; cln; cln = cln->next) { + if (cln->handler == ngx_http_modsecurity_cleanup) { + ctx = cln->data; + break; + } + } + } + return ctx; +} char * ngx_conf_set_rules(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) @@ -659,6 +687,9 @@ ngx_http_modsecurity_init_main_conf(ngx_conf_t *cf, void *conf) "%s (rules loaded inline/local/remote: %ui/%ui/%ui)", MODSECURITY_NGINX_WHOAMI, mmcf->rules_inline, mmcf->rules_file, mmcf->rules_remote); + ngx_log_error(NGX_LOG_NOTICE, cf->log, 0, + "libmodsecurity3 version %s.%s.%s", + MODSECURITY_MAJOR, MODSECURITY_MINOR, MODSECURITY_PATCHLEVEL); return NGX_CONF_OK; } diff --git a/src/ngx_http_modsecurity_pre_access.c b/src/ngx_http_modsecurity_pre_access.c index abb7d3e..75ac45d 100644 --- a/src/ngx_http_modsecurity_pre_access.c +++ b/src/ngx_http_modsecurity_pre_access.c @@ -13,6 +13,8 @@ * */ +#include <ngx_config.h> + #ifndef MODSECURITY_DDEBUG #define MODSECURITY_DDEBUG 0 #endif @@ -25,7 +27,7 @@ ngx_http_modsecurity_request_read(ngx_http_request_t *r) { ngx_http_modsecurity_ctx_t *ctx; - ctx = ngx_http_get_module_ctx(r, ngx_http_modsecurity_module); + ctx = ngx_http_modsecurity_get_module_ctx(r); #if defined(nginx_version) && nginx_version >= 8011 r->main->count--; @@ -68,7 +70,7 @@ ngx_http_modsecurity_pre_access_handler(ngx_http_request_t *r) } */ - ctx = ngx_http_get_module_ctx(r, ngx_http_modsecurity_module); + ctx = ngx_http_modsecurity_get_module_ctx(r); dd("recovering ctx: %p", ctx); @@ -78,6 +80,11 @@ ngx_http_modsecurity_pre_access_handler(ngx_http_request_t *r) return NGX_HTTP_INTERNAL_SERVER_ERROR; } + if (ctx->request_body_processed) { + // should we use r->internal or r->filter_finalize? + return NGX_DECLINED; + } + if (ctx->intervention_triggered) { return NGX_DECLINED; } @@ -210,6 +217,7 @@ ngx_http_modsecurity_pre_access_handler(ngx_http_request_t *r) old_pool = ngx_http_modsecurity_pcre_malloc_init(r->pool); msc_process_request_body(ctx->modsec_transaction); + ctx->request_body_processed = 1; ngx_http_modsecurity_pcre_malloc_done(old_pool); ret = ngx_http_modsecurity_process_intervention(ctx->modsec_transaction, r, 0); diff --git a/src/ngx_http_modsecurity_rewrite.c b/src/ngx_http_modsecurity_rewrite.c index f6f8d41..ebc4742 100644 --- a/src/ngx_http_modsecurity_rewrite.c +++ b/src/ngx_http_modsecurity_rewrite.c @@ -13,6 +13,8 @@ * */ +#include <ngx_config.h> + #ifndef MODSECURITY_DDEBUG #define MODSECURITY_DDEBUG 0 #endif @@ -44,7 +46,7 @@ ngx_http_modsecurity_rewrite_handler(ngx_http_request_t *r) dd("catching a new _rewrite_ phase handler"); - ctx = ngx_http_get_module_ctx(r, ngx_http_modsecurity_module); + ctx = ngx_http_modsecurity_get_module_ctx(r); dd("recovering ctx: %p", ctx); @@ -84,6 +86,45 @@ ngx_http_modsecurity_rewrite_handler(ngx_http_request_t *r) return NGX_HTTP_INTERNAL_SERVER_ERROR; } +#if defined(MODSECURITY_CHECK_VERSION) +#if MODSECURITY_VERSION_NUM >= 30130100 + ngx_str_t hostname; + hostname.len = 0; + // first check if Nginx received a Host header and it's usable + // (i.e. not empty) + // if yes, we can use that + if (r->headers_in.server.len > 0) { + hostname.len = r->headers_in.server.len; + hostname.data = r->headers_in.server.data; + } + else { + // otherwise we try to use the server config, namely the + // server_name $SERVER_NAME + // directive + // for eg. in default config, server_name is "_" + // possible all requests without a Host header will be + // handled by this server block + ngx_http_core_srv_conf_t *cscf; + cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); + if (cscf->server_name.len > 0) { + hostname.len = cscf->server_name.len; + hostname.data = cscf->server_name.data; + } + } + if (hostname.len > 0) { + const char *host_name = ngx_str_to_char(hostname, r->pool); + if (host_name == (char*)-1 || host_name == NULL) { + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + else { + // set the hostname in the transaction + // this function is only available in ModSecurity 3.0.13 and later + msc_set_request_hostname(ctx->modsec_transaction, (const unsigned char *)host_name); + } + } +#endif +#endif + ngx_str_t s; u_char addr[NGX_SOCKADDR_STRLEN]; s.len = NGX_SOCKADDR_STRLEN; @@ -138,7 +179,15 @@ ngx_http_modsecurity_rewrite_handler(ngx_http_request_t *r) break; #endif default : - http_version = "1.0"; + http_version = ngx_str_to_char(r->http_protocol, r->pool); + if (http_version == (char*)-1) { + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + if ((http_version != NULL) && (strlen(http_version) > 5) && (!strncmp("HTTP/", http_version, 5))) { + http_version += 5; + } else { + http_version = "1.0"; + } break; } diff --git a/win32/README.md b/win32/README.md new file mode 100644 index 0000000..ccfaff4 --- /dev/null +++ b/win32/README.md @@ -0,0 +1,195 @@ +# ModSecurity-nginx Windows build information <!-- omit from toc --> + +## Contents <!-- omit from toc --> + +- [References](#references) +- [Prerequisites](#prerequisites) +- [Build](#build) + - [Docker container](#docker-container) +- [Tests](#tests) +- [Miscellaneous](#miscellaneous) + +## References + + * [Building nginx on the Win32 platform with Visual C](https://nginx.org/en/docs/howto_build_on_win32.html) + * [libModSecurity Windows build information](https://github.com/owasp-modsecurity/ModSecurity/blob/v3/master/build/win32/README.md) + * [ModSecurity-nginx - Compilation](https://github.com/owasp-modsecurity/ModSecurity-nginx#compilation) + +## Prerequisites + + * [Build Tools for Visual Studio 2022](https://aka.ms/vs/17/release/vs_buildtools.exe) + * Install *Desktop development with C++* workload, which includes: + * MSVC C++ compiler + * Windows SDK + * CMake + * NOTE: The build steps assume this has been installed in `C:\BuildTools`. + * [MSYS2](https://www.msys2.org/) + * For nginx build on Windows + * NOTE: The build steps assume this has been installed in `C:\msys64`. + * [Conan package manager 2.2.2](https://github.com/conan-io/conan/releases/download/2.2.2/conan-2.2.2-windows-x86_64-installer.exe) + * Required to build libModSecurity v3 on Windows. + * Install and then setup the default Conan profile to use the MSVC C++ compiler: + 1. Open a command-prompt and set the MSVC C++ compiler environment by executing: `C:\BuildTools\VC\Auxiliary\Build\vcvars64.bat` + 2. Execute: `conan profile detect --force` + * [Git for Windows 2.44.0](https://github.com/git-for-windows/git/releases/download/v2.44.0.windows.1/Git-2.44.0-64-bit.exe) + * [Strawberry Perl for Windows](https://strawberryperl.com/) + * nginx build on Windows requires a native Perl build. The one included in MSYS2 triggers the following error: + ``` + This perl implementation doesn't produce Windows like paths (with backward slash directory separators). Please use an implementation that matches your building platform. + ``` + * NOTE: The build steps assume this has been installed in `C:\Strawberry\perl`. + +## Build + + 1. Open a command prompt + 2. Set up MSVC C++ compiler environment by executing: + ```shell + C:\BuildTools\VC\Auxiliary\Build\vcvars64.bat + ``` + 3. From this command prompt, launch a `MSYS2 UCRT64 Shell` (to inherit MSVC C++ compiler environment) + ```shell + c:\msys64\ucrt64.exe + ``` + 4. Checkout nginx source code + ```shell + git clone -c advice.detachedHead=false --depth 1 https://github.com/nginx/nginx.git + cd nginx + ``` + 5. Download third-party libraries + ```shell + mkdir objs + mkdir objs/lib + cd objs/lib + + echo Downloading PCRE2 + wget -q -O - https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.39/pcre2-10.39.tar.gz | tar -xzf - + + echo Downloading zlib + wget -q -O - https://www.zlib.net/fossils/zlib-1.3.tar.gz | tar -xzf - + + echo Downloading OpenSSL + wget -q -O - https://www.openssl.org/source/openssl-3.0.13.tar.gz | tar -xzf - + ``` + 6. Checkout and build libModSecurity v3 + * For more information on libModSecurity v3 build options, see [libModSecurity Windows build information](https://github.com/owasp-modsecurity/ModSecurity/blob/v3/master/build/win32/README.md). + ```shell + git clone -c advice.detachedHead=false --depth 1 https://github.com/owasp-modsecurity/ModSecurity.git + + cd ModSecurity + + git submodule init + git submodule update + + vcbuild.bat + + cd .. + ``` + 7. Checkout ModSecurity-nginx + ```shell + git clone -c advice.detachedHead=false --depth 1 https://github.com/owasp-modsecurity/ModSecurity-nginx.git + + cd ../.. + ``` + 8. Setup environment variables for nginx build + ```shell + # remove (or move) /usr/bin/link conflicting with MSVC link.exe + rm /usr/bin/link + + # nginx build on windows requires a native perl build (see prerequisites) + export PATH=/c/Strawberry/perl/bin:$PATH + # avoid perl 'Setting locale failed.' warnings + export LC_ALL=C + + # provide location of libModsecurity headers & libraries for + # the ModSecurity-nginx module build + export MODSECURITY_INC=objs/lib/ModSecurity/headers + export MODSECURITY_LIB=objs/lib/ModSecurity/build/win32/build/Release + ``` + 9. Configure nginx build + ```shell + auto/configure \ + --with-cc=cl \ + --with-debug \ + --prefix= \ + --conf-path=conf/nginx.conf \ + --pid-path=logs/nginx.pid \ + --http-log-path=logs/access.log \ + --error-log-path=logs/error.log \ + --sbin-path=nginx.exe \ + --http-client-body-temp-path=temp/client_body_temp \ + --http-proxy-temp-path=temp/proxy_temp \ + --http-fastcgi-temp-path=temp/fastcgi_temp \ + --http-scgi-temp-path=temp/scgi_temp \ + --http-uwsgi-temp-path=temp/uwsgi_temp \ + --with-cc-opt=-DFD_SETSIZE=1024 \ + --with-pcre=objs/lib/pcre2-10.39 \ + --with-zlib=objs/lib/zlib-1.3 \ + --with-openssl=objs/lib/openssl-3.0.13 \ + --with-openssl-opt=no-asm \ + --with-http_ssl_module \ + --with-http_v2_module \ + --with-http_auth_request_module \ + --add-module=objs/lib/ModSecurity-nginx + ``` + 10. Build nginx + ```shell + nmake + ``` + +### Docker container + +A `Dockerfile` configuration file is provided in the `docker` subdir that creates a Windows container image which installs the [prerequisites](#prerequisites) and builds libModSecurity v3 and nginx w/ModSecurity-nginx. + +NOTE: Windows containers are supported in Docker Desktop for Windows, using the *Switch to Windows containers...* option on the context menu of the system tray icon. + +To build the docker image, execute the following command (from the `win32\docker` directory): + + * `docker build -t modsecurity_nginx:latest -m 4GB .` + +Once the image is generated, the built binaries are located in the `C:\src\nginx\objs` directory. + +To extract the built binaries from the image, you can execute the following commands: + + * `docker container create --name [container_name] modsecurity_nginx` + * `docker cp [container_name]:C:\src\nginx\objs\nginx.exe .` + * `docker cp [container_name]:C:\src\nginx\objs\libModSecurity.dll .` + +Additionally, the image can be used interactively for additional development work by executing: + + * `docker run -it modsecurity_nginx` + +## Tests + +In order to validate the nginx w/ModSecurity-nginx binary it's recommended that you set up and run ModSecurity-nginx tests following these steps: + + 1. Open a command prompt and go to the directory where `nginx` was built. + 2. Clone nginx-tests + ```shell + git clone -c advice.detachedHead=false --depth 1 https://github.com/nginx/nginx-tests.git test + ``` + 3. Copy `libModSecurity.dll` to the directory where `nginx.exe` is located. + ```shell + cd objs + copy objs\lib\ModSecurity\build\win32\Release\build\libModSecurity.dll + ``` + 4. Copy ModSecurity-nginx tests to the nginx tests directory. + ```shell + cd ..\test + copy ..\objs\lib\ModSecurity-nginx\tests\*.* + ``` + 5. Run ModSecurity-nginx tests + ```shell + set TEST_NGINX_BINARY=..\objs\nginx.exe + prove modsecurity*.t + ``` + +NOTES + + * `TEST_NGINX_BINARY` requires path with backslashes. nginx won't work with path with slashes. + * The tests generate nginx configuration and associated files (such as log files) on the temp directory indicated by the `TEMP` environment variable. nginx won't work if the path contains spaces or short path names with the `~` character. You may need to set the `TEMP` environment variable to a path that respects these limitations (such as `C:\TEMP`). + +## Miscellaneous + +The ModSecurity-nginx connector is built as a static nginx module. It looks as if there's currently no support for dynamic modules on nginx for Windows using MSVC. + +It may be possible to cross-compile for Windows using gcc/clang, which may enable building using dynamic modules too. \ No newline at end of file diff --git a/win32/docker/Dockerfile b/win32/docker/Dockerfile new file mode 100644 index 0000000..936519a --- /dev/null +++ b/win32/docker/Dockerfile @@ -0,0 +1,161 @@ +# escape=` + +# References +# +# * Building nginx on the Win32 platform with Visual C +# * https://nginx.org/en/docs/howto_build_on_win32.html +# * libModSecurity Windows build information +# * https://github.com/eduar-hte/ModSecurity/blob/windows-port/build/win32/README.md +# * ModSecurity-nginx - Compilation +# * https://github.com/owasp-modsecurity/ModSecurity-nginx#compilation + +ARG FROM_IMAGE=mcr.microsoft.com/windows/servercore:ltsc2022 +FROM ${FROM_IMAGE} + +# reset the shell. +SHELL ["cmd", "/S", "/C"] + +# set up environment to collect install errors. +COPY InstallBuildTools.cmd C:\TEMP\ +ADD https://aka.ms/vscollect.exe C:\TEMP\collect.exe + +# download channel for fixed install. +ARG CHANNEL_URL=https://aka.ms/vs/17/release/channel +ADD ${CHANNEL_URL} C:\TEMP\VisualStudio.chman + +# download and install Build Tools for Visual Studio 2022 for native desktop workload. +ADD https://aka.ms/vs/17/release/vs_buildtools.exe C:\TEMP\vs_buildtools.exe +RUN C:\TEMP\InstallBuildTools.cmd C:\TEMP\vs_buildtools.exe --quiet --wait --norestart --nocache ` + --channelUri C:\TEMP\VisualStudio.chman ` + --installChannelUri C:\TEMP\VisualStudio.chman ` + --add Microsoft.VisualStudio.Workload.VCTools ` + --includeRecommended ` + --installPath C:\BuildTools + +# download & install git +ARG GIT_VERSION=2.44.0 +ARG GIT_BINARY=Git-${GIT_VERSION}-64-bit.exe +ARG GIT_URL=https://github.com/git-for-windows/git/releases/download/v${GIT_VERSION}.windows.1/${GIT_BINARY} + +COPY git.inf C:\TEMP\ +ARG INSTALLER=C:\TEMP\${GIT_BINARY} +ADD ${GIT_URL} ${INSTALLER} +RUN %INSTALLER% /SP- /VERYSILENT /SUPPRESSMSGBOXES /NOCANCEL ` + /NORESTART /CLOSEAPPLICATIONS /RESTARTAPPLICATIONS /LOADINF=git.inf + +# download & setup conan (for libModSecurity build) +ARG CONAN_VERSION=2.2.2 +ARG CONAN_BINARY=conan-${CONAN_VERSION}-windows-x86_64-installer.exe +ARG CONAN_URL=https://github.com/conan-io/conan/releases/download/${CONAN_VERSION}/${CONAN_BINARY} + +ARG INSTALLER=C:\TEMP\${CONAN_BINARY} +ADD ${CONAN_URL} ${INSTALLER} +RUN %INSTALLER% /SP- /VERYSILENT /SUPPRESSMSGBOXES + +# setup conan profile +RUN C:\BuildTools\VC\Auxiliary\Build\vcvars64.bat && conan profile detect --force + +# download & setup Strawberry Perl (nginx requires a native Windows perl version to build) +ARG PERL_VERSION=5.38.2.2 +ARG PERL_BINARY=strawberry-perl-${PERL_VERSION}-64bit.msi +ARG PERL_URL=https://github.com/StrawberryPerl/Perl-Dist-Strawberry/releases/download/SP_53822_64bit/${PERL_BINARY} + +ARG INSTALLER=C:\TEMP\${PERL_BINARY} +ADD ${PERL_URL} ${INSTALLER} +RUN msiexec /i %INSTALLER% /quiet /qn /norestart + +# msys2 (to build nginx) +# +# References +# +# * Using MSYS2 in CI +# * https://www.msys2.org/docs/ci/ + +SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"] + +RUN [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; ` + Invoke-WebRequest -UseBasicParsing -uri "https://github.com/msys2/msys2-installer/releases/download/nightly-x86_64/msys2-base-x86_64-latest.sfx.exe" -OutFile msys2.exe; ` + .\msys2.exe -y -oC:\; ` + Remove-Item msys2.exe ; ` + function msys() { C:\msys64\usr\bin\bash.exe @('-lc') + @Args; } ` + msys ' '; ` + msys 'pacman --noconfirm -Syuu'; ` + msys 'pacman --noconfirm -Syuu'; ` + msys 'pacman --noconfirm -Scc'; + +# revert back to the default shell (cmd.exe) +SHELL ["cmd", "/S", "/C"] + +# create src dir +ARG SRC_DIR=C:\src + +WORKDIR C:\ +RUN cmd.exe /C md %SRC_DIR% + +WORKDIR ${SRC_DIR} + +# nginx +# + +RUN git clone -c advice.detachedHead=false --depth 1 https://github.com/nginx/nginx.git + +ARG NGINX_DIR=${SRC_DIR}\nginx +WORKDIR ${NGINX_DIR} + +# nginx/tests +RUN git clone -c advice.detachedHead=false --depth 1 https://github.com/nginx/nginx-tests.git test + +ARG NGINX_LIBS_DIR=${NGINX_DIR}\objs\lib + +# libModSecurity +# + +WORKDIR ${NGINX_LIBS_DIR} + +ARG MOD_SECURITY_TAG=v3/master +RUN git clone -c advice.detachedHead=false --depth 1 https://github.com/owasp-modsecurity/ModSecurity.git + +ARG MOD_SECURITY_DIR=${NGINX_LIBS_DIR}\ModSecurity +WORKDIR ${MOD_SECURITY_DIR} + +# fetch submodules (bindings/python, others/libinjection, test/test-cases/secrules-language-tests) +RUN git submodule init +RUN git submodule update + +# build +RUN C:\BuildTools\VC\Auxiliary\Build\vcvars64.bat && vcbuild.bat + +RUN cmd.exe /C copy build\win32\build\Release\libModSecurity.dll ..\.. + +# ModSecurity-nginx +# + +WORKDIR ${NGINX_LIBS_DIR} + +ARG MOD_SECURITY_NGINX_TAG=master +RUN git clone -c advice.detachedHead=false --depth 1 --branch %MOD_SECURITY_NGINX_TAG% https://github.com/owasp-modsecurity/ModSecurity-nginx.git + +RUN cmd.exe /C copy ModSecurity-nginx\tests\*.* ..\..\test + +# nginx w/ModSecurity-nginx +# + +WORKDIR ${NGINX_DIR} + +COPY build-nginx.sh ${NGINX_DIR} +COPY build-nginx-bootstrap.bat ${NGINX_DIR} + +RUN cmd.exe /C build-nginx-bootstrap.bat + +# execute ModSecurity-nginx tests +WORKDIR ${NGINX_DIR}\test + +RUN set TEST_NGINX_BINARY=..\objs\nginx.exe && prove modsecurity*.t + +# setup container's entrypoint +# + +WORKDIR ${NGINX_DIR} + +# Use developer command prompt and start PowerShell if no other command specified. +ENTRYPOINT ["C:\\BuildTools\\VC\\Auxiliary\\Build\\vcvars64.bat", "&&", "powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"] diff --git a/win32/docker/InstallBuildTools.cmd b/win32/docker/InstallBuildTools.cmd new file mode 100644 index 0000000..a0c07c7 --- /dev/null +++ b/win32/docker/InstallBuildTools.cmd @@ -0,0 +1,17 @@ +@rem Copyright (C) Microsoft Corporation. All rights reserved. +@rem Licensed under the MIT license. See LICENSE.txt in the project root for license information. + +@if not defined _echo echo off +setlocal enabledelayedexpansion + +call %* +if "%ERRORLEVEL%"=="3010" ( + exit /b 0 +) else ( + if not "%ERRORLEVEL%"=="0" ( + set ERR=%ERRORLEVEL% + call C:\TEMP\collect.exe -zip:C:\vslogs.zip + + exit /b !ERR! + ) +) diff --git a/win32/docker/build-nginx-bootstrap.bat b/win32/docker/build-nginx-bootstrap.bat new file mode 100644 index 0000000..259c7d3 --- /dev/null +++ b/win32/docker/build-nginx-bootstrap.bat @@ -0,0 +1,6 @@ +@echo off +rem Bootstrap to setup MSVC compiler environment and inherit it into bash +call "C:\BuildTools\VC\Auxiliary\Build\vcvars64.bat" +set MSYSTEM=UCRT64 +set MSYS2_PATH_TYPE=inherit +C:\msys64\usr\bin\bash.exe -lc 'cd /c/src/nginx ; ./build-nginx.sh' diff --git a/win32/docker/build-nginx.sh b/win32/docker/build-nginx.sh new file mode 100644 index 0000000..88b97f3 --- /dev/null +++ b/win32/docker/build-nginx.sh @@ -0,0 +1,51 @@ +#!/bin/sh + +cd objs/lib + +echo Downloading PCRE2 +wget -q -O - https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.39/pcre2-10.39.tar.gz | tar -xzf - + +echo Downloading zlib +wget -q -O - https://www.zlib.net/fossils/zlib-1.3.tar.gz | tar -xzf - + +echo Downloading OpenSSL +wget -q -O - https://www.openssl.org/source/openssl-3.0.13.tar.gz | tar -xzf - + +cd ../.. + +# remove /usr/bin/link conflicting with MSVC link.exe +rm /usr/bin/link + +# nginx build on windows requires a native perl build +export PATH=/c/Strawberry/perl/bin:$PATH +# avoid perl 'Setting locale failed.' warnings +export LC_ALL=C + +export MODSECURITY_INC=objs/lib/ModSecurity/headers +export MODSECURITY_LIB=objs/lib/ModSecurity/build/win32/build/Release + +auto/configure \ + --with-cc=cl \ + --with-debug \ + --prefix= \ + --conf-path=conf/nginx.conf \ + --pid-path=logs/nginx.pid \ + --http-log-path=logs/access.log \ + --error-log-path=logs/error.log \ + --sbin-path=nginx.exe \ + --http-client-body-temp-path=temp/client_body_temp \ + --http-proxy-temp-path=temp/proxy_temp \ + --http-fastcgi-temp-path=temp/fastcgi_temp \ + --http-scgi-temp-path=temp/scgi_temp \ + --http-uwsgi-temp-path=temp/uwsgi_temp \ + --with-cc-opt=-DFD_SETSIZE=1024 \ + --with-pcre=objs/lib/pcre2-10.39 \ + --with-zlib=objs/lib/zlib-1.3 \ + --with-openssl=objs/lib/openssl-3.0.13 \ + --with-openssl-opt=no-asm \ + --with-http_ssl_module \ + --with-http_v2_module \ + --with-http_auth_request_module \ + --add-module=objs/lib/ModSecurity-nginx + +nmake diff --git a/win32/docker/git.inf b/win32/docker/git.inf new file mode 100644 index 0000000..49781dd --- /dev/null +++ b/win32/docker/git.inf @@ -0,0 +1,20 @@ +[Setup] +Lang=default +Dir=C:\Program Files\Git +Group=Git +NoIcons=0 +SetupType=default +Components=ext,ext\shellhere,ext\guihere,gitlfs,assoc,autoupdate +Tasks= +EditorOption=VIM +CustomEditorPath= +PathOption=Cmd +SSHOption=OpenSSH +TortoiseOption=false +CURLOption=WinSSL +CRLFOption=LFOnly +BashTerminalOption=ConHost +PerformanceTweaksFSCache=Enabled +UseCredentialManager=Enabled +EnableSymlinks=Disabled +EnableBuiltinInteractiveAdd=Disabled \ No newline at end of file